都2025年了,我看看还有谁不会 tsc 升级到 swc ?

60 阅读1分钟

swc 已经出了挺久了,很多大厂诸如字节,鹅厂之类都已经在用了,一直听说速度那是杠杠的快,今天我就来见识见识。

目录结构如下,tree 统计出来 28 个 ts 文件

├── __tests__
├── .eslintignore
├── .eslintrc.cjs
├── .gitignore
├── jest.config.js
├── lib
├── package.json
├── pnpm-lock.yaml
├── README.md
├── src
└── tsconfig.json

准备工作

  1. 新增一个 .swcrc 文件到根目录下
touch .swrrc
  1. 将以下内容填充到 .swcrc, 配置项
{
  "jsc": {
    "parser": {
      "syntax": "typescript",
      "tsx": false,
      "rootDir": "src",
      "decorators": false,
      "dynamicImport": false,
      "module": "UMD",
      "target": "ES2022"
    }
  },
  "minify": true
}
  1. 安装 swc 及其他依赖
pnpm add @swc/cli @swc/core

# 方便开发模式监听文件变化
pnpm add chokidar
  1. 编写package.json scripts 命令
{
    "scripts": {
        "dev": "chokidar 'src/**/*' -c 'pnpm build'",
        "build": "swc src -d lib --strip-leading-paths & tsc --emitDeclarationOnly",
    }
}
  • --strip-leading-paths 参数用于不生成 src目录 到 lib 中(巨坑默认生成 sr c到 lib 中,害我找文档找了半天)
  • 由于 swc 不支持生成*.d.ts 声明文件,所以只能采用tsc原生的方式(tsc --emitDeclarationOnly)并发生成声明文件 bug#657
  • 由于官方文档里面 -w 【watch】 参数无法在监听文件变化的同时,再去生成声明文件,故而采用命令行的方式,绕过官方文档支持的 watch 的参数
  1. 实际测试结果
beforeafter
构建时间71.34.ms45.98ms
各自测试了5次构建,平均时间如上所示,可见确实可以带来一定效率提升