Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

rollup-plugin-swc3

SukkaW124.3kMIT0.12.1TypeScript support: included

Use SWC with Rollup to transform ESNext and TypeScript code.

readme

rollup-plugin-swc

SWC is an extensible Rust-based platform for the next generation of fast developer tools. This plugin is designed to replace rollup-plugin-typescript2, @rollup/plugin-typescript, @rollup/plugin-babel and rollup-plugin-terser for you.

New: Building library for React Server Component support is added in 0.9.0! 'use client' and 'use server' directives now are handled properly, without triggering rollup warnings. Start using 'use client' and 'use server' in your library by adding two lines in your rollup.config.js

Since 0.9.1 the support for 'use client' and 'use server' has been separated into a standalone rollup plugin rollup-preserve-directives, the previous preserveUseDirective named export is retained for the backward compatibility.

Comparison

| | sukkaw/rollup-plugin-swc | mentaljam/rollup-plugin-swc | nicholasxjy/rollup-plugin-swc2 | @rollup/plugin-swc | | ---------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | minify your bundle in one pass[^1] | ✅ | 🛑 | 🛑 | 🛑 | | Standalone swcMinify plugin | ✅ | 🛑 | 🛑 | 🛑 | | Config Intellisense[^2] | ✅ | 🛑 | 🛑 | 🛑 | | Reads your tsconfig.json and jsconfig.json | ✅ | 🛑 | 🛑 | 🛑 | | ESM export | ✅ | 🟡[^3] | 🛑 | ✅ | | TypeScript declarations | ✅ | ✅ | ✅ | ✅ | | Has testing | ✅ | 🛑 | 🛑 | ✅ |

[^1]: If minify is called in Rollup's transform phase, every individual module processed will result in a minify call. However, if minify is called in Rollup's renderChunk phase, the minify will only be called once in one whole pass before Rollup generates bundle, results in a faster build. [^2]: Autocompletion and type checking in your IDE [^3]: mentaljam/rollup-plugin-swc has both main and module fields in package.json, but has🛑exports field.

Install

$ npm i @swc/core rollup-plugin-swc3
# If you prefer yarn
# yarn add @swc/core rollup-plugin-swc3
# If you prefer pnpm
# pnpm add @swc/core rollup-plugin-swc3

Usage

// rollup.config.js
import { swc } from 'rollup-plugin-swc3';

export default {
  input: 'xxxx',
  output: {},
  plugins: [
    swc({
      // All options are optional
      include: /\.[mc]?[jt]sx?$/, // default
      exclude: /node_modules/, // default
      tsconfig: 'tsconfig.json', // default
      // tsconfig: false, // You can also prevent `rollup-plugin-swc` from reading tsconfig.json, see below
      // And add your swc configuration here!
      // "filename" will be ignored since it is handled by rollup
      jsc: {}
    }),
  ];
}

If you want autocompletion in your IDE or type check:

import { swc, defineRollupSwcOption } from 'rollup-plugin-swc3';

export default {
  input: 'xxxx',
  output: {},
  plugins: [
    swc(defineRollupSwcOption({
      // ... There goes the plugin's configuration
    })),
  ];
}

// or
/** @type {import('rollup-plugin-swc3').PluginOptions} */
const swcPluginConfig = {}

exclude

  • Type: string | RegExp | Array<String | RegExp>
  • Default: /node_modules/

A picomatch pattern, or array of patterns, which specifies the files in the build the plugin should ignore.

extensions

  • Type: string[]
  • Default: ['.ts', '.tsx', '.mjs', '.js', '.cjs', '.jsx']

Specifies the files in the build the plugin should operate on. Also, the plugin will search and resolve files for extensions in the order specified for extensionless imports.

include

  • Type: string | RegExp | Array<String | RegExp>
  • Default: /\.[mc]?[jt]sx?$/

A picomatch pattern, or array of patterns, which specifies the files in the build the plugin should operate on.

tsconfig

  • Type: string | false | undefined
  • Default: 'tsconfig.json'

rollup-plugin-swc will read your tsconfig.json or jsconfig.json for default values if your doesn't provide corresponding swc options:

  • The configuration your passed to rollup-plugin-swc will always have the highest priority (higher than tsconfig.json/jsconfig.json).
  • rollup-plugin-swc uses get-tsconfig to find the tsconfig.json/jsconfig.json for the file currently being transpiled.
    • You can also provide a custom filename (E.g. tsconfig.rollup.json, jsconfig.compile.json) to tsconfig option, and rollup-plugin-swc will find and resolve the nearest file with that filename.
    • You can also provide an absolute path (E.g. /path/to/your/tsconfig.json) to tsconfig option, and rollup-plugin-swc will only use the provided path as a single source of truth.
  • You can prevent rollup-plugin-swc from reading tsconfig.json/jsconfig.json by setting tsconfig option to false.
  • jsconfig.json will be ignored if tsconfig.json and jsconfig.json both exist.
  • The extends of tsconfig.json/jsconfig.json is not supported now supported.
  • compilerOptions.target will be passed to swc's jsc.target.
  • compilerOptions.jsxImportSource, compilerOptions.jsxFactory, and compilerOptions.jsxFragmentFactory will be passed to swc's jsc.transform.react.importSource, jsc.transform.react.pragma and jsc.transform.react.pragmaFrag.
  • When compilerOptions.jsx is either react-jsx or react-jsxdev, swc's jsc.transform.react.runtime will be automatic, otherwise it will be classic.
    • compilerOptions.jsx: react-jsxdev will also set swc's jsc.transform.react.development to true.
    • compilerOptions.jsx: preserve will be ignored. swc will always transpile your jsx into javascript code.
  • compilerOptions.baseUrl and compilerOptions.paths will be passed to swc's jsc.baseUrl and jsc.paths directly. They won't affect how rollup resolve your imports. If you have encounted any issue during bundling, please use other plugins to resolve your imports' aliases (e.g., add rollup-plugin-typescript-paths or rollup-plugin-tsconfig-paths before @rollup/plugin-node-resolve).
  • compilerOptions.importHelpers will be passed to swc's jsc.externalHelpers. You will have to have @swc/helpers avaliable in your project when enabled.
  • compilerOptions.experimentalDecorators and compilerOptions.emitDecoratorMetadata will be passed to swc's jsc.parser.decorators and jsc.transform.decoratorMetadata.
  • compilerOptions.esModuleInterop will always be ignored, as swc requires module.type to exist when module.noInterop is given.

Standalone Minify Plugin

If you only want to use swc to minify your bundle:

import { minify } from 'rollup-plugin-swc3'

export default {
  plugins: [
    minify({
      // swc's minify option here
      // mangle: {}
      // compress: {}
    }),
  ],
}

If you want autocompletion in your IDE or type check:

import { minify, defineRollupSwcMinifyOption } from 'rollup-plugin-swc3'

export default {
  plugins: [
    minify(
      defineRollupSwcMinifyOption({
        // swc's minify option here
        // mangle: {}
        // compress: {}
      })
    ),
  ],
}

// or
/** @type {import('@swc/core').JsMinifyOptions} */
const swcMinifyConfig = {}

If you are are using Vite and you do not want to use terser or esbuild for minification, rollup-plugin-swc3 also provides a standalone minify plugin designed for Vite:

import { defineConfig } from 'vite';
import { viteMinify } from 'rollup-plugin-swc3'

export default defineConfig({
  plugins: [
    viteMinify({
      // swc's minify option here
      // mangle: {}
      // compress: {}
    }),
  ],
})

React Server Component directives ('use client' and 'use server')

Since version 0.9.0, the support for 'use client' and 'use server' has been added:

The support for 'use client' and 'use server' has been separated into a standalone rollup plugin rollup-preserve-directives, maintained by @huozhi and me. The previous preserveUseDirective named export is retained for the backward compatibility.

# npm
npm install -D rollup-preserve-directives
# yarn
yarn add -D rollup-preserve-directives
# pnpm
pnpm add -D rollup-preserve-directives
// rollup.config.js
import { swc } from 'rollup-plugin-swc3';
import preserveDirectives from 'rollup-preserve-directives';

export default {
  input: 'xxxx',
  output: {},
  plugins: [
    swc(),
    // And add `preserveDirectives` plugin after the `swc` plugin
    preserveDirectives()
  ];
}

And that is it!

preserveDirectives supports:

  • Merging duplicated directives in the output bundles

    // src/foo.js
    'use sukka';
    'use foxtail';
    
    export const foo = 'foo';
    
    // src/bar.js
    'use sukka';
    export const bar = 'bar';
    
    // src/index.js
    export { foo } from './foo';
    export { bar } from './bar';
    
    // rollup.config.js
    export default {
      input: 'src/index.js',
      output: { file: 'dist/index.js' }
      plugins: [swc(), preserveDirectives()]
    }
    
    // dist/index.js
    'use sukka';
    'use foxtail';
    
    const foo = 'foo';
    const bar = 'bar';
    
    export { foo, bar };
  • When bundle React Client Component and React Server Component separately, mutiple entries will have their own separated and correct directives:

    // src/client.js
    'use client';
    import { useState } from 'react';
    export const Foo = () => { useState('client-only code') };
    
    // src/server.js
    'use server';
    import 'fs';
    export const bar = 'server only code';
    
    // rollup.config.js
    export default {
      // let rollup bundle client and server separately by adding two entries
      input: {
        client: 'src/client.js',
        server: 'src/server.js'
      },
      // output both client bundle and server bundle in the "dist/" directory
      output: { dir: 'dist/', entryFileName: '[name].js' }
      plugins: [swc(), preserveDirectives()]
    }
    
    // dist/client.js
    'use client';
    import { useState } from 'react';
    const Foo = () => { useState('client-only code') };
    export { Foo };
    
    // dist/server.js
    'use server';
    import 'fs';
    const bar = 'server only code';
    export { bar };

Write your Rollup config in TypeScript

You can write your Rollup config file in rollup.config.ts, and use the following command:

rollup --config rollup.config.ts --configPlugin swc3

TypeScript Declaration File

There are serveral ways to generate declaration file:

  • Use tsc with emitDeclarationOnly, the slowest way but you get type checking, it doesn't bundle the .d.ts files.
  • Use rollup-plugin-dts which generates and bundle .d.ts, also does type checking. It is used by this plugin as well.

Use with Non-react JSX

You can either configure it in your tsconfig.json or in your rollup.config.js.

// Vue JSX
import { swc, defineRollupSwcOption } from 'rollup-plugin-swc3';

export default {
  input: 'xxxx',
  output: {},
  plugins: [
    swc(defineRollupSwcOption({
      jsc: {
        experimental: {
          plugins: [['swc-plugin-vue-jsx', {}]] // npm i swc-plugin-vue-jsx
        }
      }
    })),
  ];
}
// Preact
import { swc, defineRollupSwcOption } from 'rollup-plugin-swc3';

export default {
  input: 'xxxx',
  output: {},
  plugins: [
    swc(defineRollupSwcOption({
      jsc: {
        transform:{
          react: {
          pragma: 'h',
          pragmaFrag: 'Fragment'
          // To use preact/jsx-runtime:
          // importSource: 'preact',
          // runtime: 'automatic'
          }
        }
      }
    })),
  ];
}

rollup-plugin-swc © Sukka, Released under the MIT License.
Inspired by egoist's rollup-plugin-esbuild.
Authored and maintained by Sukka with help from contributors (list).

Personal Website · Blog · GitHub @SukkaW · Telegram Channel @SukkaChannel · Mastodon @sukka@acg.mn · Twitter @isukkaw · Keybase @sukka

changelog

0.12.1

  • Fix: respect legacy decorators. See #67

0.12.0

  • The minimum required version has been bumped from 12 to 16.
  • Now when TypeScript 5 is detected in your projects will rollup-plugin-swc3 enable decorators by default (with decorator version 2022-03), otherwise it is depended by experimentalDecorators from tsconfig.json (and decorator version 2021-12 will be used). See #65

0.11.2

  • New feature viteMinify to use swc's minification in Vite.

    • When used, it will disable Vite's built-in minification and use swc's minification instead.
    import { defineConfig } from 'vite';
    import { viteMinify } from 'rollup-plugin-swc3'
    
    export default defineConfig({
      plugins: [
        viteMinify({
          // swc's minify option here
          // mangle: {}
          // compress: {}
        }),
      ],
    })

0.11.1

  • Fix #63
    • Previously, rollup-plugin-swc3 only handled relative compilerOptions.baseUrl when compilerOptions.paths is specified. It is fixed in #64, now rollup-plugin-swc3 will handle relative compilerOptions.baseUrl as long as it is specified.

0.11.0

  • Fix #58
    • rollup-plugin-swc3 now will only perform module resolution inside the files specified in include and exclude options.
  • Replace rollup-swc-preserve-directives with rollup-preserve-directives

0.10.4

  • Bump rollup-swc-preserve-directives to the latest version

0.10.3

0.10.2

  • Add warning message when tsconfig is invalid
  • Add rollup 4 official support

0.10.1

  • Fix #41
    • rollup-plugin-swc3 now will always provide baseUrl (resolve to an absolute path) to swc as long as the paths is specified in the tsconfig.json or jsconfig.json being read.

0.10.0

0.9.1

  • The support for 'use client' and 'use server' has been separated into a standalone rollup plugin rollup-swc-preserve-directives, maintained by @huozhi and me. The previous preserveUseDirective named export is retained for the backward compatibility.

0.9.0

  • Add support for bundling library for React Server Component with the proper 'use client' and 'use server' directives handling:

    • Merge duplicated directives in the final bundles
    • Multiple output chunks will have their own separated directives, useful when bundling client only code and server only code in different bundles.
    • Not enabled by default. manually opt-in by changing two lines of code in your rollup.config.js:
    // rollup.config.js
    // Import `preserveUseDirective` from `rollup-plugin-swc3`...
    - import { swc } from 'rollup-plugin-swc3';
    + import { swc, preserveUseDirective } from 'rollup-plugin-swc3';
    
    export default {
      input: 'xxxx',
      output: {},
      plugins: [
        swc(),
    +   preserveUseDirective()
      ];
    }

0.8.2

  • Enable CI auto publish release + npm provenance

0.8.1

  • Fix TypeScript declaration of include and exclude option (#32)

0.8.0

  • Add new option extensions.
    • Along with include / exclude, this provides a granular way to specify the files that will be processed by the plugin.
    • For extensionless imports the plugin will search and resolve files for extensions in the order specified.

0.7.0

  • Add Rollup 3.0.0 support.
    • rollup-plugin-swc now supports both Rollup 2 and Rollup 3.

0.6.0

  • Supports extends from tsconfig.json/jsconfig.json.
  • Supports passing a full path of a tsconfig.json/jsconfig.json file to tsconfig option.
  • When finding the nearest tsconfig.json/jsconfig.json from the source file that is currently being transpiled, rollup-plugin-swc's behavior is now aligned with tsc.

0.5.0

  • rollup-plugin-swc now also respects jsx option from tsconfig.json when no corresponding swc option is provided.
    • jsxImportSource from tsconfig.json will be passed to swc's jsc.transform.react.importSource
    • if tsconfig.json specifies jsx: react-jsx or jsx: react-jsxdev, rollup-plugin-swc will set jsx.tramsform.react.runtime to automatic, otherwise it will be classic.
      • Currently, swc doesn't support preserving JSX, and will always transpile JSX into javascript code.
    • rollup-plugin-swc will also set jsx.tramsform.react.development to true if tsconfig.json specifies jsx: react-jsxdev.

0.4.2

  • Remove unused dependency (@huozhi #20)

0.4.1

  • Fix some minor issues.

0.4.0

  • Automatically pass rollup's file id to swc's filename option.
    • It should help swc find the .swcrc, and also enables some other swc's functionality
  • Automatically mapping .ts/.tsx to .mjs/.js/.cjs/.jsx.
    • When using native ESM, import path requires .js/.jsx extension for TypeScript with "moduleResolution": "Node16". So rollup-plugin-swc will now try all possible extensions.
    • E.g. if you write import Foo from 'foo.jsx', rollup-plugin-swc will search for foo.ts, foo.tsx, foo.mjs, foo.js, foo.jsx.
    • PRs are welcome if you want to make rollup-plugin-swc more spec compliant.

0.3.0

  • Completely disable swc minify during rollup's transform phase.
    • Now all minify will be done in rollup's renderChunk phase, which is a one-pass process, resulting in even faster build performance.
  • Remove the workaround for rollup's virtual module that is introduced in 0.1.2 (https://github.com/SukkaW/rollup-plugin-swc/pull/1)
    • swc has fixed the issue, and the corresponding test case has been added in https://github.com/swc-project/swc/pull/4255
    • The peerDependencies of swc has been updated to >=1.2.165. You will need to bump the version of swc to 1.2.165 or higher after this release.

0.2.0

  • Standalone minify plugin
  • Support reading baseUrl and paths from your tsconfig.json (and jsconfig.json).

0.1.4

  • Add .mjs extension support
  • Export a default for use with rollup's --configPlugin

0.1.3

  • Fix a bug caused by the workaround introduced in 0.1.2

0.1.2

0.1.1

  • Add .npmignore to reduce the size of the package.
  • Use deepmerge to merge plugin options config with your given tsconfig.json.

0.1.0

The first release.