跳至内容
文档
用法
捆绑

捆绑 (swcpack)

🚧

此功能仍在开发中。此外,SWC 的主要作者在 Vercel 为 Turbopack (在新标签页中打开) 工作,因此此功能不会被积极开发。

SWC 能够将多个 JavaScript 或 TypeScript 文件捆绑到一个文件中。

此功能目前名为 spack,但在 v2 中将重命名为 swcpackspack.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.tsweb.ts 都引用了同一个文件,它将被提取为一个单独的块,而 web.tsandroid.ts 将导入它。