偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

開(kāi)發(fā) 開(kāi)發(fā)工具
最近前端圈掀起了一陣 rust 風(fēng),凡是能用 rust 重寫(xiě)的前端工具就用 rust 重寫(xiě),今天介紹的工具就是通過(guò) rust 實(shí)現(xiàn)的 bable:swc,一個(gè)將 ES6 轉(zhuǎn)化為 ES5 的工具。

最近前端圈掀起了一陣 rust 風(fēng),凡是能用 rust 重寫(xiě)的前端工具就用 rust 重寫(xiě),今天介紹的工具就是通過(guò) rust 實(shí)現(xiàn)的 bable:swc,一個(gè)將 ES6 轉(zhuǎn)化為 ES5 的工具。

而且在 swc 的官網(wǎng),很直白說(shuō)自己和 babel 對(duì)標(biāo),swc 和 babel 命令可以相互替換,并且大部分的 babel 插件也已經(jīng)實(shí)現(xiàn)。

使用 rust 的一個(gè)優(yōu)勢(shì)就是快,比如我們之前的一個(gè)項(xiàng)目,將 babel 替換成 swc 后,編譯速度從原來(lái)的 7 秒提升到了 1 秒,效率直接爆炸。

上手

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

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

通過(guò)如下命令,可以將一個(gè) ES6 的 JS 文件轉(zhuǎn)化為 ES5。

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

下面是 source.js 的代碼:

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

代碼中囊括了 ES6 的兩個(gè)特性,const 聲明 和 箭頭函數(shù)。經(jīng)過(guò) swc 轉(zhuǎn)化后,這兩個(gè)特性分別被轉(zhuǎn)化成了 var 聲明 和 function 匿名函數(shù)。

配置文件

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

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

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

Node APIs

通過(guò)在 node.js 代碼中,導(dǎo)入 @swc/core 模塊,可以在 node.js 中調(diào)用 api 直接進(jìn)行代碼的編譯,這對(duì) CLI 工具的開(kāi)發(fā)來(lái)說(shuō)是常規(guī)操作。

  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() 

打包代碼

除了將代碼轉(zhuǎn)義,swc 還提供了一個(gè)簡(jiǎn)易的打包能力。我們新建一個(gè) src 文件夾,在里面新建兩個(gè)文件: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 導(dǎo)入了 utils.js 中的一個(gè)方法,然后我們新建一個(gè) 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. }; 

然后在命令行運(yùn)行:

  1. $ npx spack 

打包成功后,會(huì)在 dist 目錄輸出一個(gè) web.js 文件。

可以看到,不僅將 index.js、utils.js 打包成了一個(gè)文件,還進(jìn)行了 tree shaking,將 utils.js 中沒(méi)有使用的 errorLog 方法刪掉了。

能不能用?

babel 畢竟經(jīng)過(guò)了這么多年的發(fā)展,不管是 bug 輸了,還是社區(qū)活躍度都遠(yuǎn)遠(yuǎn)優(yōu)于 swc。所以,如果是小產(chǎn)品試水還是可以試一下 swc 的,舊項(xiàng)目如果已經(jīng)使用了 babel 還是不建議進(jìn)行遷移。

在使用的過(guò)程,還是發(fā)現(xiàn)了一些小問(wèn)題。比如,如果我使用了 async function,swc 會(huì)自動(dòng)導(dǎo)入 regenerator-runtime 模塊。

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

調(diào)用 swc 編譯后,代碼如下:

這個(gè)結(jié)果看起來(lái)是沒(méi)問(wèn)題的,但是 swc 與 babel 類(lèi)似,也有 helpers(@swc/helpers),同時(shí)提供了 externalHelpers 開(kāi)關(guān), 如果把 externalHelpers 設(shè)置為 true,swc 會(huì)將一些工具類(lèi),通過(guò)模塊的形式導(dǎo)入。

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

而 externalHelpers 的默認(rèn)值是 false,那這個(gè)時(shí)候,regenerator-runtime ,到底是通過(guò)模塊的形式導(dǎo)入,還是把整個(gè)代碼寫(xiě)入到文件?

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

除了上面說(shuō)的這個(gè)問(wèn)題,其實(shí)還有一點(diǎn),就是作者覺(jué)得之前的架構(gòu)有問(wèn)題,正在加緊重寫(xiě) 2.0 版本,感覺(jué)可以期待一下,另外提一句,swc 的作者是一個(gè) 97 年的韓國(guó)小哥,目前大學(xué)都還沒(méi)畢業(yè),最后我也只能說(shuō)一句:牛逼!

【編輯推薦】

 

責(zé)任編輯:姜華 來(lái)源: 自然醒的筆記本
相關(guān)推薦

2023-11-20 08:18:49

Netty服務(wù)器

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-11-11 19:09:13

架構(gòu)

2023-11-08 08:15:48

服務(wù)監(jiān)控Zipkin

2023-10-27 08:15:45

2022-02-24 07:34:10

SSL協(xié)議加密

2020-02-02 15:14:24

HTTP黑科技前端

2022-05-16 09:14:28

前端構(gòu)建工具

2021-12-16 12:42:18

AIoT人工智能物聯(lián)網(wǎng)

2024-02-04 09:44:41

量子計(jì)算量子量子物理

2022-04-28 09:22:46

Vue灰度發(fā)布代碼

2022-09-29 13:09:38

DataClassPython代碼

2020-10-08 14:32:57

大數(shù)據(jù)工具技術(shù)

2025-01-15 09:06:57

servlet服務(wù)器Java

2019-06-13 15:38:34

甲骨文OracleExadata

2018-10-22 08:14:04

2023-12-06 16:28:56

2022-09-06 11:21:49

光網(wǎng)絡(luò)光纖

2019-07-04 15:16:52

數(shù)據(jù)挖掘大數(shù)據(jù)算法

2022-02-18 10:13:07

SolrElasticSea開(kāi)源
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)