Vue源码探究-构建版本的区别

Vue源码探究-构建版本的区别

基于第三方性能评估工具Benchmark的测评结果可以看出Vue 2.0版本在整体的性能上得到了大幅优化,即使与React和Angular最新版相比也相差无几。在提供给使用者的构建版本方面,也进行了针对性的细化,输出了多种不同的版本,以便满足不同需求的开发者使用更精细更适合自己的版本。

构建版本的比较

官方文档上展示的概括图表(以下译自该文档):

UMD CommonJS ES Module
Full vue.js vue.common.js vue.esm.js
Runtime-only vue.runtime.js vue.runtime.common.js vue.runtime.esm.js
Full (production) vue.min.js
Runtime-only (production) vue.runtime.min.js

解释一下上表列出的所有版本的内容区别和使用场景,具体的术语就不一一解释了,英语可得靠自己好好学习:

vue.js

  • 内容:完整未压缩版,包括编译器和运行时两部分代码,支持通用模块引入和闭包返回Vue构造函数。
  • 建议使用场景:需要编译模板的开发环境。
  • 版本说明:由于未压缩,所以在生产环境下是不推荐使用的,这一版本比较适合学习源代码时使用。另外在Unpkg CDN上默认使用此完整版构建文件。

vue.min.js

  • 内容: 完整压缩版,内容和输出完全同上。
  • 建议使用场景:需要编译模板的生产环境、浏览器script标签直接引用。
  • 版本说明:在不想增加使用构建工具的学习曲线和复杂度时,直接使用script标签引入此版本可以无门槛直接进入Vue的学习和使用,并且支持通用模块加载。在生产环境建议使用压缩版可以减少30%的文件体积。

vue.common.js

  • 内容: 完整未压缩CommonJS版,内容同上,区别在于输出的是CommonJS模块。
  • 建议使用场景:需编译模板且使用老版本构建工具的开发环境。
  • 版本说明:由于此版本未压缩是不建议直接使用在生产环境上的。如果在使用构建工具的情况下可以直接使用对应的运行时版本,所以该版本的使用场景应该比较有限。

vue.esm.js

  • 内容: 完整未压缩ES Module版,内容同上,区别在于输出的是ES Module模块。
  • 建议使用场景:需编译模板且使用新版构建工具的开发环境。
  • 版本说明:同上。

vue.runtime.js

  • 内容: 未压缩运行时版,支持通用模块引入和闭包返回Vue构造函数。
  • 建议使用场景:不需要编译模板的开发环境。
  • 版本说明:这一版本也不建议在生产环境使用,需要模块加载可用相应的压缩版。

vue.runtime.min.js

  • 内容: 压缩运行时版,内容和输出完全同上。
  • 建议使用场景:不需要编译模板的生产环境。
  • 版本说明:如果不需要编译模板,可以使用这个版本,支持通用模块加载,也可以用script标签引入直接在浏览器中使用,是体积最小的版本

vue.runtime.common.js

  • 内容: 未压缩版CommonJs构建版,内容同上,区别在于输出CommonJS模块。
  • 建议使用场景:不需编译模板且使用老版本构建工具时。
  • 版本说明:使用browserify或webpack1时默认使用该版本。

vue.runtime.esm.js

  • 内容: 未压缩版ES module构建版,内容同上,区别在于输出ES module模块。
  • 建议使用场景:不需编译模板且使用新版构建工具时.
  • 版本说明:使用webpack2和rollup时默认使用该版本,在使用最新的vue-cli搭建的webpack脚手架时就是使用了这个版本

另外在仓库里发现的一个叫vue.esm.browser.js的文件,仔细看了一下与vue.esm.js相比用的全是ES6的语法,但图表里没有提到此文件是什么情况下使用,而且是稍前几次构建出的版本,个人猜想可能是没有什么特别的用处,只是没有删掉而已,欢迎指正。

完整版 vs. 运行时版

完整版的使用场景是需要即时编译模板的情况,什么是即时编译模板?

在程序运行中进行模板编译。这一过程如同动态加载,当把模板字符串作为配置选项的template属性传入Vue构造函数后再执行渲染进程;或使用DOM已有元素作为模板在运行时加载并编译,这些都是在运行中进行模板编译的实例。由此可见一般使用了type="text/x-template"script标签包含的模板就是在代码运行中进行加载编译的,所以此时需要完整版中的编译器来执行把模板转化成渲染函数的过程,否则通过vue进行构造的内容是无法显示的。在开发时如果使用了运行时版,Vue也会在Console中给出提示。

相反,如果使用构建工具开发,在程序运行之前就先执行了模板的编译过程,.vue单文件组件会被编译转换成javascript代码,在浏览器中可以直接运行,所以此时只需使用运行时版本就可以支持Vue的正常运行,这样Vue的体积更小,有助于提升加载速度,所以在熟悉了Vue之后比较推荐配合使用构建工具来进行开发。

开发模式 vs. 生产模式

官方文档表示在通用模块版本中使用了开发和生产模式的硬编码,未压缩版的用于开发模式,压缩版的用于生产模式。

在使用构建工具时,建议使用与构建工具版本相应的未压缩版,这样在开发时参考错误信息报告和定位调试是非常便利的,而在构建打包到生产环境时,配套插件会负责压缩代码。

基于网页性能优化的原则,建议在生产环境中都要使用压缩版。只有在开发时才需要未压缩版中的错误提示信息方便定位错误及调整。


在2.0版本发布以后,Vue开始提供不同构建版本,大致了解之后发现在不同开发场景下选择适当的版本有助于减少开发时每次打包的速度,并且了解各种版本的不同后也能选择适合的生产版本提升应用的整体性能。在网上找了很久才发现原来官方Github上有比较详细的说明文档解释各种版本的区别,不过对于具体的使用场景没有特别突出的说明,最后还是自己花了些时间去比较和总结,算是又把心中的一块小石头给抹掉。我想对于目前跟我一样还不太了解Vue内部实现机制的同学来说,弄明白各种版本的差异是一个快速得到性能优化最佳实践的途径。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,140评论 0 1
  • 学习过程中突发奇想 程序语言都是处理0和1 肯定很多地方是一样的,那么肯定有书教你怎么写程序 学习编程的第一要素是...
    joker731阅读 964评论 0 3
  • 在尤大微博铺垫着“将会引入一些关于 TypeScript 的改进”一周之后,代号为 Level E 的 Vue.j...
    极乐叔阅读 14,687评论 0 12
  • 在分析Vue的源码之前我们需要了解一些前置知识,如Flow、源码目录、构建方式、编译入口等。 认识 Flow Fl...
    oWSQo阅读 1,072评论 1 2
  • 问题导航 修改vue项目运行端口号 调试插件 UI组件库 vue、React、Angular1对比 1. 修改vu...
    OzanShareing阅读 761评论 0 6