Tree Shake
Farm 支持 Tree Shake,在默认 Production 环境下自动开启。通过 compilation.treeShaking
选项可控制开启或者关闭。
Tree Shake 时,会自动读取 package.json 中的 sideEffects 字段,有 sideEffect 的模块将不会进行 Tree Shake。
备注
Farm 会将所有循环依赖的模块视作 sideEffect,不会进行 Tree Shake,请尽量避免项目中存在循环依赖。
Tree shake 示例:
a.js
import { b1, b2 } from 'b';
console.log(b1);
b.js
export b1 = "B1";
export b2 = "B2";
a.js
是入口,它导入 了 b.js
,经过 Tree Shaking,结果是:
a.js
import { b1 } from 'b';
console.log(b1);
b.js
export b1 = "B1";
b2
未使用,将在a.js
和b.js
中删除
配置 Tree Shake
默认情况下,在生产模式下启用 Tree Shake,要禁用 Tree Shake,请使用compilation.treeShaking
:
farm.config.ts
export default {
compilation: {
treeShaking: false,
},
};
处理 Side Effects
当模块包含副作用
时,Farm 不会对其应用 tree shake,并且其所有导入和导出都将被视为已使用。 Farm 会认为以下模块有副作用
:
- CommonJs 模块总是有副作用。
- 模块在全局范围内包含
自执行
语句有副作用 - 包含循环依赖的模块有副作用
- 模块与最接近的
package.json
中的sideEffects
配置相匹配 5.入口模块总是有副作用。
Example 1:
const a = require('./')
module.exports = a;
CommonJs 模块总是有副作用。
Example 2:
import a from './';
a();
a()
在全局范围内执行,我们将其视为副作用。
Example 3:
// a.js
import b from './b.js'
// b.js
import a from './a.js'
a
、b
是循环依赖,因此它们也将被视为副作用。
Example 4:
package.json
{
"name": "my-package",
"sideEffects": [
"./global/**.ts"
]
}
global/
下的所有 ts 模块都被视为副作用。