Skip to content

Vue渐进式重构(二)——规范 #10

@jmx164491960

Description

@jmx164491960

传送门

渐进式重构(一)——思路

前言

旧项目主要指的是大量使用jquery操作节点为方法主要构成的项目。这些项目如果继续用原有代码使用jquery,必然会造成日后越来越难维护的问题。Vue“渐进式”重构则是解决这种问题的办法,由于Vue可以直接在原生js环境下使用,所以我们可以此去对旧项目做需求的迭代。在迭代的过程中,新增的功能,或者原有功能的修改,我们使用Vue的做法去实现,这样项目内的jq代码占比会渐渐减少,Vue渐渐增多,解决了重构和需求迭代同时进行所带来的苦恼。

基本原则

当前维护的项目大部分以Jquery搭建,考虑项目的开发效率,日后重构的便利性,和组件库生态的互通。需要尽量使用Vue去维护旧项目。

一、新需求,新页面(弹窗)

通过在旧项目使用iframe,把Vue项目链接嵌入。其中JQ页面和Vue页面iframe之间通讯规范

JQ页:在window下挂载对象,命名以"props_"开头 + vue页面命名

parent.html(JQ):


window.props_son = {
    form: {
        input: '',
        select: ''
    },
    successCallback: () => {

    },
    errorCallback: () => {

    }
}

son.vue(Vue):

<template>
    <div>
        <input v-model="props.form.input" />
        <select v-model="props.form.select"></select>
    </div>
<tamplate>

export default {
    data() {
        return {
            props: window.parent.props_son
        }
    },
    methods: {
        success() {
            this.props.successCallback();
        },
        error() {
            this.props.errorCallback();
        }
    }
}

二、新需求,旧页面

旧页面使用Jquery和Vue共存的方式,处理新的需求迭代,但并非都适合,面对需求,建议从三个方向考虑:

  • Vue实例代码和旧页面js解耦,不在同一份js中同时使用Vue和Jquery
  • 在旧页面中使用Vue,不会加重原有代码的维护难度,不会影响开发效率
  • 增加的Vue代码部分,日后重构能大部分直接复用

如果满足这三个要求,才可以使用Vue。如不满足建议采用原有方式实现

JQ和Vue共存规范

  • 原有html中新建一个节点用于挂载vue实例。
  • 原有js的目录下新建components目录,用于存放组件代码。
  • 挂载节点,组件文件,命名均以'vue_' + 组件名称
  • vue相关资源,所有项目使用同一CDN链接,以减少jq和Vue同时加载所带来的负担

例子:

login.html:

<!-- vue的挂载节点 -->
<body>
    <div class="jquery-part">
        <input />
    </div>
    <div id="vue_demo"></div>

    <button class="submit-btn">提交</button>
    
    <script src="/vue.js"></script>
    <script src="jquery.js"></script>
    <script src="login.js"></script>
</body>

pages/login.js:

import vue_demo from './components/vue_demo.js';


const vue_demo = vue_demo({
    el: '#vue_demo',
    data: {
        util: this.util
    }
});

function submit() {
    const vueFormData = vue_demo.formData;
    const jqFormData = $('.jquery-part input').val();
    // ...
}

$('.submit-btn').on('click', submit);

/pages/components/vue_demo.js:

export default function({
    el,
    data
}) {
    return new Vue({
        el,
        data() {
            return Object.assign({
                formData: {}
            }, data)
        },
        template: `<div></div>`
    })
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions