Skip to content

Bundling (swcpack)

🚧

This feature is still under construction.

SWC is able to bundle multiple JavaScript or TypeScript files into one.

This feature is currently named spack, but will be renamed to swcpack in v2. spack.config.js will be deprecated for swcpack.config.js.

View a basic example of bundling.

Usage

npm i --save-dev @swc/cli @swc/core

Create a spack.config.js file and run:

npx spack

Configuration

To see all options, view the configuration.

Features

Compact Output

Just like rollup, SWC emits compact output.

a.js

console.log("loading A");
export function a() {
console.log("use!");
}

lib.js

import { a } from "./a";
a();

becomes:

console.log("loading A");
function a() {
console.log("use!");
}
a();

SWC was designed with merging in mind, so naming collisions between multiple files are automatically handled.

Tree Shaking

Just like other modern bundlers, SWC can remove unused exports.

Import Deglobbing

To aid with tree-shaking, SWC deglobs imports if possible.

import * as lib from "lib";
lib.foo();

behaves exactly same as:

import { foo } from "lib";
foo();

This preserves all side effects.

CommonJS Support

SWC supports importing CommonJS modules and emits more compact output than webpack.

import * as lib from "lib";
console.log(lib); // Prevent dce

If the lib above is a CommonJS module, it's transcompiled to:

const load = __spack_require.bind(void 0, function (module, exports) {
// Code from lib goes here
});
const lib = load();
console.log(lib); // Prevent dce

Optimizations

  • Global Inlining (e.g. process.env.NODE_ENV)
  • Inlining
  • Constant propagation
  • Dead code elimination

The tree shaking described above is using the dead code elimination pass. Currently, SWC can deduce:

let b = 2;
let a = 1;
if (b) {
a = 2;
}
let c;
if (a) {
c = 3;
}
console.log(c);

into:

console.log(3);

High Performance

Performance is a priority for SWC. It's very fast because it uses all CPU cores and is optimized by llvm.

Multiple Entries Support

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: {},
});

Built-in Chunking

Using the same config as above, if android.ts and web.ts both references the same file, it will be extracted as a separate chunk and web.ts and android.ts will import it.