javacsript歷史
1995 年網景瀏覽器首次釋出瀏覽器指令碼,給它命名為liveScript,一年後改名javascript。
1996 年,網景將 JavaScript 提交給 ECMA International(歐洲計算機制造商協會) 進行標準化,並最終確定出新的語言標準,它就是 ECMAScript。自此,ECMAScript 成為所有 JavaScript 實現的基礎。
2012年,ECMAScript 第 6 版在六月份公佈之前,又被重新命名為了 ECMAScript 2015(ES2015)
- ECMAScript:一個由 ECMA International 進行標準化,TC39 委員會進行監督的語言。通常用於指代標準本身。
- JavaScript:ECMAScript 標準的各種實現的最常用稱呼。這個術語並不侷限於某個特定版本的 ECMAScript 規範,並且可能被用於任何不同程度的任意版本的 ECMAScript 的實現。
- ECMAScript 5 (ES5):ECMAScript 的第五版修訂,於 2009 年完成標準化。這個規範在所有現代瀏覽器中都相當完全的實現了。
- ECMAScript 6 (ES6) / ECMAScript 2015 (ES2015):ECMAScript 的第六版修訂,於 2015 年完成標準化。這個標準被部分實現於大部分現代瀏覽器。可以查閱這張相容性表來檢視不同瀏覽器和工具的實現情況。
- ECMAScript 2016:第七版 ECMAScript 修訂
- ECMAScript Proposals:被考慮加入未來版本 ECMAScript 標準的特性與語法提案,他們需要經歷五個階段:Strawman(稻草人),Proposal(提議),Draft(草案),Candidate(候選)以及 Finished (完成)。
ECMAScript中間每一個提案,都要依次經過 stage 0、stage 1、stage 2、stage 3、stage 4 五個階段。其中到達 stage4 的為已通過,會出現在下一年的釋出中。到達 stage3 的屬於比較成熟的,極有可能在較小改動的前提下通過併發布,stage3 之前的則不太成熟,stage 越往前越容易大幅改動甚至被完全去掉。所以對於開發者來說,使用 stage 3 之前的語法有一定風險
在這裡可以檢視各個提案的狀態:
- 已通過的:github.com/tc39/propos…
- 活躍討論中的:github.com/tc39/propos…
- 待討論的:github.com/tc39/propos…
- 拒絕的:github.com/tc39/propos…
babel
babel-cli
- 安裝
yarn add babel-cli -D
複製程式碼
- 使用
babel 原始檔 d 編譯後的檔案
複製程式碼
- 配置
在根目錄下建立.babelrc檔案,eg:
{
"preset": [],
"plugins": []
}
複製程式碼
babel-preset
- flow:包含 flow type 所需外掛
- es2015:包含 es2015 語法標準所有相關外掛
- es2016:包含 es2016 語法標準所有相關外掛
- es2017:包含 es2017 語法標準所有相關外掛
- latest:包含從 2015 開始歷年語法標準所有相關外掛
- env:在 latest 基礎上提供環境配置能力,比如可以配置只支援某一個瀏覽器的某幾個版本,會自動按需啟用、禁用外掛
- stage-0:包含處於標準提案 stage 0 階段的語法所有相關外掛
- stage-1:包含處於標準提案 stage 1 階段的語法所有相關外掛
- stage-2:包含處於標準提案 stage 2 階段的語法所有相關外掛
- stage-3:包含處於標準提案 stage 3 階段的語法所有相關外掛
babel-register
只需要引入babel-register就可以執行babel,但不適合生產環境,生產環境應該預先編譯好程式碼,可以在本地使用
- 安裝
yarn add babel-register
複製程式碼
- 使用
// 在入口檔案頂部引入
import 'babel-register'
複製程式碼
babel-polyfill
通過babel編譯過的程式碼並不是所有環境都能執行,babel-polyfill可以在當前執行環境中用來複制尚不存在的API的程式碼,讓開發者可以提前使用還不可用的APIs
- 使用
// 在入口檔案頂部引入
import 'babel-polyfill'
複製程式碼
babel-runtime
babel為了保持生成程式碼的整潔,會把一些為了相容的輔助工具程式碼放進統一的“執行時”中去,就不需要在每個檔案中引入輔助程式碼了,必須安裝babel-plugin-transform-runtime
和 babel-runtime
- 安裝
yarn add babel-plugin-transform-runtime -D
yarn add babel-runtime -D
複製程式碼
- 配置
{
"plugins": [
"transform-runtime",
"transform-es2015-classes"
]
}
複製程式碼
- 效果
// 編譯前
class Foo {
method() {}
}
// 編譯後
import _classCallCheck from "babel-runtime/helpers/classCallCheck";
import _createClass from "babel-runtime/helpers/createClass";
let Foo = function () {
function Foo() {
_classCallCheck(this, Foo);
}
_createClass(Foo, [{
key: "method",
value: function method() {}
}]);
return Foo;
}();
複製程式碼
配置babel
- 外掛
// .babelrc
{
"plugins": [
// 這裡新增外掛
["transform-es2015-classes", { "loose": true }]
]
}
複製程式碼
- 環境
當前環境可以使用 process.env.BABEL_ENV 來獲得。 如果 BABEL_ENV 不可用,將會替換成 NODE_ENV,並且如果後者也沒有設定,那麼預設值是"development"
{
"env": {
// 開發環境配置
"development": {
"plugins": [...]
},
// 生產環境配置
"production": {
"plugins": [...]
}
}
}
複製程式碼
- target
可以配置最低的執行環境
{
"targets": {
"chrome": "58",
"ie": "11"
}
}
複製程式碼
最後
ok!babel的配置和javascript歷史還是挺有關係的,理解了javascript歷史能夠更好的理解babel的配置