SWC 代码压缩 #

压缩基础 #

什么是代码压缩? #

代码压缩是将 JavaScript 代码转换为更小体积的过程,主要包括:

text
┌─────────────────────────────────────────────────────────────┐
│                     代码压缩技术                             │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  压缩(Compression)                                         │
│  ├── 移除空白和注释                                          │
│  ├── 缩短变量名                                              │
│  ├── 优化表达式                                              │
│  └── 内联函数                                                │
│                                                              │
│  混淆(Mangling)                                            │
│  ├── 变量名混淆                                              │
│  ├── 属性名混淆                                              │
│  └── 作用域优化                                              │
│                                                              │
│  优化(Optimization)                                        │
│  ├── 死代码消除                                              │
│  ├── 常量折叠                                                │
│  └── 内联展开                                                │
│                                                              │
└─────────────────────────────────────────────────────────────┘

基本使用 #

json
{
  "minify": true
}

或使用命令行:

bash
swc src -d dist -C minify=true

压缩效果示例 #

javascript
// 输入
function calculateTotal(items) {
  let total = 0;
  for (const item of items) {
    total += item.price * item.quantity;
  }
  return total;
}

const result = calculateTotal([
  { price: 10, quantity: 2 },
  { price: 20, quantity: 1 }
]);

console.log(result);
javascript
// 输出
function calculateTotal(e){let t=0;for(const o of e)t+=o.price*o.quantity;return t}const result=calculateTotal([{price:10,quantity:2},{price:20,quantity:1}]);console.log(result);

压缩配置 #

完整配置结构 #

json
{
  "jsc": {
    "minify": {
      "compress": {
        "defaults": true
      },
      "mangle": {
        "toplevel": false
      },
      "format": {
        "comments": "some"
      }
    }
  },
  "minify": true
}

compress 配置 #

基本压缩选项 #

json
{
  "jsc": {
    "minify": {
      "compress": {
        "defaults": true,
        "arrows": true,
        "arguments": false,
        "booleans": true,
        "collapse_vars": true,
        "comparisons": true,
        "computed_props": true,
        "conditionals": true,
        "dead_code": true,
        "drop_console": false,
        "drop_debugger": true,
        "evaluate": true,
        "hoist_funs": true,
        "hoist_props": true,
        "hoist_vars": false,
        "if_return": true,
        "join_vars": true,
        "keep_classnames": false,
        "keep_fnames": false,
        "loops": true,
        "negate_iife": true,
        "properties": true,
        "reduce_funcs": true,
        "reduce_vars": true,
        "sequences": true,
        "side_effects": true,
        "switches": true,
        "top_retain": [],
        "typeofs": true,
        "unused": true
      }
    }
  }
}

常用压缩选项详解 #

drop_console #

移除 console 语句:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "drop_console": true
      }
    }
  }
}
javascript
// 输入
console.log("debug info");
console.error("error message");
function main() {
  console.log("running");
}

// 输出
function main(){}
drop_debugger #

移除 debugger 语句:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "drop_debugger": true
      }
    }
  }
}
dead_code #

移除死代码:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "dead_code": true
      }
    }
  }
}
javascript
// 输入
function example() {
  if (false) {
    console.log("never executed");
  }
  return "result";
}

// 输出
function example(){return"result"}
unused #

移除未使用的代码:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "unused": true
      }
    }
  }
}
javascript
// 输入
function used() {
  return "used";
}

function unused() {
  return "unused";
}

used();

// 输出
function used(){return"used"}used();
evaluate #

计算常量表达式:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "evaluate": true
      }
    }
  }
}
javascript
// 输入
const result = 1 + 2 + 3;
const message = "Hello" + " " + "World";
const condition = true && false;

// 输出
const result=6,message="Hello World",condition=!1;
conditionals #

优化条件表达式:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "conditionals": true
      }
    }
  }
}
javascript
// 输入
if (true) {
  doSomething();
} else {
  doOther();
}

// 输出
doSomething();
loops #

优化循环:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "loops": true
      }
    }
  }
}
javascript
// 输入
while (true) {
  doSomething();
}

// 输出
for(;;)doSomething();
join_vars #

合并变量声明:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "join_vars": true
      }
    }
  }
}
javascript
// 输入
const a = 1;
const b = 2;
const c = 3;

// 输出
const a=1,b=2,c=3;
collapse_vars #

内联变量:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "collapse_vars": true
      }
    }
  }
}
javascript
// 输入
function example() {
  const temp = compute();
  return temp * 2;
}

// 输出
function example(){return 2*compute()}
keep_classnames #

保留类名:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "keep_classnames": true
      }
    }
  }
}
javascript
// 输入
class MyComponent extends React.Component {
  render() {
    return <div />;
  }
}

// 输出(保留类名)
class MyComponent extends React.Component{render(){return React.createElement("div",null)}}
keep_fnames #

保留函数名:

json
{
  "jsc": {
    "minify": {
      "compress": {
        "keep_fnames": true
      }
    }
  }
}

mangle 配置 #

基本混淆选项 #

json
{
  "jsc": {
    "minify": {
      "mangle": {
        "toplevel": false,
        "keep_classnames": false,
        "keep_fnames": false,
        "keep_private_props": false,
        "ie8": false,
        "safari10": false,
        "properties": {
          "regex": "^_",
          "reserved": []
        }
      }
    }
  }
}

toplevel #

混淆顶层变量:

json
{
  "jsc": {
    "minify": {
      "mangle": {
        "toplevel": true
      }
    }
  }
}
javascript
// 输入
const globalVariable = "value";
function globalFunction() {
  return globalVariable;
}

// 输出
const a="value";function b(){return a}

keep_classnames #

保留类名:

json
{
  "jsc": {
    "minify": {
      "mangle": {
        "keep_classnames": true
      }
    }
  }
}

keep_fnames #

保留函数名:

json
{
  "jsc": {
    "minify": {
      "mangle": {
        "keep_fnames": true
      }
    }
  }
}

properties #

属性名混淆:

json
{
  "jsc": {
    "minify": {
      "mangle": {
        "properties": {
          "regex": "^_",
          "reserved": ["__typename", "__schema"]
        }
      }
    }
  }
}
javascript
// 输入
const obj = {
  _private: "value",
  _internal: "data",
  public: "info"
};

// 输出(只混淆以 _ 开头的属性)
const obj={a:"value",b:"data",public:"info"};

reserved #

保留特定名称:

json
{
  "jsc": {
    "minify": {
      "mangle": {
        "reserved": ["require", "exports", "module", "define"]
      }
    }
  }
}

format 配置 #

json
{
  "jsc": {
    "minify": {
      "format": {
        "comments": "some",
        "ecma": 5,
        "indent_level": 2,
        "preamble": "",
        "quote_style": 0
      }
    }
  }
}

comments #

注释处理:

json
{
  "jsc": {
    "minify": {
      "format": {
        "comments": "some"
      }
    }
  }
}
描述
"all" 保留所有注释
"some" 保留部分注释(如许可证)
"none" 移除所有注释

quote_style #

引号风格:

描述
0 自动选择
1 使用单引号
2 使用双引号
3 使用原始引号

压缩预设 #

开发环境 #

json
{
  "jsc": {
    "minify": {
      "compress": {
        "defaults": false,
        "dead_code": true,
        "unused": true
      },
      "mangle": false
    }
  },
  "minify": false
}

生产环境 #

json
{
  "jsc": {
    "minify": {
      "compress": {
        "defaults": true,
        "drop_console": true,
        "drop_debugger": true,
        "unused": true
      },
      "mangle": {
        "toplevel": true
      }
    }
  },
  "minify": true
}

保留调试信息 #

json
{
  "jsc": {
    "minify": {
      "compress": {
        "defaults": true,
        "keep_classnames": true,
        "keep_fnames": true
      },
      "mangle": {
        "keep_classnames": true,
        "keep_fnames": true
      }
    }
  },
  "minify": true,
  "sourceMaps": true
}

最大压缩 #

json
{
  "jsc": {
    "minify": {
      "compress": {
        "defaults": true,
        "drop_console": true,
        "drop_debugger": true,
        "evaluate": true,
        "unused": true,
        "dead_code": true,
        "conditionals": true,
        "loops": true,
        "collapse_vars": true,
        "reduce_vars": true,
        "sequences": true
      },
      "mangle": {
        "toplevel": true,
        "properties": {
          "regex": "^_"
        }
      }
    }
  },
  "minify": true
}

命令行压缩 #

基本压缩 #

bash
# 启用压缩
swc src -d dist -C minify=true

# 完整压缩配置
swc src -d dist \
  -C minify=true \
  -C jsc.minify.compress.drop_console=true \
  -C jsc.minify.mangle.toplevel=true

生产构建 #

bash
swc src -d dist \
  -C minify=true \
  -C jsc.minify.compress.defaults=true \
  -C jsc.minify.compress.drop_console=true \
  -s

JavaScript API #

压缩字符串 #

javascript
const swc = require('@swc/core');

const result = await swc.minify(sourceCode, {
  compress: {
    drop_console: true,
    drop_debugger: true
  },
  mangle: {
    toplevel: true
  }
});

console.log(result.code);

压缩文件 #

javascript
const swc = require('@swc/core');
const fs = require('fs');

const source = fs.readFileSync('./src/index.js', 'utf-8');

const result = await swc.minify(source, {
  compress: {
    defaults: true
  },
  mangle: true
});

fs.writeFileSync('./dist/index.min.js', result.code);

同步压缩 #

javascript
const swc = require('@swc/core');

const result = swc.minifySync(sourceCode, {
  compress: true,
  mangle: true
});

压缩与 Source Map #

生成 Source Map #

json
{
  "minify": true,
  "sourceMaps": true
}
javascript
const swc = require('@swc/core');

const result = await swc.minify(sourceCode, {
  compress: true,
  mangle: true,
  sourceMap: true
});

console.log(result.code);
console.log(result.map);

内联 Source Map #

json
{
  "minify": true,
  "sourceMaps": "inline"
}

实战示例 #

构建脚本 #

javascript
// build.js
const swc = require('@swc/core');
const fs = require('fs');
const path = require('path');

async function build() {
  const input = fs.readFileSync('./src/index.js', 'utf-8');
  
  const result = await swc.transform(input, {
    jsc: {
      parser: {
        syntax: 'ecmascript',
        jsx: true
      },
      target: 'es2015',
      minify: {
        compress: {
          defaults: true,
          drop_console: true,
          drop_debugger: true
        },
        mangle: {
          toplevel: true
        }
      }
    },
    minify: true,
    sourceMaps: true
  });
  
  fs.writeFileSync('./dist/bundle.min.js', result.code);
  fs.writeFileSync('./dist/bundle.min.js.map', result.map);
  
  console.log('Build complete!');
  console.log(`Original: ${input.length} bytes`);
  console.log(`Minified: ${result.code.length} bytes`);
  console.log(`Saved: ${((1 - result.code.length / input.length) * 100).toFixed(1)}%`);
}

build();

多环境配置 #

javascript
// swc.config.js
const isProduction = process.env.NODE_ENV === 'production';

module.exports = {
  jsc: {
    parser: {
      syntax: 'typescript',
      tsx: true
    },
    target: 'es2015',
    minify: isProduction ? {
      compress: {
        defaults: true,
        drop_console: isProduction,
        drop_debugger: isProduction
      },
      mangle: {
        toplevel: isProduction
      }
    } : false
  },
  minify: isProduction,
  sourceMaps: true
};

与 Gulp 集成 #

javascript
const gulp = require('gulp');
const swc = require('@swc/core');
const through = require('through2');

function minify() {
  return through.obj(async (file, encoding, callback) => {
    if (file.isBuffer()) {
      const result = await swc.minify(file.contents.toString(), {
        compress: {
          defaults: true,
          drop_console: true
        },
        mangle: true
      });
      
      file.contents = Buffer.from(result.code);
      file.extname = '.min.js';
    }
    
    callback(null, file);
  });
}

gulp.task('minify', () => {
  return gulp.src('src/**/*.js')
    .pipe(minify())
    .pipe(gulp.dest('dist'));
});

压缩效果对比 #

示例代码 #

javascript
// 原始代码 (1,234 bytes)
class Calculator {
  constructor(initialValue = 0) {
    this.value = initialValue;
    this.history = [];
  }
  
  add(number) {
    this.value += number;
    this.history.push(`+${number}`);
    return this;
  }
  
  subtract(number) {
    this.value -= number;
    this.history.push(`-${number}`);
    return this;
  }
  
  getResult() {
    console.log(`Current value: ${this.value}`);
    return this.value;
  }
  
  getHistory() {
    console.log('History:', this.history.join(', '));
    return this.history;
  }
}

const calc = new Calculator(10);
calc.add(5).subtract(3);
console.log(calc.getResult());

压缩后 #

javascript
// 压缩后 (287 bytes)
class Calculator{constructor(e=0){this.value=e,this.history=[]}add(e){return this.value+=e,this.history.push(`+${e}`),this}subtract(e){return this.value-=e,this.history.push(`-${e}`),this}getResult(){return console.log(`Current value: ${this.value}`),this.value}getHistory(){return console.log("History:",this.history.join(", ")),this.history}}const calc=new Calculator(10);calc.add(5).subtract(3),console.log(calc.getResult());

压缩率 #

配置 大小 压缩率
原始 1,234 bytes -
基本压缩 456 bytes 63%
完整压缩 287 bytes 77%
最大压缩 245 bytes 80%

常见问题 #

问题一:压缩后代码报错 #

原因:某些代码依赖特定变量名或属性名

解决方案

json
{
  "jsc": {
    "minify": {
      "mangle": {
        "reserved": ["requiredVariable"],
        "properties": {
          "reserved": ["requiredProperty"]
        }
      }
    }
  }
}

问题二:React 组件名丢失 #

原因:压缩时移除了类名

解决方案

json
{
  "jsc": {
    "minify": {
      "compress": {
        "keep_classnames": true
      },
      "mangle": {
        "keep_classnames": true
      }
    }
  }
}

问题三:调试困难 #

解决方案

json
{
  "minify": true,
  "sourceMaps": true
}

下一步 #

现在你已经掌握了 SWC 的代码压缩功能,接下来学习 打包功能 了解如何使用 SWC 打包项目!

最后更新:2026-03-28