捆绑 (swcpack)
🚧
此功能仍在开发中。此外,SWC 的主要作者在 Vercel 为 Turbopack (在新标签页中打开) 工作,因此此功能不会被积极开发。
SWC 能够将多个 JavaScript 或 TypeScript 文件捆绑到一个文件中。
此功能目前名为 spack
,但在 v2
中将重命名为 swcpack
。 spack.config.js
将被 swcpack.config.js
弃用。
用法
pnpm i -D @swc/cli @swc/core
创建一个 spack.config.js
文件并运行
npx spack
配置
要查看所有选项,请 查看配置.
功能
紧凑输出
就像 rollup
一样,SWC 会发出紧凑的输出。
a.js
console.log("loading A");
export function a() {
console.log("use!");
}
lib.js
import { a } from "./a";
a();
变成
output.js
console.log("loading A");
function a() {
console.log("use!");
}
a();
SWC 是为合并而设计的,因此多个文件之间的命名冲突会自动处理。
树摇
就像其他现代捆绑器一样,SWC 可以删除未使用的导出。
导入去星号
为了帮助树摇,SWC 会尽可能地对导入进行去星号处理。
import * as lib from "lib";
lib.foo();
行为与以下完全相同
import { foo } from "lib";
foo();
这会保留所有副作用。
CommonJS 支持
SWC 支持导入 CommonJS 模块,并发出比 webpack 更紧凑的输出。
source.js
import * as lib from "lib";
console.log(lib); // Prevent dce
如果上面的 lib
是一个 CommonJS 模块,它会被转译为
output.js
const load = __spack_require.bind(void 0, function (module, exports) {
// Code from lib goes here
});
const lib = load();
console.log(lib); // Prevent dce
优化
- 全局内联 (例如
process.env.NODE_ENV
) - 内联
- 常量传播
- 死代码消除
上面描述的树摇使用的是死代码消除传递。目前,SWC 可以推断出
source.js
let b = 2;
let a = 1;
if (b) {
a = 2;
}
let c;
if (a) {
c = 3;
}
console.log(c);
进入
output.js
console.log(3);
高性能
性能是 SWC 的优先事项。它非常快,因为它使用所有 CPU 内核,并由 llvm
优化。
多入口支持
spack.config.js
const { config } = require("@swc/core/spack");
module.exports = config({
entry: {
web: __dirname + "/src/web.ts",
android: __dirname + "/src/android.ts",
},
output: {
path: __dirname + "/lib",
},
module: {},
});
内置分块
使用与上面相同的配置,如果 android.ts
和 web.ts
都引用了同一个文件,它将被提取为一个单独的块,而 web.ts
和 android.ts
将导入它。