Vue 项目之 Webpack 打包 Vue 代码(2)
「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
1. Vue 源码打包后的不同版本解析
前面提到了 Vue 的版本可以分为两类:Runtime + Compiler 和 Runtime-only。而事实上,Vue 的源码打包后的具体版本是有很多个的:

下面,我们对这些版本进行分类解析:
-
vue(.runtime).global(.prod).js:- 通过浏览器中的
<script src="...">直接使用时,使用的就是这个版本; - 我们之前通过
CDN引入的版本以及下载到本地的Vue的版本就是这个版本;- 比如我们在浏览器访问
Vue源码的CDN地址:https://unpkg.com/vue@next,你会发现,它会自动跳转到https://unpkg.com/vue@3.2.22/dist/vue.global.js这个地址上(版本号可能会变),可以看到,CDN引入的其实就是vue.global.js这个版本的Vue源码。
- 比如我们在浏览器访问
- 会暴露一个全局的
Vue供使用;
- 通过浏览器中的
-
vue(.runtime).esm-browser(.prod).js:- 用于通过原生
ES模块导入使用(在浏览器中通过<script type="module">来使用); - 就是说在通过
<script src="...">方式引入Vue源码时,如果添加了type="module",就会使用这个esm-browser版本。
- 用于通过原生
-
vue(.runtime).esm-bundler.js:-
用于
webpack、rollup和parcel等构建工具; -
在构建工具中引入
Vue时,默认使用的是vue.runtime.esm-bundler.js;这就意味着我们前面导入
Vue的写法:... import { createApp } from 'vue'; ...这里的
'vue'引用的其实是vue.runtime.esm-bundler.js这个版本,runtime版本没有包含对template的解析,所以最终页面上没有显示对应的内容。 -
因此,如果我们需要解析
template,就需要手动指定vue.esm-bundler.js版本:... import { createApp } from 'vue/dist/vue.esm-bundler'; ...指定完成后,我们再来运行
npm run build命令对代码进行编译打包,打包成功后再来看浏览器页面中的效果:
可以看到,
template中的内容成功渲染到了页面上,可见,这次就能成功编译template中的内容了。
-
-
vue.cjs(.prod).js:- 服务器端渲染使用;
- 通过
require()方式在Node.js中使用;
上面这些版本中,被圆括号包裹起来的内容(.runtime 和 .prod)属于可选项,它们的含义如下:
.runtime:如果添加了这项内容,就意味着使用“仅运行时”版本,这有个好处,因为“仅运行时”版本不包含“编译器”,所以相对来说其包的大小会更小。当我们不需要对template做编译时,就可以添加这项内容。.prod:表示使用生产版本,生产版本是做过压缩的,好处也是包的大小更小些。
以上就是关于 Vue 不同的构建版本对应不同场景下的使用解析。
2. 运行时 + 编译器 vs 仅运行时
- 在
Vue项目的开发过程中,我们有3种方式来编写DOM元素:template模板的方式(之前我们使用的方式);render函数的方式,使用h函数来编写渲染的内容(后面再讲组件化时会讲到);- 通过
.vue文件中的template来编写模板;
- 它们的模板分别是如何处理的呢?
- 方式
2中的h函数可以直接返回一个虚拟节点,也就是VNode节点(也就是说我们不需要再做编译了,因为它直接返回的就已经是VNode了); - 方式
1和方式3中的template都需要有特定的代码来对其进行解析:- 方式
1中的template必须要通过源码中的一部分代码来进行编译; - 方式
3.vue文件中的template可以通过vue-loader结合另外一个库对其进行编译和处理;
- 方式
- 方式
- 所以,
Vue在让我们选择版本的时候分为运行时 + 编译器和仅运行时:- 运行时 + 编译器包含了对
template模板的编译代码,更加完整,但是也更大一些; - 仅运行时没有包含对
template的编译代码,所以不支持对template的解析,但也相对更小一些。
- 运行时 + 编译器包含了对
转载自:https://juejin.cn/post/7033243735173382180