ajhsu / blog

The external storage of my brain.
3 stars 0 forks source link

Understanding ECMAScript, TC39, and Babel #39

Open ajhsu opened 7 years ago

ajhsu commented 7 years ago

預防針 💉

小弟我也只是略懂略懂

名詞解釋

ECMAScript

1995 => LiveScript => JavaScript 1997 => 成為 ECMA-262 (ECMAScript)

Ecma International

TC39

TC (Technical Committees) => 在 Ecma International 裡頭負責制定規格的委員會

TC39 => 負責 ECMAScript 的委員會 (https://www.ecma-international.org/memento/TC39.htm)

Stage 0, 1, 2, 3, 4

TC39 Process (https://tc39.github.io/process-document/) Babel Stage-X (https://babeljs.io/docs/plugins/#presets-stage-x-experimental-presets-)

Stage 0 => Strawman => 任何人都可以提案,可能只是一個想法而已 Stage 1 => Proposal => 初步描述語法、語義、演算法、使用情境及範例 Stage 2 => Draft => 規格草稿,使用正式的文件描述語法及語義 Stage 3 => Candidate => 完成規格,必須針對使用者的回饋做修正 Stage 4 => Finished => 即將進入 ECMAScript 標準

簡單來說,Stage 3 以前都還不是標準,所以使用了 Stage 3 以前的任何標準,都要有未來會改變的心理準備。

Examples: https://github.com/tc39/proposals

Stage-3 範例:


JavaScript Engine

JavaScript => JavaScript Engine

ECMAScript 2015+ 相容性

開發者 <=> 瀏覽器 存在支援度參差不齊的問題

依照木桶理論:你必須支援到最低標準,才能涵蓋到所有瀏覽器


Babel

有沒有辦法使用新的語法,然後又能讓舊版瀏覽器支援的方法?

ECMAScript 6,7,8,9 => 翻譯 => ECMAScript 5

讓開發者可以直接使用新的語法,與所有瀏覽器溝通

                       => 瀏覽器 A
開發人員  => Babel 翻譯  => 瀏覽器 B
                       => 瀏覽器 C

如果 Babel 學會額外的新語法 (Plugin),一樣能夠翻譯給瀏覽器看

                                    => 瀏覽器 A
開發人員  => Babel 翻譯 + 未定案的語法  => 瀏覽器 B
                                    => 瀏覽器 C
開發者  <===>  Babel  <===>  TC39委員會

What Babel(Compiler) does

主要分為三階段

  解析          修改           輸出
Parsing => Transforming => Generation

           ^ Plug-ins ^

所以說,其實會變成

JavaScript  =>  AST  =>  亂搞  =>  AST  =>  JavaScript

AST = Abstract Syntax Tree = 抽象語法樹

Demo: https://astexplorer.net/

也就是

ES6 => 翻譯 => ES5

=======> 所以說 Plug-in 才是本體 <=========

類似的概念有 Gulp, Webpack, PostCSS

Plug-in (Syntax transformer)


A Plug-in = A new syntax

 一個外掛  = 一個新語法

Ref: https://babeljs.io/docs/plugins/#transform-plugins

Presets

ES2015, 2016, 2017 and ENV

ES2015

ES2016

ES2017

其實 ES2015 就夠用了

babel-preset-react => React, JSX babel-preset-latest => 2015 + 2016 + 2017

babel-preset-env

給定執行環境參數,依照環境編譯。(推薦作法)

// browserslist string
"browsers": [
  "last 2 versions",
  "ie 6-8"
]

Babel 使用情境

Fast-prototyping

開發/正式環境

測試框架


.babelrc

{
  "presets": [
    "es2015",
    "react",
    "stage-2"
  ],
  "plugins": [
    "transform-decorators-legacy",
    "transform-class-properties"
  ]
}

Ordering matters


Takeaway


References

https://naturefeng.github.io/2016/09/22/%E5%A6%82%E4%BD%95%E6%9B%B4%E5%A5%BD%E7%9A%84%E4%BA%86%E8%A7%A3ECMAScript/


課外讀物

ISO

GMT 格林威治標準時間 (Greenwich Mean Time) => 以天文台時間為基準,但因地球自轉不規則,已經不參考 UTC 世界協調時間 (Universal Time Coordinated) => 以原子鐘為基準,GMT 的替代品