在应用 Vue.js 2.0 时,有独立构建(standalone)和运行时构建(runtime-only)两种版本可供选择。而在 Vue.js 1.0 中,却没有这种版本区别。到底该应用哪一个版本?这让我有点懵逼的感觉。本着知其然还要知其所以然的精力,我决定好好钻研下两者间的区别。
Vue.js 的官网教程上是这么说的:
- 独立构建包含编译和反对 template 选项。它也依赖于浏览器的接口的存在,所以你不能应用它来为服务器端渲染。
- 运行时构建不包含模板编译,不反对 template 选项。运行时构建,能够用 render 选项,但它只在单文件组件中起作用,因为单文件组件的模板是在构建时预编译到 render 函数中,运行时构建只有独立构建大小的 30%,只有 16Kb min+gzip 大小。
看了半天,切实没搞清两者之间的区别。通过一番搜寻,终于搞清楚了问题的根源,且听我娓娓道来。
Vue.js 的运行过程实际上蕴含两步。第一步,编译器将字符串模板(template)编译为渲染函数(render),称之为编译过程;第二步,运行时理论调用编译的渲染函数,称之为运行过程。
因为 Vue.js 1.0 的编译过程须要依赖浏览器的 DOM,所以无奈(或者说没有意义)将编译器和运行时离开。因而在 Vue.js 1.0 散发包中,编译器和运行时是打包在一起,都在浏览器端执行。
然而到了 Vue.js 2.0,为了反对服务端渲染(server-side rendering),编译器不能依赖于 DOM,所以必须将编译器和运行时离开。这就造成了独立构建(编译器 + 运行时)和运行时构建(仅运行时)。不言而喻,运行时构建要小于独立构建。
在古代前端工程构建中,通常会应用 vue-loader 和 vueify 预编译模板。在这种状况下,只须要打包运行时,而不须要打包编译器,运行时构建即可满足所需。当然,如果你须要在前端应用 template 选项实时编译模板,那么还是须要应用独立构建将编译器发送到浏览器。