新一代的編譯工具 SWC,97年小哥寫的~

大家好,我是若川。持續組織了5個月源碼共讀活動,感興趣的可以點此加我微信 ruochuan12?參與,每周大家一起學習200行左右的源碼,共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》?包含20余篇源碼文章。

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

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

8f5242f7d7f8c671c96c5b1db783b372.png

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

000b8b2968a863336dce921335a539d7.png

上手

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

  • @swc/cli 類似于 @babel/cli;

  • @swc/core 類似于 @babel/core;

npm?i?-D?@swc/cli?@swc/core

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

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

下面是 source.js 的代碼:

const?start?=?()?=>?{console.log('app?started')
}

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

ce14551ff58b23ed95b22409b7cecca5.png

配置文件

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

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

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

Node APIs

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

//?swc.mjs
import?{?readFileSync?}?from?'fs'
import?{?transform?}?from?'@swc/core'const?run?=?async?()?=>?{const?code?=?readFileSync('./source.js',?'utf-8')const?result?=?await?transform(code,?{filename:?"source.js",})//?輸出編譯后代碼console.log(result.code)
}run()
201e7fb8e69a3b56ee096d4f3aab680a.png

打包代碼

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

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

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

//?spack.config.js
module.exports?=?{entry:?{//?打包的入口web:?__dirname?+?"/src/index.js",},output:?{//?打包后輸出的文件夾path:?__dirname?+?"/dist",},
};

然后在命令行運行:

$?npx?spack
4d7b202de43753918ee0ee1ed3a79bb3.png

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

9aec54ae7fcaebd2f1ace6385f6665cc.png

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

能不能用?

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

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

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

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

a501aafa858d34055578596b13615799.png

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

//?.swcrc
{"jsc":?{"externalHelpers":?true}
}
22429608e07a13fe5413d13001983091.png

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

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

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

- END -

d0d4e7ce4e250cc5c35385d113781b9a.gif

·················?若川簡介?·················

你好,我是若川,畢業于江西高校。現在是一名前端開發“工程師”。寫有《學習源碼整體架構系列》20余篇,在知乎、掘金收獲超百萬閱讀。
從2014年起,每年都會寫一篇年度總結,已經寫了7篇,點擊查看年度總結。
同時,最近組織了源碼共讀活動,幫助3000+前端人學會看源碼。公眾號愿景:幫助5年內前端人走向前列。

943740439505892b3ee941870f37bcc1.png

識別方二維碼加我微信、拉你進源碼共讀

今日話題

略。分享、收藏、點贊、在看我的文章就是對我最大的支持~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274984.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274984.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274984.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開始學習jQuery和準備工作

<script>$(document).ready(function(){}); 首先&#xff0c;在頁面頂部添加一行script元素&#xff0c;然后在下一行寫上結束符。 瀏覽器會運行script里所有的Javascript&#xff0c;包括jQuery。 在你的script元素里&#xff0c;添加這段代碼&#xff1a;$(document).r…

粉紅噪音_粉紅的常綠力量

粉紅噪音I use Instagram. But I don’t use Instagram in the way that my daughters, who are 21 and 14, use Instagram. More to the point, Instagram doesn’t use me in quite the same way it uses my daughters.我使用Instagram。 但是&#xff0c;我不會像21歲和14歲…

Sql Server 中存儲過程的output return的區別

看http://zxianf.blog.163.com/blog/static/301207012009114104124969/中片關于Sql Server中存儲過程output和return值的區別 在里面有講解&#xff0c;我在自己本機中測試的結果如下&#xff0c; 1&#xff1a;ReturnValue只能返回0,1,-1這樣的數據&#xff0c;局限性很大 &am…

1個月增長15000 star,zx 庫寫shell腳本真不錯~

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。今天來討論一個牛逼…

灰色邊框陰影_50種暗模式灰色陰影

灰色邊框陰影If you’re an avid dark mode user like me, you’ll know that dark mode isn’t just about white text on black backgrounds. In a single app, a handful of shades of gray give the app some depth. And across various apps, the spectrum of gray become…

Android源代碼下載

為什么80%的碼農都做不了架構師&#xff1f;>>> Android代碼使用git管理, 所以關于Android源碼下載一般來說要安裝git. 本文是講述只使用Eclipse完成Android源碼下載和關聯. 下載Eclipse,目前最新版本是Juno,自帶了EGit插件-->Eclipse Git插件 那么可以使用EGit…

關于nginx調轉404錯誤頁面

在server{}模塊添加如下&#xff1a; error_page 404 /404.html; location /404.html { root /var/www/html/sina/; #“404目錄地址” }轉載于:https://www.cnblogs.com/alang85/archive/2012/03/01/404_error.html

尤雨溪:Vue 3 將成為新的默認版本

過完年&#xff0c;大年初七&#xff0c;Vue3 將成為默認版本&#xff0c;這時感覺我之前寫的幾篇文章都可以抽空更新一版了。尤雨溪推薦神器 ni &#xff0c;能替代 npm/yarn/pnpm &#xff1f;簡單好用&#xff01;源碼揭秘&#xff01;Vue 3.2 發布了&#xff0c;那尤雨溪是…

shell編程系列20--文本處理三劍客之awk常用選項

shell編程系列20--文本處理三劍客之awk常用選項awk選項總結選項 解釋 -v 參數傳遞 -f 指定腳本文件 -F 指定分隔符 -V 查看awk的版本號[rootlocalhost shell]# awk -v num2"$num1" -v var1"$var" BEGIN{print num2,var…

v-charts加載動畫_加載動畫-用戶體驗寫作練習

v-charts加載動畫Many new UX writers often struggle to find the balance between creativity and clarity. You can’t make everything fun/exciting/interesting as it can have an adverse effect on usability. But there are times when you can add a bit of flair.許…

linux 常用命令收集

關機&#xff1a;poweroff&#xff0c;shutdown -h now&#xff0c;init 0重啟&#xff1a;reboot&#xff0c;shutdown -r now&#xff0c;init 6 關閉x-window&#xff1a;init 3啟動x-window&#xff1a;init 5&#xff0c;start x1.終止命令&#xff1a;ctrlc 2.結束輸入…

34歲回顧人生,也怕中年危機!

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。最近發生一件令人感…

蛋花花APP,APP開發這幾點你要注意了

蛋花花君又來了&#xff0c;這次蛋花花君為大家分享的是APP開發過程中需要注意的幾點。 1、用戶體驗 程序猿蛋花花覺得&#xff0c;APP開發是為客戶來開發的&#xff0c;而不單單是為了老板&#xff0c;畢竟真正使用的是廣大用戶。APP的設計應該從用戶的角度出發&#xff0c;提…

svg動畫制作_制作第一個SVG動畫

svg動畫制作Story of a designer trying to code animations instead of asking a dev to figure it out.一位設計師嘗試編寫動畫代碼而不是要求開發人員弄清楚動畫的故事。 編碼動畫是Webdesign的未來 (Coded animations are the future of Webdesign) Because we have acces…

網站前端設計,從960框架開始

一個網站進入到前端設計階段&#xff0c;第一步肯定是為全站搭建一個統一的&#xff0c;基礎的HTML模型&#xff0c;在這里推薦一下我剛學習的960框架。960是一個CSS框架&#xff0c;你肯定在想&#xff0c;這個世界肯定是瘋了&#xff0c;連CSS都有框架了嗎&#xff0c;沒錯&a…

60+ 實用 React 工具庫,助力你高效開發!

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。最近看到一些實用的…

2012年12月第二個周末

2019獨角獸企業重金招聘Python工程師標準>>> 這周&#xff0c;裝上了windows版的 Linux版的oracle 熟悉了下SQL*PLUS的編程規則&#xff0c;還有常用的linux命令 看了一本《簡愛》 正在看oracle 轉載于:https://my.oschina.net/u/204616/blog/545513

『C#基礎』調用CMD的一個小工具

由于經常要使用CMD的一些命令&#xff0c;比如查看IP&#xff0c;Ping一個網址之類的。于是就寫了一個調用CMD.exe的小工具。 主要就是實現這樣一個事情&#xff1a;調用CMD.exe然后傳給它我想要執行的命令&#xff0c;最后獲取結果。 界面&#xff1a; 代碼&#xff1a; 主要執…

小姐姐:如何參與大型開源項目-Taro 共建

大家好&#xff0c;我是若川。持續組織了5個月源碼共讀活動&#xff0c;感興趣的可以點此加我微信 ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。同時極力推薦訂閱我寫的《學習源碼整體架構系列》 包含20余篇源碼文章。“本文來自前端程序…

JavaWeb學習總結(十七)——JSP中的九個內置對象

2019獨角獸企業重金招聘Python工程師標準>>> 一、JSP運行原理 每個JSP 頁面在第一次被訪問時&#xff0c;WEB容器都會把請求交給JSP引擎&#xff08;即一個Java程序&#xff09;去處理。JSP引擎先將JSP翻譯成一個_jspServlet(實質上也是一個servlet) &#xff0c;然…