其他
打包时用 tree-shaking 消除未使用的导出,减小…
当构建产物里混入了未被引用的模块代码、需要瘦身并提升加载性能时,按此做法启用并保住 tree-shaking。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
打包时用 tree-shaking 消除通用
解决思路
- 使用 ES2015 的 `import`/`export` 语法,只有 ES 模块才能被 tree-shaking。
- 使用具名导入(named imports)而不是导入整个模块,例如 `import { read } from 'utilities'`,以便 tree-shaking 生效。
- 在合适的时候在 `package.json` 中将包标记为无副作用(side-effect-free)。
- 注意:带副作用的模块不能被安全地 tree-shake——被导入的 ES6 模块会立即执行,即使代码中没有引用它的导出,它也可能影响全局作用域(如 polyfill 或全局样式表)。
- 逐个判断语句是否有副作用:`let firstName = 'Jane'` 无副作用,若无人使用 `firstName` 可安全移除;`let firstName = getName()` 有副作用,即使无人使用也不能移除,否则会改变代码含义。
- 把应用及其依赖视为抽象语法树/图:每个节点是一个顶层语句(part),以入口文件为起点做图遍历,标记所有被遍历到的路径纳入 bundle。
- 实际执行时由打包器(如 webpack 或 Rollup)完成移除:从入口文件中所有带副作用的 part 开始访问,沿图的边遍历直到不再有新区域被触达,完成后 bundle 只包含遍历中触达的 part,其余部分被排除。
- 验证效果:例如 `utilities.js` 中导出 `read()` 和 `nap()`,`index.js` 只用了 `read()`,则 `nap()` 不应出现在最终 bundle 中。
- 参考 webpack 文档中关于 tree-shaking 与 sideEffects 的说明,避免写法破坏 tree-shaking。
- 去掉死代码后可减少 bundle 体积,并降低下载、解析以及部分场景下的执行时间。
适用边界 · 注意事项
- 模块具有副作用时(如 polyfill、全局样式表等导入即影响全局作用域的代码),不能安全 tree-shake。
- 使用 CommonJS 等非 ES 模块语法时,无法进行 tree-shaking。
- 没有模块打包器(如 webpack、Rollup)在构建阶段处理时,无法自动移除死代码。