成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文帶你了解新一代的編譯工具 SWC

開發 開發工具
最近前端圈掀起了一陣 rust 風,凡是能用 rust 重寫的前端工具就用 rust 重寫,今天介紹的工具就是通過 rust 實現的 bable:swc,一個將 ES6 轉化為 ES5 的工具。

最近前端圈掀起了一陣 rust 風,凡是能用 rust 重寫的前端工具就用 rust 重寫,今天介紹的工具就是通過 rust 實現的 bable:swc,一個將 ES6 轉化為 ES5 的工具。

而且在 swc 的官網,很直白說自己和 babel 對標,swc 和 babel 命令可以相互替換,并且大部分的 babel 插件也已經實現。

使用 rust 的一個優勢就是快,比如我們之前的一個項目,將 babel 替換成 swc 后,編譯速度從原來的 7 秒提升到了 1 秒,效率直接爆炸。

上手

swc 與 babel 一樣,將命令行工具、編譯核心模塊分化為兩個包。

  • @swc/cli 類似于 @babel/cli;
  • @swc/core 類似于 @babel/core;
  1. npm i -D @swc/cli @swc/core 

通過如下命令,可以將一個 ES6 的 JS 文件轉化為 ES5。

  1. npx swc source.js -o dist.js 

下面是 source.js 的代碼:

  1. const start = () => { 
  2.   console.log('app started'

代碼中囊括了 ES6 的兩個特性,const 聲明 和 箭頭函數。經過 swc 轉化后,這兩個特性分別被轉化成了 var 聲明 和 function 匿名函數。

配置文件

swc 與 babel 一樣,支持類似于 .babelrc 的配置文件:.swcrc,配置的格式為 JSON。

  1.   "jsc": { // 編譯規則 
  2.     "target""es5", // 輸出js的規范 
  3.     "parser": { 
  4.       // 除了 ecmascript,還支持 typescript 
  5.       "syntax""ecmascript"
  6.       // 是否解析jsx,對應插件 @babel/plugin-transform-react-jsx 
  7.       "jsx"false
  8.       // 是否支持裝飾器,對應插件 @babel/plugin-syntax-decorators 
  9.       "decorators"false
  10.       // 是否支持動態導入,對應插件 @babel/plugin-syntax-dynamic-import 
  11.       "dynamicImport"false
  12.       // …… 
  13.       // babel 的大部分插件都能在這里找到對應配置 
  14.     }, 
  15.     "minify": {}, // 壓縮相關配置,需要先開啟壓縮 
  16.   }, 
  17.   "env": { // 編譯結果相關配置 
  18.     "targets": { // 編譯結果需要適配的瀏覽器 
  19.       "ie""11" // 只兼容到 ie 11 
  20.     }, 
  21.     "corejs""3" // corejs 的版本 
  22.   }, 
  23.   "minify"true // 是否開啟壓縮 

babel 的插件系統被 swc 整合成了 jsc.parser 內的配置,基本上大部分插件都能照顧到。而且,swc 還繼承了壓縮的能力,通過 minify 屬性開啟,jsc.minify 用于配置壓縮相關的規則,更詳細的配置可查看文檔。

Node APIs

通過在 node.js 代碼中,導入 @swc/core 模塊,可以在 node.js 中調用 api 直接進行代碼的編譯,這對 CLI 工具的開發來說是常規操作。

  1. // swc.mjs 
  2. import { readFileSync } from 'fs' 
  3. import { transform } from '@swc/core' 
  4.  
  5. const run = async () => { 
  6.   const code = readFileSync('./source.js''utf-8'
  7.  const result = await transform(code, { 
  8.     filename: "source.js"
  9.   }) 
  10.   // 輸出編譯后代碼 
  11.   console.log(result.code) 
  12.  
  13. run() 

打包代碼

除了將代碼轉義,swc 還提供了一個簡易的打包能力。我們新建一個 src 文件夾,在里面新建兩個文件:index.js、utils.js。

  1. // src/index.js 
  2. import { log } from './utils.js' 
  3. const start = () => log('app started'
  4. start() 
  1. // src/utils.js 
  2. export const log = function () { 
  3.   console.log(...arguments) 
  4. export const errorLog = function () { 
  5.   console.error(...arguments) 

可以看到 index.js 導入了 utils.js 中的一個方法,然后我們新建一個 spack.config.js 文件,該文件是 swc 打包的配置文件。

  1. // spack.config.js 
  2. module.exports = { 
  3.   entry: { 
  4.     // 打包的入口 
  5.     web: __dirname + "/src/index.js"
  6.   }, 
  7.   output: { 
  8.     // 打包后輸出的文件夾 
  9.     path: __dirname + "/dist"
  10.   }, 
  11. }; 

然后在命令行運行:

  1. $ npx spack 

打包成功后,會在 dist 目錄輸出一個 web.js 文件。

可以看到,不僅將 index.js、utils.js 打包成了一個文件,還進行了 tree shaking,將 utils.js 中沒有使用的 errorLog 方法刪掉了。

能不能用?

babel 畢竟經過了這么多年的發展,不管是 bug 輸了,還是社區活躍度都遠遠優于 swc。所以,如果是小產品試水還是可以試一下 swc 的,舊項目如果已經使用了 babel 還是不建議進行遷移。

在使用的過程,還是發現了一些小問題。比如,如果我使用了 async function,swc 會自動導入 regenerator-runtime 模塊。

  1. // 編譯前,有個 async 方法 
  2. const start = async () => { 
  3.   console.log('app started'

調用 swc 編譯后,代碼如下:

這個結果看起來是沒問題的,但是 swc 與 babel 類似,也有 helpers(@swc/helpers),同時提供了 externalHelpers 開關, 如果把 externalHelpers 設置為 true,swc 會將一些工具類,通過模塊的形式導入。

  1. // .swcrc 
  2.   "jsc": { 
  3.     "externalHelpers"true 
  4.   } 

而 externalHelpers 的默認值是 false,那這個時候,regenerator-runtime ,到底是通過模塊的形式導入,還是把整個代碼寫入到文件?

swc 正好有個 issue [https://github.com/swc-project/swc/issues/1461] 在討論這個問題。

除了上面說的這個問題,其實還有一點,就是作者覺得之前的架構有問題,正在加緊重寫 2.0 版本,感覺可以期待一下,另外提一句,swc 的作者是一個 97 年的韓國小哥,目前大學都還沒畢業,最后我也只能說一句:牛逼!

【編輯推薦】

 

責任編輯:姜華 來源: 自然醒的筆記本
相關推薦

2023-11-20 08:18:49

Netty服務器

2023-11-06 08:16:19

APM系統運維

2022-11-11 19:09:13

架構

2023-10-27 08:15:45

2022-02-24 07:34:10

SSL協議加密

2023-11-08 08:15:48

服務監控Zipkin

2020-02-02 15:14:24

HTTP黑科技前端

2021-12-16 12:42:18

AIoT人工智能物聯網

2024-02-04 09:44:41

量子計算量子量子物理

2020-10-08 14:32:57

大數據工具技術

2022-04-28 09:22:46

Vue灰度發布代碼

2022-09-29 13:09:38

DataClassPython代碼

2025-01-15 09:06:57

servlet服務器Java

2022-05-16 09:14:28

前端構建工具

2019-06-13 15:38:34

甲骨文OracleExadata

2023-03-31 08:16:53

Flutter優化內存管理

2018-10-22 08:14:04

2019-07-04 15:16:52

數據挖掘大數據算法

2022-02-18 10:13:07

SolrElasticSea開源

2022-09-06 11:21:49

光網絡光纖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: aaaa一级毛片 | 在线免费观看毛片 | 国产精品精品视频一区二区三区 | 日韩午夜电影在线观看 | 国产精品色婷婷久久58 | 欧美日韩成人在线 | 综合亚洲视频 | 久久99精品久久久久久狂牛 | 成人综合视频在线观看 | 免费在线精品视频 | 一级黄色片免费在线观看 | 91在线精品一区二区 | 久久久久久久久久久久久久av | 精品视频导航 | 黄色网址在线免费观看 | 日本视频免费 | 国产在线中文字幕 | 天堂av在线影院 | 夜夜骚视频| 美女三区| 伊人春色成人网 | 国产91在线 | 欧美 | 久久99视频 | 精品国产一区探花在线观看 | 国产在线一区二区三区 | 91新视频 | 精产嫩模国品一二三区 | 国产精品无码永久免费888 | 国产精品久久久久久吹潮 | 亚洲一区二区免费视频 | 伊人伊成久久人综合网站 | 91不卡| 在线观看的av | av激情影院| 免费看a | 91精品国产一区二区三区 | 老司机深夜福利网站 | 四虎永久影院 | 国产一区二区免费电影 | 日韩第一区 | 日韩在线成人 |