Skip to content

框架的大小也是衡量框架的标准之一。在实现同样功能的情况下,当然是用的代码越少越好,这样体积就会越小,最后浏览器加载资源的时间也就越少。 这时我们不禁会想,提供越完善的警告信息就意味着我们要编写更多的代码,这不是与控制代码体积相悖吗?没错,所以我们要想办法解决这个问题。

如果我们去看 Vue.js 3 的源码,就会发现每一个 warn 函数的调用都会配合 __DEV__ 常量的检查,例如:

js
if (__DEV__ && !res) {
  warn(`Failed to mount app: mount target selector "${container}" returned null.`)
}

可以看到,打印警告信息的前提是:__DEV__ 这个常量一定要为 true,这里的 __DEV__ 常量就是达到目的的关键。

Vue.js 使用 rollup.js 对项目进行构建,这里的 __DEV__ 常量实际上是通过 rollup.js 的插件配置来预定义的,其功能类似于 webpack 中的 DefinePlugin 插件。

Vue.js 在输出资源的时候,会输出两个版本,其中一个用于开发环境,如 vue.global.js,另一个用于生产环境,如 vue.global.prod.js,通过文件名我们也能够区分。

当 Vue.js 构建用于开发环境的资源时,会把 __DEV__ 常量设置为 true,这时上面那段输出警告信息的代码就等价于:

js
if (true && !res) {
  warn(`Failed to mount app: mount target selector "${container}" returned null.`)
}

可以看到,这里我们把 __DEV__ 常量替换成字面量 true,所以这段代码在开发环境中是肯定存在的。

当 Vue.js 用于构建生产环境的资源时,会把 __DEV__ 常量设置为 false,这时上面那段输出警告信息的代码就等价于:

js
if (false && !res) {
  warn(`Failed to mount app: mount target selector "${container}" returned null.`)
}

可以看到,__DEV__ 常量替换为字面量 false,这时我们发现这段分支代码永远都不会执行,因为判断条件始终为假,这段永远不会执行的代码称为 dead code, 它不会出现在最终产物中,在构建资源的时候就会被移除,因此在 vue.global.prod.js 中是不会存在这段代码的。

这样我们就做到了在开发环境中为用户提供友好的警告信息的同时,不会增加生产环境代码的体积。

如有转载或CV请标注本站原文地址