代码压缩
从 v1.2.67
开始,您可以通过在您的 .swcrc
文件中启用 minify
来配置 SWC 以压缩您的代码。
{
// Enable minification
"minify": true,
// Optional, configure minification options
"jsc": {
"minify": {
"compress": {
"unused": true
},
"mangle": true
}
}
}
配置
关于注释的说明
如果您将 jsc.minify.compress
设置为 true
或 {}
,SWC 将只保留许可证注释。如果您不希望这样,请修改 jsc.minify.format
。
jsc.minify.compress
类型:boolean | object
。
类似于 compress 选项 (在新标签页中打开) 的 terser
。
{
"jsc": {
"minify": {
"compress": true // equivalent to {}
}
}
}
arguments
,默认值为false
。arrows
,默认值为true
。booleans
,默认值为true
。booleans_as_integers
,默认值为false
。collapse_vars
,默认值为true
。comparisons
,默认值为true
。computed_props
,默认值为true
。conditionals
,默认值为true
。dead_code
,默认值为true
。defaults
,默认值为true
。directives
,默认值为true
。drop_console
,默认值为false
。drop_debugger
,默认值为true
。ecma
,默认值为5
。evaluate
,默认值为true
。global_defs
,默认值为{}
。hoist_funs
,默认值为false
。hoist_props
,默认值为true
。hoist_vars
,默认值为false
。ie8
,忽略。if_return
,默认值为true
。inline
,默认值为true
。join_vars
,默认值为true
。keep_classnames
,默认值为false
。keep_fargs
,默认值为false
。keep_infinity
,默认值为false
。loops
,默认值为true
。negate_iife
,默认值为true
。passes
,默认值为0
,表示没有限制。properties
,默认值为true
。pure_getters
,默认值为 ``。pure_funcs
,默认值为[]
。类型为字符串数组。reduce_funcs
,默认值为false
。reduce_vars
,默认值为true
。sequences
,默认值为true
。side_effects
,默认值为true
。switches
,默认值为true
。top_retain
,默认值为 ``。toplevel
,默认值为true
。typeofs
,默认值为true
。unsafe
,默认值为false
。unsafe_arrows
,默认值为false
。unsafe_comps
,默认值为false
。unsafe_Function
,默认值为false
。unsafe_math
,默认值为false
。unsafe_symbols
,默认值为false
。unsafe_methods
,默认值为false
。unsafe_proto
,默认值为false
。unsafe_regexp
,默认值为false
。unsafe_undefined
,默认值为false
。unused
,默认值为true
。module
, 忽略。目前,所有文件都被视为模块。
jsc.minify.mangle
类型:boolean | object
。
类似于 mangle 选项 (在新标签页中打开) 的 terser
。
{
"jsc": {
"minify": {
"mangle": true // equivalent to {}
}
}
}
props
, 默认值为false
,而true
等同于{}
。topLevel
, 默认值为true
。为了与terser
兼容,它被别名为toplevel
。keepClassNames
, 默认值为false
。为了与terser
兼容,它被别名为keep_classnames
。keepFnNames
, 默认值为false
。keepPrivateProps
, 默认值为false
。为了与terser
兼容,它被别名为keep_private_props
。reserved
, 默认值为[]
ie8
,忽略。safari10
, 默认值为false
。
jsc.minify.mangle.properties
类型: object
。
类似于 mangle 属性选项 (在新标签页中打开) 的 terser
。
{
"jsc": {
"minify": {
"mangle":{
"properties":{
"reserved": ["foo", "bar"],
"undeclared":false,
"regex":"rust regex"
}
}
}
}
}
-
reserved
: 不要将这些名称用作属性。 -
undeclared
: 即使未声明,也要混淆属性。 -
regex
: 仅当属性与该正则表达式匹配时才混淆属性。
jsc.minify.format
这些属性大多尚未实现,但它存在于支持将 terser 配置传递给 swc minify 而不进行修改。
asciiOnly
, 默认值为false
。它在v1.2.184
中实现,并被别名为ascii_only
,以与terser
兼容。beautify
, 默认值为false
。目前是空操作。braces
, 默认值为false
。目前是空操作。comments
, 默认值为some
。false
删除所有注释'some'
保留一些注释'all'
保留所有注释
ecma
, 默认值为 5。目前是空操作。indentLevel
, 目前是空操作,并被别名为indent_level
,以与terser
兼容。indentStart
, 目前是空操作,并被别名为indent_start
,以与terser
兼容。inlineScript
, 目前是空操作,并被别名为inline_script
,以与terser
兼容。keepNumbers
, 目前是空操作,并被别名为keep_numbers
,以与terser
兼容。keepQuotedProps
,目前为无操作函数,并作为keep_quoted_props
的别名,以兼容terser
。maxLineLen
,目前为无操作函数,并作为max_line_len
的别名,以兼容terser
。preamble
,自v1.3.66
版本起支持。quoteKeys
,目前为无操作函数,并作为quote_keys
的别名,以兼容terser
。quoteStyle
,目前为无操作函数,并作为quote_style
的别名,以兼容terser
。preserveAnnotations
,目前为无操作函数,并作为preserve_annotations
的别名,以兼容terser
。safari10
,目前为无操作函数。semicolons
,目前为无操作函数。shebang
,目前为无操作函数。webkit
,目前为无操作函数。wrapIife
,目前为无操作函数,并作为wrap_iife
的别名,以兼容terser
。wrapFuncArgs
,目前为无操作函数,并作为wrap_func_args
的别名,以兼容terser
。
@swc/core 使用
swc.minify(code, options)
此 API 为异步 API,所有解析、压缩和代码生成操作将在后台线程中执行。 options
参数与 jsc.minify
对象相同。例如
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);"`);
返回 Promise<{ code: string, map: string }>
。
swc.minifySync(code, options)
此 API 存在于 @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);"`);
返回 { code: string, map: string }
。
WebAssembly API
替换 Terser
您可以通过 yarn resolutions (opens in a new tab) 减少构建时间并覆盖 Terser,而无需使用库来更新其依赖项。示例 package.json
将包含
{
"resolutions": { "terser": "npm:@swc/core" }
}
这将使用 SWC 压缩器而不是 Terser 来压缩所有嵌套依赖项。确保删除您的锁文件并重新安装您的依赖项。
$ rm -rf node_modules yarn.lock
$ yarn