import { Callout } from 'nextra-theme-docs';
This section is for people who want to use swc as a last step of the build process. If you want to use swc minifier with a bundler, please see its documentation for swcMinify.Webpack doc
Starting with v1.2.67
, you can configure SWC to minify your code by enabling minify
in your .swcrc
file:
{
// Enable minification
"minify": true,
// Optional, configure minification options
"jsc": {
"minify": {
"compress": {
"unused": true
},
"mangle": true
}
}
}
If you set jsc.minify.compress
to true
or {}
, SWC will preserve only license comments.
If you don't want this, modify jsc.minify.format
.
Type: boolean | object
.
Similar to the compress option of terser
.
{
"jsc": {
"minify": {
"compress": true // equivalent to {}
}
}
}
arguments
, defaults tofalse
.arrows
, defaults totrue
.booleans
, defaults totrue
.booleans_as_integers
, defaults tofalse
.collapse_vars
, defaults totrue
.comparisons
, defaults totrue
.computed_props
, defaults totrue
.conditionals
, defaults totrue
.dead_code
, defaults totrue
.defaults
, defaults totrue
.directives
, defaults totrue
.drop_console
, defaults tofalse
.drop_debugger
, defaults totrue
.ecma
, defaults to5
.evaluate
, defaults totrue
.global_defs
, defaults to{}
.hoist_funs
, defaults tofalse
.hoist_props
, defaults totrue
.hoist_vars
, defaults tofalse
.ie8
, Ignored.if_return
, defaults totrue
.inline
, defaults totrue
.join_vars
, defaults totrue
.keep_classnames
, defaults tofalse
.keep_fargs
, defaults tofalse
.keep_infinity
, defaults tofalse
.loops
, defaults totrue
.negate_iife
, defaults totrue
.passes
, defaults to0
, which means no limit.properties
, defaults totrue
.pure_getters
, defaults to ``.pure_funcs
, defaults to[]
. Type is an array of string.reduce_funcs
, defaults tofalse
.reduce_vars
, defaults totrue
.sequences
, defaults totrue
.side_effects
, defaults totrue
.switches
, defaults totrue
.top_retain
, defaults to ``.toplevel
, defaults totrue
.typeofs
, defaults totrue
.unsafe
, defaults tofalse
.unsafe_arrows
, defaults tofalse
.unsafe_comps
, defaults tofalse
.unsafe_Function
, defaults tofalse
.unsafe_math
, defaults tofalse
.unsafe_symbols
, defaults tofalse
.unsafe_methods
, defaults tofalse
.unsafe_proto
, defaults tofalse
.unsafe_regexp
, defaults tofalse
.unsafe_undefined
, defaults tofalse
.unused
, defaults totrue
.module
, Ignored. Currently, all files are treated as module.
Type: boolean | object
.
Similar to the mangle option of terser
.
{
"jsc": {
"minify": {
"mangle": true // equivalent to {}
}
}
}
props
, Defaults tofalse
, andtrue
is identical to{}
.topLevel
, Defaults totrue
. Aliased astoplevel
for compatibility withterser
.keepClassNames
, Defaults tofalse
. Aliased askeep_classnames
for compatibility withterser
.keepFnNames
, Defaults tofalse
.keepPrivateProps
, Defaults tofalse
. Aliased askeep_private_props
for compatibility withterser
.reserved
, Defaults to[]
ie8
, Ignored.safari10
, Defaults tofalse
.
Type: object
.
Similar to the mangle properties option of terser
.
{
"jsc": {
"minify": {
"mangle":{
"properties":{
"reserved": ["foo", "bar"],
"undeclared":false,
"regex":"rust regex"
}
}
}
}
}
-
reserved
: Don't use these names as properties. -
undeclared
: Mangle properties even if it's not declared. -
regex
: Mangle properties only if it matches this regex
These properties are mostly not implemented yet, but it exists to support passing terser config to swc minify without modification.
asciiOnly
, Defaults tofalse
. Implemented asv1.2.184
and aliased asascii_only
for compatibility withterser
.beautify
, Defaults tofalse
. Currently noop.braces
, Defaults tofalse
. Currently noop.comments
, Defaults tosome
.false
removes all comments'some'
preserves some comments'all'
preserves all comments
ecma
, Defaults to 5. Currently noop.indentLevel
, Currently noop and aliases asindent_level
for compatibility withterser
.indentStart
, Currently noop and aliases asindent_start
for compatibility withterser
.inlineScript
, Currently noop and aliases asinline_script
for compatibility withterser
.keepNumbers
, Currently noop and aliases askeep_numbers
for compatibility withterser
.keepQuotedProps
, Currently noop and aliases askeep_quoted_props
for compatibility withterser
.maxLineLen
, Currently noop, and aliases asmax_line_len
for compatibility withterser
.preamble
, Supported sincev1.3.66
.quoteKeys
, Currently noop and aliases asquote_keys
for compatibility withterser
.quoteStyle
, Currently noop and aliases asquote_style
for compatibility withterser
.preserveAnnotations
, Currently noop and aliases aspreserve_annotations
for compatibility withterser
.safari10
, Currently noop.semicolons
, Currently noop.shebang
, Currently noop.webkit
, Currently noop.wrapIife
, Currently noop and aliases aswrap_iife
for compatibility withterser
.wrapFuncArgs
, Currently noop and aliases aswrap_func_args
for compatibility withterser
.
This API is asynchronous and all of parsing, minification, and code generation will be done in background thread. The options
argument is same as jsc.minify
object. For example:
import swc from "@swc/core";
const { code, map } = await swc.minify(
"import foo from '@src/app'; console.log(foo)",
{
compress: false,
mangle: true,
}
);
expect(code).toMatchInlineSnapshot(`"import a from'@src/app';console.log(a);"`);
Returns Promise<{ code: string, map: string }>
.
This API exists on @swc/core
, @swc/wasm
, @swc/wasm-web
.
import swc from "@swc/core";
const { code, map } = swc.minifySync(
"import foo from '@src/app'; console.log(foo)",
{
compress: false,
mangle: true,
module: true
}
);
expect(code).toMatchInlineSnapshot(`"import a from'@src/app';console.log(a);"`);
Returns { code: string, map: string }
.
You can reduce build time and override Terser without needing a library to update their dependencies through yarn resolutions. Example package.json
would include:
{
"resolutions": { "terser": "npm:@swc/core" }
}
This will use the SWC minifier instead of Terser for all nested dependencies. Ensure you remove your lockfile and re-install your dependencies.
$ rm -rf node_modules yarn.lock
$ yarn