rollup 与 Tree shaking

1,050 阅读3分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

前言

本篇文章将稍微来介绍一下什么是 Tree shaking 以及在 rollup 中是如何进行 Tree shaking 的,并且还会例举一个 rollup 插件 -- rollup-plugin-replace 是如何通过替换静态变量来开启一些环境开关的。

什么是 Tree shaking

在我们 JavaScript 项目达到一定体积的时候,将代码分成一个个模块将会有利于我们进行代码管理。但是在最后使用的时候,会出现实际上完全没有使用到的代码。

Tree shaking 是通过消除无用代码来优化代码体积的一种方法

比如我们来看一段代码:

const HELLO = "hello";

if (HELLO) {
  console.log(HELLO);
} else {
  console.warn("HELLO is nodefind");
}

很明显因为变量 HELLO 是一个常量,所以代码中的 else 分支是绝对不会运行的,那么在进行 Tree shaking 之后它会变成这样:

const HELLO = "hello";

{
  console.log(HELLO);
}

不只是代码中定死的逻辑分支,也可能是项目当中定义了,却没有调用的方法,或者写了,却没有引入的模块,这些都算是无用代码,那么在 Tree shaking 时候就可以去掉这些无用代码,起到减少项目体积的作用。

rollup 中的 Tree shaking

rollup 打包的过程当中,会自动帮我们去做一个 Tree shaking,我们用 rollup 打包一下上面的例子:

321.png

可以看到,打包过后的代码当中,rollup 自动去帮我们做了一个 Tree shaking

但是在 rollupTree shaking中,会存在这一些副作用,比如使用了原型链、给window加了属性、立即执行函数引用了外部变量等一些你觉得没有副作用的经过bable其它的打包一下,就有可能会产生副作用,会打入一些无用的代码进入包中。

vue 中的示例

ece07ef53cbb6e73bdf68a2bc061d4b.jpg

这是在 Vue3 中出现的一段代码,我们的关注点应该放在 __DEV__ 这个常量上面,代码并不难理解,在 __DEV__true 的时候,就会在使用不当的时候传出警告来警示用户需要注意的地方。

这样就是 Tree shaking 在开发过程中的一种使用方式,我们可以吧一些生成过程才会触发的警告通过一个开关来开启,这样会方便我们去调试代码,然后在使用的时候就关闭掉这个开关,这样控制台当中就不会输出过多的警告。

rollup-plugin-replace 实现环境开关

接下去我们将使用 rolluprollup-plugin-replace 插件来实现一个类似于上面 Vue 的环境开关,首先我们要来安装一下插件:

npm install --save-dev rollup-plugin-replace

然后将它添加到配置文件的插件中去,并且我们也设定一个 __DEV__ 来作为区分环境的变量:

image.png

接着我们就来写一段代码,看一下定义了环境开关开启和关闭会生成什么样不同的代码。

image.png

我们简单的定义了,在 __DEV__ 开启的时候传参错误会输出警告来提示用户错误出现的情况,然后使用的时候如果这个错误是无伤大雅的,那么可以关闭掉这个开关,这样就不会输出警告了。

总结

在我们封装自己的组件库或者插件的时候,可以灵活的去使用开关来改变在不同的环境下输出不同的结果,这样可以给开发者带来一个良好的使用体验,及时的查找到错误发生的地方,提高开发的效率。