閱讀133 返回首頁    go 阿裏雲 go 技術社區[雲棲]


es6(1)——Babel

Babel

參考阮一峰的文章所寫。

已細化重點知識,確保可以按步驟複現。並省略某些不常用的內容

解釋:

1. 簡單來說,就是可以把ES6的代碼轉換成ES5的代碼,這樣你就可以在ES5的環境中運行ES6而不必擔心兼容性了;
2. ES7的轉換也可以靠這個來完成;
3. 其是放置在node_modules文件夾下的插件,就像使用其他通過npm install安裝的插件一樣使用;
4. 默認隻轉換語法,不轉換API。比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局對象,以及一些定義在全局對象上的方法(比如Object.assign)都不會轉碼。

【使用方法】

1. 在項目的根目錄下創建一個文件,文件名是.babelrc,記得放在項目根目錄(一般是和package.json還有readme.md同一個目錄下);
2. 注意1:上麵那個文件,在windows下不能直接創建(會提示說必須輸入文件名),  
   解決方法1:用linux、mac或者用IDE(比如webstorm)來創建;
   解決方法2:從我的github中直接下載文件
3. 注意2:那個文件的babelrc就是後綴名,而不是txt格式的(所以會提示沒有文件名);
4. 用編譯器打開(或者用記事本打開也行,注意編碼格式是UTF8),文件內基本格式如下:

    {
      "presets": [],
      "plugins": []
    }

5. 這個文件用於設置轉碼規則和插件;
6. presets是轉碼規則,值的數組裏麵,填寫規則。
7. plugins是插件,有需要就寫,不需要的話這個可以省略。
8. 按需安裝轉碼規則(見下麵);
9. 將對應的字符串添加到.babelrc中(千萬別忘了,我試了半天總轉失敗,結果發現我沒加)
10. 運行轉碼命令/內嵌到package.json裏在項目運行時轉碼;

轉碼規則和轉碼安裝:

1. 首先應該安裝對應的轉碼規則集(他的規則像安裝npm插件一樣安裝);
2. 然後在"presets"這個數組中填寫對應的值;
3. 官方提供的規則集如下(轉自[阮一峰的博客](https://es6.ruanyifeng.com/)):

        注:
        $表示命令行,實際輸入的時候從npm開始輸入(應該不會有人不知道吧);
        #表示注釋,不要輸這個後麵的文字啊

        # ES2015轉碼規則
        $ npm install --save-dev babel-preset-es2015
        # 添加的字符串為:"es2015"(""表示這是個字符串),下同

        # react轉碼規則
        $ npm install --save-dev babel-preset-react
        # 添加的字符串為:"react"

        # ES7不同階段語法提案的轉碼規則(共有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
        # 添加的字符串為:"stage-0"至"stage-3"中的一個(顯然後麵包含前麵)

4. 安裝完轉碼規則之後(根據實際需要安裝,不用全部裝),在.babelrc文件的"presets"的值中添加對應的字符串作為數組元素,參考上麵;

方法一:全局使用babel-cli轉碼(命令行、單文件、所有文件夾輸出結果)

優點:

1.簡單直接暴力,全局安裝,哪裏都能用;

缺點:

1.項目要求有環境依賴,換了環境不能用(比如說換台電腦,但他沒裝babel-cli就尷尬了);

前置準備:

1. 先配置好,參考【使用方法】
2. 命令行輸入以下代碼,來全局安裝babel-cli工具
       npm install --global babel-cli

步驟:

1.控製台輸出轉換結果(控製台輸出):

1. 命令行輸入以下代碼:(下同,都是控製台輸入)
       babel input.js
2. 然後控製台會輸出以下內容(轉換結果,下同,結果內容都是以下的內容):
       "use strict";

       var input = [];
       input.map(function (item) {
         return item + 1;
       });

2.將轉換結果輸出到指定文件內(單文件轉換):

1. 輸入:
       babel input.js -o output.js
2. 輸出:
       同目錄下自動生成output.js,文件內容是上麵的轉換結果
3. -o表示--out-file,即輸出為文件

3.將一個目錄下的所有文件(遞歸執行)全部轉碼輸出到某個文件夾下(同名轉換):

1. 先建立一個input文件夾,把之前的input.js複製一份進去;
2. 輸入:
       babel input -d output
3. -d表示--out-dir,即輸出到文件夾,前麵的input表示輸入文件夾名,後麵的output表示的是輸出的文件夾名;
4. 輸出:output目錄被創建,裏麵有input文件夾下的同名input.js,但內容是轉換後的
5. input文件下所有文件都會被轉換,轉換過程是遞歸的(即子文件夾下的子文件,甚至更深層也會被轉換);

非全局使用babel-cli轉碼(作為項目的依賴轉碼)

優點:

1.非全局,不要求PC環境全局安裝babel-cli;
2.方便版本管理

缺點:

1.需要配置package.json,比較麻煩一些;

前置準備:

1. 先配置好,參考【使用方法】
2. 修改package.json,添加相應的腳本代碼;
3. 具體來說,根目錄下創建一個package.json,然後文件內容如下:
       {
         "devDependencies": {
           "babel-cli": "^6.0.0"
         },
         "scripts": {
           "build": "babel input -d output"
         }
       }

轉換方法:

1. 先建立一個input文件夾,把之前的input.js複製一份進去;
2. 然後在根目錄(即package.json以及.babelrc所在目錄的控製台輸入:
       npm run build
3. 效果和全局使用的【轉換方法3】是一樣的;

注1:

npm run build裏的build,指的是package.json裏麵,scripts裏的build屬性的屬性名,如果把屬性名改為test,那麼就是npm run test

注2:

npm run build相當於執行了babel input -d output這個指令。隻不過這裏的babel來源於node_modules文件夾下的babel-cli,而不是之前通過控製台運行的全局的babel-cli

其他轉碼

如:

  1. 提供一個可以直接運行ES6的REPL環境,無需轉碼直接運行ES6腳本,點擊直達
  2. 加鉤子,每當使用require加載.js、.jsx、.es和.es6後綴名的文件,自動轉碼點擊直達
  3. 對某些代碼進行轉碼(按需轉碼)點擊直達
  4. 對API進行轉碼 點擊直達
  5. 在瀏覽器環境中實時轉碼(會影響性能,而以上是直接轉完後發給瀏覽器) 點擊直達
  6. 還有在線轉換(輸入ES6代碼,輸出ES5代碼,然後複製拿走使用) 點擊直達%3B)
  7. 還有關於Google公司的Traceur轉碼器,或者是babel和其他框架的配合等,請點擊右方鏈接直達阮一峰的博客來查閱

關於插件

1、例如Object.assign這樣的方法,在IE下不行。那麼就需要用插件

如這個插件:https://babeljs.io/docs/plugins/transform-runtime/

就可以讓IE支持這個功能

或者

另外提一句,Babel默認情況下,是不能轉換Set和Map等數據類型的,引自:

Babel 默認隻轉換新的 JavaScript 句法(syntax),而不轉換新的 API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局對象,以及一些定義在全局對象上的方法(比如Object.assign)都不會轉碼。
舉例來說,ES6在Array對象上新增了Array.from方法。Babel 就不會轉碼這個方法。如果想讓這個方法運行,必須使用babel-polyfill,為當前環境提供一個墊片。

阮一峰

我自己實踐測試來看:

  1. 必須引用babel-polyfill才能正常運行Set和Map類型(不然會報錯);
  2. 引入的方法就是安裝這個插件,然後import或者require他就行;
  3. 但單獨js引入是不行的,需要利用webpack之類的打包(因為一般情況,瀏覽器是不支持直接跑js文件的require語法);

最後更新:2017-06-12 10:31:31

  上一篇:go  4分鍾10萬支,中街1946冰淇淋靠什麼在天貓618大賣?
  下一篇:go  血淚總結!創業公司CTO要避免哪些坑?