跳到主要内容
版本:1.0.0

Tree Shake

Farm 支持 Tree Shake,该功能在默认的生产环境中自动启用,可以通过compilation.treeShaking选项打开或关闭。

在 Tree Shake 期间,package.json 中的 sideEffects 字段将被自动读取,具有 sideEffects 的模块将不会执行 Tree Shake。

备注

Farm 会将所有循环依赖的模块视为 sideEffects,不会执行 Tree Shake。请尽量避免项目中的循环依赖。

Tree shake 示例:

a.js
import { b1, b2 } from 'b';
console.log(b1);
b.js
export b1 = "B1";
export b2 = "B2";

a.js 是 entry,它导入b.js,tree shaking 后,结果是:

a.js
import { b1 } from 'b';
console.log(b1);
b.js
export b1 = "B1";

b2未使用,将在a.jsb.js中删除

配置 Tree Shake

Tree Shake 默认在生产模式下启用,要禁用 tree Shake,请使用 compilation. treeShaking

farm.config.ts
export default {
compilation: {
treeShaking: false,
},
};

处理 Side Effects

当一个模块包含Side Effects时,Farm 不会为其应用 tree shake,其所有导入和导出都被视为已使用。Farm 会认为以下模块有 Side effects

  1. Common Js 模块总是有副作用.
  2. 一个模块包含自执行的语句在全局范围有副作用
  3. 包含循环依赖的模块有副作用
  4. 模块匹配 sideEffects 配置在其最接近的 package. json
  5. 入口模块总是有副作用

示例 1:

const a = require('./');
module.exports = a;

Common Js 模块总是有副作用.

示例 2:

import a from './';

a();

a() 在全局范围内执行,我们将其视为副作用.

Example 3:

// a.js
import b from './b.js';

// b.js
import a from './a.js';

ab是循环依赖关系,所以它们也会被视为副作用.

Example 4:

package.json
{
"name": "my-package",
"sideEffects": ["./global/**.ts"]
}

所有 global/ 下的 ts 模块都被视为副作用.

Extremely Fast Web Build Tool Written in Rust

Copyright © 2024 Farm Community. Built with Docusaurus.