一般情况下,我们的Vue项目都是基于vue-cli新建的项目,每次有代码改动,都需要把整个项目重新打包部署。而在Vue项目之前,我们也维护一些基于jQuery的项目,这种项目在部署的时候,做到了更精细的增量,只需要更新那几个修改的文件即可。
之前介绍过,如何在JSP页面里使用Vue,让开发人员能用Vue的组件库去写JSP中比较复杂的交互。JSP写不动了,我果断在JSP中使用Vue。这种写法,只是针对比较简单的展示页会有不错的效果,而下文,将会用Sea.js引用相关模块,也加上Vue-Router等等模块,去新建一个Vue项目。
CMD与sea.js
CMD和AMD的区别就在于加载模块的时机。
AMD是先把相关的模块提前加载,写法如下:
define(['./routes/routes'], function (router) {
var app = new Vue({
el: '#app',
router: router
});
});
CMD是在有需要的时候再去加载,写法如下:
define(function (require, exports, module) {
var router = require('./routes/routes');
var app = new Vue({
el: '#app',
router: router
});
});
对于Vue组件来说,我们一般都是用CMD的方式去加载,实现按需加载,
项目创建
首先要把sea.js、vue、vue-router等文件下载到本地,在html页面中引用。然后,在这里用seajs.use方法加载app.js。
<script src="./static/sea/sea.js"></script>
<script src="./static/sea/seajs-text.js"></script>
<script src="./static/vue/vue2.6.11.js"></script>
<script src="./static/vue/vue-router.min.js"></script>
<body>
<div id="app">
<router-view></router-view>
</div>
<script type="text/javascript">
seajs.use('./app.js');
</script>
</body>
如下面的代码所示,app.js就是一个入口文件,定义好路由。
define(function (require, exports, module) {
var router = require('./routes/routes');
var app = new Vue({
el: '#app',
router: router
});
});
路由文件的定义只需要遵守sea.js的语法规范即可。注意这里加载组件使用按需加载的异步写法。
define(function(require, exports, module) {
var routes = [
{
path: "/index",
component: (resolve) => require.async(["../js/index/index.js"], function(res) {
resolve(res);
}),
meta: {
title: "首页"
}
},
{
path: "/about",
component: (resolve) => require.async(["../js/about/index.js"], function(res) {
resolve(res);
}),
meta: {
title: "关于"
}
}
];
var router = new VueRouter({
routes
});
router.beforeEach(function(to, from, next) {
/* 路由发生变化修改页面title */
if (to.meta.title) {
document.title = to.meta.title;
}
next();
});
module.exports = router;
});
这里如果用AMD规范,就需要提前把组件加载好,这样是不能实现按需加载的。
如图所示,在进入首页时,只加载了首页相关资源:
跳转到关于页面时,才会加载相关资源。
注意我们的组件,也需要用CMD的语法:
define(function(require, exports, module) {
var sTpl = require("./index.html");
module.exports = {
// 模板加载
template: sTpl,
data: function data() {
return {
msg: '关于'
};
},
methods: {
init: function init() {
console.log('初始化页面')
},
},
mounted: function mounted() {
this.init()
}
};
});
注意这里对模板文件的引用,如果用.vue文件,我们需要把模板HTML和js、css写在同一个文件里,而这里,模板文件是个字符串,直接在这个文件里面写是没有语法高亮的,因此这里我们使用require的方式引用HTML模板。
正常情况下,require一个HTML,是无法取到任何内容的。我们在入口的HTML里面,引用了seajs-text.js,这个是Sea.js的插件,让我们在用require语句引用HTML时,可以拿到这个HTML文件的字符串内容。
Demo与运行
完整Demo:github.com/beat-the-bu…
运行方式:VScode下载插件:Live Server,然后直接右键HTML文件即可:
注意事项
- ES6一些方法的兼容
引用polyfill文件
- ES6语法的编译、CSS给一些属性加上浏览器前缀
这种对文件的处理,我们一般使用gulp
总结
本文只是提供了一种开发Vue项目的思路,可以避开项目打包,做到文件级别的增量更新。