SWC是什么
- SWC 是一个基于 Rust 的可扩展的平台,适用于下一代快速开发工具, 可用于编译和打包
- 它被 Next.js、Parcel 和 Deno 等工具以及 Vercel、ByteDance、腾讯、Shopify 等公司使用
- SWC 可以下载并用作预构建的二进制文件,也可以从源代码构建
SWC在单线程上比 Babel 快 20倍,在四核上快 70 倍。
上手
简介:
swc 与 babel 一样,将命令行工具、编译核心模块分化为两个包。
@swc/cli == @babel/cli
- @swc/core == @babel/core
安装:
npm i @swc/cli @swc/core -D
swc/cli常用命令
```bash // 转换文件,只打印在控制台 npx swc ./file.js
// 根据源文件生成编译过后的文件 npx swc ./src/index.js -o dist.js
// 根据源文件目录生成编译过后的文件目录 npx swc ./src -d dist
// 根据项目中的.swcrc配置进行编译 npx swc input.js —config-file .swcrc
// 要在文件变改时自动重新编译文件,需要安装chokidar npm i -D chokidar npx swc ./src/index.js -w
<br />从上述基操过后的图片可看出,通过swc编译过后,会把es6语法转换成浏览器可识别的代码,并生成对应的source-map来用于源代码映射。<a name="jn56L"></a>## .swcrc配置文件除了上述中通过命令行工具进行编译外,swc同时支持类似于babel的.babelrc配置文件-->.swcrc配置文件<br />以下为swc官网提供的开箱即用的配置,无需定制,或者可以覆盖配置。```json{// 编译规则"jsc": {"parser": {// 除了 ecmascript,还支持 typescript"syntax": "ecmascript",// 是否解析jsx,"jsx": false,// 是否支持动态导入,"dynamicImport": false,"privateMethod": false,"functionBind": false,"exportDefaultFrom": false,"exportNamespaceFrom": false,// 是否支持装饰器,"decorators": false,"decoratorsBeforeExport": false,// 是否支持top-level-await"topLevelAwait": false,"importMeta": false},"transform": null,// 编译输出规范"target": "es5",// 类似于babel-preset-env 松散模式的工作来启用松散的编译转换"loose": false,// 输出代码可能依赖于辅助函数来支持目标环境。默认情况下,辅助函数会内联到需要的输出文件中。"externalHelpers": false,."keepClassNames": false}}
支持更多浏览器
安装browserslist,browserslist:自动配置支持的浏览器
npm install browserslist -D
更新.swcrc配置文件
{"env": {// 需要支持的浏览器版本,向后兼容"targets": {"chrome": "79"},// 模式可能值为:usage, entry, undefined,与usebuiltins相匹配// https://babeljs.io/docs/en/babel-preset-env#usebuiltins"mode": "entry",// corejs 的版本"coreJs": 3}}
模块
SWC 可以使用 ES 模块将您的代码转换为 CommonJS 或 UMD/AMD。默认情况下,模块语句将保持不变。
更新.swcrc配置文件
{"module": {// 转换类型可能值:"commonjs", "es6", "amd", "umd""type": "commonjs",// 严格 要防止__esModule属性被导出,您可以将 strict 选项设置为true。"strict": false,// 使用严格模式"strictMode": true,// 懒惰"lazy": false,// 无互操作"noInterop": false}}
压缩
v1.2.67启用来配置 SWC 以缩小代码:minify.swcrc
更新.swcrc配置文件
{// 是否开启压缩"minify": true,// 压缩选项"jsc": {"minify": {"compress": {"unused": true},"mangle": true}}}
打包
创建一个spack.config.js ```javascript const { config } = require(“@swc/core/spack”);
module.exports = config({ entry: { web: dirname + “/src/index.ts”, }, output: { path: dirname + “/lib”, }, });
- 执行 npx spack- <a name="WVBp9"></a>## @swc/core@swc/core 模块可在 node.js中调用 api 直接进行代码的编译```javascriptconst { transform } = require("@swc/core");const fs = require("fs");const code = fs.readFileSync("./src/index.js", "utf-8");transform(code, {filename: "dist.js",sourceMaps: true,jsc: {parser: {syntax: "ecmascript",},transform: {},},}).then((output) => {console.log(output);});
