1. 程式人生 > >ES6第一篇 ES6簡介 和轉碼器等介紹

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學習第一(letconst命令)

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,美國標準資訊交換程式碼)是基於拉丁字母的一套電腦編碼系

深入理解定時系列第一——理解setTimeoutsetInterval

前面的話   很長時間以來,定時器一直是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