在开发组件库或者插件,经常会需要区分多种环境构建,从而实现:
- 提供各种「体积」版本:全量版、精简版、基础版等;
- 提供各种「环境」版本:web 版、nodejs 版等等;
- 提供各种「规范」版本:esm 规范版本、cjs 规范版本、UMD 规范版本等等。
那么如何能够方便实现上面功能呢?这种场景就适合使用 Feature Flags,在构建过程中,通过开关的启用和关闭,对构建代码的过程进行动态设置,从而更好的实现 Tree Shaking。
Tree Shaking 是一种通过消除最终文件中未使用的代码来优化体积的方法。
本文会从 Vue 源码(版本号:3.0.11)中使用的 Feature Flags 进行构建的过程开始介绍,然后通过简单示例进行学习,最后介绍 rollup、webpack 和 Vite 中的实现。
一、什么是 Feature Flags
Feature Flag(又名 Feature Toggle、Flip等)是一种允许控制线上功能开启或者关闭的方式,通常会采取配置文件的方式来控制。
http://fex.baidu.com/blog/2014/07/feature-flag/
可以理解为在代码中添加一个开关,当开关开启,则逻辑会执行下去,否则不会执行,通常代码表现形式为 if
语句,举个简单示例:
const flags = true;
const test = () => flags && console.log('Hello Feature Flags');
当 flags
为 true
则执行输出,否则不会。现在我们想控制日志会不会输出,只需改变 flags
的值即可,test
方法逻辑不用修改。