ES6第一篇 ES6簡介 和轉碼器等介紹
一、什麼是ES6?ES6和ES2015的關係?ECMAScript和JavaScript的關係?
JavaScript的創造者是Netscape公司,後將JavaScript提交給標準化組織ECMA,希望這種語言能夠成為國際標準,ECMA規定的瀏覽器指令碼語言標準就稱之為ECMAScript,,該標準一開始就是針對JavaScript 語言制定的,之所以不叫JavaScript,有兩個原因。一是商標,根據授權協議,只有Netscape公司可以使用JavaSciipt 這個名字,且JavaScript本身也已經被Netscape公司註冊為商標了。二是想體現這門語言的制定者是ECMA,不是Netscape,這樣有利於保證這門語言的開放性和中立性。
ES6(ECMAScrpit 6.0)是一個泛指,是指ECMAScript 5.1版以後的JavaScript的下一代標準,包括ECMA2015(ECMA標準化組織2015年6月釋出的版本)、ECMA2016(ECMA標準化組織2016年6月釋出的版本)、ECMA2017(ECMA標準化組織2017年6月釋出的版本)等等。
二、Babel轉碼器
Babel是一個廣泛使用的ES6轉碼器,可以將 ES6 程式碼轉為 ES5 程式碼,從而在現有環境執行。
三、配置檔案.babelrc
Babel 的配置檔案是 .babelrc ,存放在專案的根目錄下。使用 Babel 的第一步,就是配置這個檔案。
該檔案用來設定轉碼規則和外掛,基本格式如下。
{
"preset": [],
"plugins": []
}
presets 欄位設定轉碼規則,官方提供以下的規則集,可根據需要再安裝。
# 最新轉碼規則
$ npm install --save-dev babel-preset-latest
# react 轉碼規則
$ npm install --save-dev babel-preset-react
# 不同階段語法提案的轉碼規則(共有4個階段),選裝一個
$ npm install --save-dev babel-preset-stage-0
$ npm install --save-dev babel-preset-stage-1
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-stage-3
然後將這些規則加入 .babelrc。
{
"presets": [
"latest",
"react",
"stage-2"
],
"plugins": []
}
需要注意的是,以下所有 Babel 工具和模組的使用,都必須先寫好 .babelrc 。
3.1 命令列轉碼 babel-cli
其安裝命令如下:
$ npm install --global babel-cli
基本用法如下:
# 轉碼結果輸出到標準輸出
$ babel example.js
# 轉碼結果寫入一個檔案
# --out-file 或 -o 引數指定輸出檔案
$ babel example.js --out-file compiled.js
# 或者
$ babel example.js -o compiled.js
# 整個目錄轉碼
# --out-dir 或 -d 引數指定輸出目錄
$ babel src --out-dir lib
# 或者
$ babel src -d lib
# -s 引數生成source map檔案
$ babel src -d lib -s
上面的程式碼是在全域性環境下,進行Babel轉碼。如果專案要執行,全域性環境必須有 Babel ,也就是說專案產生了對環境的依賴。但這樣做不能夠支援不同專案使用不同版本的 Babel 。
不過可以將 babel-cli 安裝在專案之中
# 安裝
$ npm install --save-dev babel-cli
然後改寫 package.json .
{
// ...
"devDependencies": {
"babel-cli": "^6.0.0"
},
"scripts": {
"build": "babel src -d lib"
},
}
轉碼的時候,就進行下面的命令;
$ npm run build
3.2 babel-node
babel-cli 工具自帶一個 babel-node 命令,提供一個支援 ES6 的 REPL(互動執行,互動式直譯器) 環境。 它支援 Node 的 REPL 環境的所有功能,而且可以直接執行 ES6 程式碼。它不用安裝,而是隨著 babel-cli 一起安裝。然後執行 babel-node 就進入 REPL 環境
$ babel-node
> (x => x * 2)(1)
2
babel-node 命令可以直接執行 ES6 指令碼,將上面的程式碼放入指令碼檔案 es6.js ,然後這屆執行
$ babel-node es6.js
2
babel-node 也可以安裝在專案中。
$ npm install --save-dev babel-cli
然後改寫package.json
{
"scripts": {
"script-name": "babel-node script.js"
}
}
上面程式碼中,使用 babel-node 替代 node,這樣script.js本身就不用做任何程式碼處理
3.3 babel-register
babel-register 模組改寫 require 命令,為它加上一個鉤子。此後每當使用require載入.js、.jsx、.es和.es6字尾名的檔案,就會先用 Babel 進行轉碼
$ npm install --save-dev babel-register
使用時,必須首先載入 babel-register
require("babel-register");
require("./index.js");
這樣就不需要手動對 index.js 轉碼了。
需要注意的是,babel-register只會對require命令載入的檔案轉碼,而不會對當前檔案轉碼。另外由於它是實時轉碼,所以只適合在開發環境下使用
3.4 babel-core
如果某些程式碼需要使用 Babel 的 API 進行轉碼,就要使用 babel-core 模組。
安裝命令如下:
$ npm install babel-core --save
再在專案中就可以呼叫 babel-core
var babel = require('babel-core');
// 字串轉碼
babel.transform('code();', options);
// => { code, map, ast }
// 檔案轉碼(非同步)
babel.transformFile('filename.js', options, function(err, result) {
result; // => { code, map, ast }
});
// 檔案轉碼(同步)
babel.transformFileSync('filename.js', options);
// => { code, map, ast }
// Babel AST轉碼
babel.transformFromAst(ast, code, options);
// => { code, map, ast }
下面是一個例子。
var es6Code = 'let x = n => n + 1';
var es5Code = require('babel-core')
.transform(es6Code, {
presets: ['latest']
})
.code;
// '"use strict";\n\nvar x = function x(n) {\n return n + 1;\n};'
上面程式碼中,transform方法的第一個引數是一個字串,表示需要被轉換的ES6程式碼,第二個引數是轉換的配置物件
3.5 babel-polyfill
Babel 預設只轉換新的 JavaScript句法(syntax),而不轉換新的API,比如 Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全域性物件,以及一些定義在全域性物件上的方法(比如object.assign)都不會轉碼。
舉例說,ES6在Array物件上新增了Array.from方法。Babel就不會轉碼這個方法。如果想要讓這個方法執行,就必須使用babel-polyfill,為當前環境提供一個墊片而。
安裝命令如下:
$ npm install --save babel-polyfill
再在指令碼頭部,加入如下一行程式碼:
import 'babel-polyfill';
// 或者
require('babel-polyfill');
Babel預設的不轉碼的API非常多,詳細清單可以檢視
babel-plugin-transform-runtime
模組的definitions.js檔案。線上轉換
Babel 提供一個REPL 線上編輯器 ,可以線上將 ES6 程式碼轉換為 ES5 程式碼。轉換後的程式碼可以直接作為 ES5 程式碼插入網頁執行。
四、Traceur
Google 公司的Traceur轉碼器,也可以將 ES6 轉碼為 ES5程式碼。
4.1 直接插入網頁
Traceur 允許將ES6 程式碼直接插入網頁。首先需在網頁頭部載入 TRaceur 庫檔案
<script src="https://google.github.io/traceur-compiler/bin/traceur.js"></script>
<script src="https://google.github.io/traceur-compiler/bin/BrowserSystem.js"></script>
<script src="https://google.github.io/traceur-compiler/src/bootstrap.js"></script>
<script type="module">
import './Greeter.js';
</script>
上面程式碼中,第一個script標籤是載入Traceur 的庫檔案,第二個和第三個是將這個庫檔案用於瀏覽器環境,第四個是載入使用者指令碼,這個指令碼中可以使用 ES6 程式碼。
注意:第四個script標籤的type屬性的值是module,而不是text/javascript 。這是Traceur 編輯器識別 ES6程式碼的標誌,編輯器會自動將所有type=module的程式碼編譯為 ES5,r然後再交給瀏覽器執行。
除了引用外部的 ES6 指令碼,也可以直接在網頁中放置 ES6 程式碼。
<script type="module">
class Calc {
constructor() {
console.log('Calc constructor');
}
add(a, b) {
return a + b;
}
}
var c = new Calc();
console.log(c.add(4,5));
</script>
如果還想對 Traceur 的行為有精確控制,可以採用下面引數配置的寫法。
<script>
// Create the System object
window.System = new traceur.runtime.BrowserTraceurLoader();
// Set some experimental options
var metadata = {
traceurOptions: {
experimental: true,
properTailCalls: true,
symbols: true,
arrayComprehension: true,
asyncFunctions: true,
asyncGenerators: exponentiation,
forOn: true,
generatorComprehension: true
}
};
// Load your module
System.import('./myModule.js', {metadata: metadata}).catch(function(ex) {
console.error('Import failed', ex.stack || ex);
});
</script>
上面程式碼中,首先生成 Traceur 的全域性物件 window.System,然後System.import方法可以用來載入 ES6。載入的時候,需要傳入一個配置物件metadata,該物件的traceurOptions屬性可以配置支援 ES6 功能。如果設為experimental:true,就表示除了 ES6以外,還支援一次阿實驗性的新功能。
線上轉換
Traceur 也提供一個線上編譯器,可以線上將
ES6 程式碼轉為 ES5 程式碼。轉換後的程式碼,可以直接作為 ES5 程式碼插入網頁執行。
命令列轉換
作為命令列工具使用時,Traceur是一個Node 的模組
$ npm install -g traceur
Traceur 直接執行 ES6 指令碼檔案,會在標準輸出顯示執行結果,以前面的calc.js為例
$ traceur calc.js
Calc constructor
9
如果要將 ES6 指令碼轉為 ES5儲存,要採用下面的寫法。
$ traceur --script calc.es6.js --out calc.es5.js
上面的程式碼的--script選項表示指定輸入檔案,--out選項表示指定輸出檔案。
為防止有些特性編譯不成功,最好加上--experimental選項。
$ traceur --script calc.es6.js --out calc.es5.js --experimental
命令列下轉換生成的檔案,就可以直接放到瀏覽器中執行。
Node 環境的用法
Traceur 的 Node 用法如下(假定已安裝traceur
模組)。
var traceur = require('traceur');
var fs = require('fs');
// 將 ES6 指令碼轉為字串
var contents = fs.readFileSync('es6-file.js').toString();
var result = traceur.compile(contents, {
filename: 'es6-file.js',
sourceMap: true,
// 其他設定
modules: 'commonjs'
});
if (result.error)
throw result.error;
// result 物件的 js 屬性就是轉換後的 ES5 程式碼
fs.writeFileSync('out.js', result.js);
// sourceMap 屬性對應 map 檔案
fs.writeFileSync('out.js.map', result.sourceMap);
注:本文是參考阮一峰的ECMAScript 6入門編寫,希望對你有幫助。
相關推薦
ES6第一篇 ES6簡介 和轉碼器等介紹
一、什麼是ES6?ES6和ES2015的關係?ECMAScript和JavaScript的關係? JavaScript的創造者是Netscape公司,後將JavaScript提交給標準化組織ECMA,希望這種語言能夠成為國際標準,ECMA規定的瀏覽器指令碼語言標準就稱之為E
es6學習第一篇(let和const命令)
let和const 命令 let命令 1、es6新增了let命令,用來宣告變數。它的用法和var 類似,但是let宣告的變數,只在let命令所在的程式碼塊內有效。 { let a = 10 var b = 1 } console.log(a) //referenc
Babel 轉碼器 § es6轉換es5
exe 替代 logs 腳本文件 rip per 開發 -c class Babel 轉碼器 § es6轉換es5 實時轉碼 / Repl -babel-node / babel-register(自動轉碼引入babel-register模塊) 配置文件.babelrc
深入淺出ES6---第一篇
ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準。因為當前版本的ES6是在2015年釋出的,所以又稱ECMAScript 2015。雖然目前並不是所有瀏覽器都能相容ES6全部特性,但越來越多的程式設計師在實際專案當中已經開始使用E
es6 Babel 轉碼器對修飾器的支援
Babel 轉碼器對修飾器的支援 目前,Babel 轉碼器已經支援 Decorator。 首先,安裝babel-core和babel-plugin-transform-decorators。由於後者包括在babel-preset-stage-0之中,所以改為安裝bab
第一篇:白話tornado源碼之一個腳本引發的血案
之間 監聽 start 部分 soc 一場 cal client 創建服務 本系列博文計劃: 1、剖析基於Python的Web框架Tornado的源碼 2、為Python開發一個完善的MVC框架 首先將帶著大家一起來剖析基於python編寫的Web
第一篇:Spark SQL源碼分析之核心流程
example 協議 bst copyto name 分詞 oop 不同 spl /** Spark SQL源碼分析系列文章*/ 自從去年Spark Submit 2013 Michael Armbrust分享了他的Catalyst,到至今1年多了,Spark SQ
JAVA並行框架Fork/Join(一):簡介和代碼示例
over 框架設計 put 分割 gif 得到 java owa trace 一、背景 雖然目前處理器核心數已經發展到很大數目,但是按任務並發處理並不能完全充分的利用處理器資源,因為一般的應用程序沒有那麽多的並發處理任務。基於這種現狀,考慮把一個任務拆分成多個單元,每個單元
我的第一篇部落格和其中的思考
大四在杭州同花順實習,轉正後, 然後一年後離開了杭州 到了成都 以前不寫部落格也是因為覺得, 技術水平還麼有達到 寫的時間可以學習更多的東西, (每天除了工作10小時, 平均有2小時在自學) 由於工作地方的轉變, 團隊的變化, 整個人的思維也會變化, &n
關於字元的編碼和轉碼URLEncode URLDecode
URLEncode方法是把任何我們給出的引數轉換成適合放在URL中的字串。具體規則: 1。字母,數字,連字元不變。 2。空格轉換成加號。 3。其他所有的字元
Spring Cloud第一篇 Eureka簡介及原理
Eureka是Netflix開發的服務發現元件,本身是一個基於REST的服務。Spring Cloud將它整合在其子專案spring-cloud-netflix中,以實現Spring Cloud的服務發現功能。目前Eureka 專案相當活躍,程式碼更新相當頻繁,目前最新的版本是1.5.5
Groovy第一篇:簡介
Groovy(讀做:gu : ru : wei) Groovy是一種執行在jvm上的動態語言,它吸取了Python、Ruby和SmallTalk等語言的優點;在Java的基礎之上增加了許多特色功能,相比Java語法更易懂,易上手除錯;無縫集成了Java的類庫,編譯後的.groovy也是以class形式出現。
Python基礎知識之字元編碼和轉碼
字元編碼 python直譯器在載入.py檔案中的程式碼時,會對內容進行編碼(預設ASCII) ASCII碼 ASCII(American Standard Code for Information Interchange,美國標準資訊交換程式碼)是基於拉丁字母的一套電腦編碼系
深入理解定時器系列第一篇——理解setTimeout和setInterval
前面的話 很長時間以來,定時器一直是javascript動畫的核心技術。但是,關於定時器,人們通常只瞭解如何使用setTimeout()和setInterval(),對它們的內在執行機制並不理解,對於與預想不同的實際執行狀況也無法解決。本文將詳細介紹定時器的相關內容 setTimeout()
javascript面向物件系列第一篇——建構函式和原型物件
前面的話 一般地,javascript使用建構函式和原型物件來進行面向物件程式設計,它們的表現與其他面向物件程式語言中的類相似又不同。本文將詳細介紹如何用建構函式和原型物件來建立物件 建構函式 建構函式是用new建立物件時呼叫的函式,與普通唯一的區別是建構函式名應該首字母大寫 func
關於使用阿里雲OSS物件儲存上傳大視訊和轉碼的一些心得
這裡寫程式碼片 import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import j
NodeJs第一篇.模組定義和引用。
第一種方式定義模組。 var name = "" exports.setName = function (thename) { name = thename; } exports.sayH
第一篇 IDEA安裝和基本配置使用
最近在學習新技術時,發現許多教程都是使用IDEA開發的。因為原來使用eclipse,感覺不想換別的開發工具了。但是因為構建專案時,IDEA和eclipse還是有許多不同,因此準備把自己學習實用IDEA的資料記錄下。畢竟網上好多實用教程那叫一個囉嗦,還竟是沒用的配置。因為是ec
Python實現批量處理檔案的縮排和轉碼問題
最近把很久前的C程式碼傳到Github上的時候,發現全部上百個原始檔的程式碼縮排都變成了8格,而且裡面的中文都出現了亂碼,所以決定寫個程式來批量處理所有檔案的格式。這段關於轉碼的程式碼可以適用於很
1.Babel轉碼器
assign -c module array對象 compile maps 轉換器 form turn 為什麽要使用Babel? 在當代環境中雖然對ES6的支持越來越好,但是大多數還是不支持ES6,這時候我們就需要把已經寫好的ES6代碼轉換成ES5,而Babel就是將ES6