天天看點

babel筆記

babel

Babel 是一個工具鍊,主要用于将 ECMAScript 2015+ 版本的代碼轉換為向後相容的 JavaScript 文法,以便能夠運作在目前和舊版本的浏覽器或其他環境中。

大緻看了一些浏覽器對ES6的支援情況,發現主流的浏覽器基本上都是支援ES6的,這就是很多新手沒有用過babel,很榮幸我也是其中的一位。但是随着ES版本的更新,babel還是有用武之地的。

核心庫( @babel/core )

npm install --save-dev @babel/core
           

核心庫常常和其他的庫配合使用。

控制台工具(CLI tool)

控制台工具安裝後可以通過控制台執行babel轉化

npm install --save-dev @babel/core @babel/cli

npx babel src --out-dir lib
# 執行指令後将根目錄下src檔案夾内所有js檔案轉化後移入lib檔案夾中
           

插件(Plugins)

babel提供很多插件用以定制化轉化方法,打開node_modules/@babel有很多以plugin開頭的檔案就是插件

npm install --save-dev @babel/plugin-transform-arrow-functions

npx babel src --out-dir lib --plugins=@babel/plugin-transform-arrow-functions
# 調用插件進行轉換,會将箭頭函數轉為普通函數
           

上面的方式是通過指令行轉換js檔案,如果需要需要很多插件的時候就需要一個配置檔案babel.config.js

const presets = [
  [
    "@babel/env",
    {
      targets: {
        edge: "17",
        firefox: "60",
        chrome: "67",
        safari: "11.1",
      },
    },
  ],
];
/**
 * 插件的三種形式
 * 1、單個插件
 * 2、插件數組
 * 3、參數
 */
const plugins =  ["pluginA", ["pluginA"], ["pluginA", {}]];

module.exports = { presets, plugins };

           

插件的短名稱

如果插件名稱的字首為

babel-plugin-

,你還可以使用它的短名稱:

{
  "plugins": [
    "myPlugin",
    "babel-plugin-myPlugin" // 兩個插件實際是同一個
  ]
}
           

這也适用于帶有冠名(scope)的插件:

{
  "plugins": [
    "@org/babel-plugin-name",
    "@org/name" // 兩個插件實際是同一個
  ]
}
           

預設(Presets)

預設是一種插件的組合,對一些特定環境使用,簡化人為的插件組合。常用的環境有:

  • @babel/preset-env
  • @babel/preset-flow
  • @babel/preset-react
  • @babel/preset-typescript

首先需要先安裝@babel/preset-env

npm install --save-dev @babel/preset-env
npx babel src --out-dir lib --presets=@babel/env 
           

轉化的時候會識别配置檔案babel.config.js中的env配置

預設有短名稱

{
  "presets": [
    "myPreset",
    "babel-preset-myPreset" // equivalent
  ]
}
           

适用于帶有冠名(scope)的 preset:

{
  "presets": [
    "@org/babel-preset-name",
    "@org/name" // equivalent
  ]
}
           

插件和預設的執行順序

  • 插件在 Presets 前運作。
  • 插件順序從前往後排列。
  • Preset 順序是颠倒的(從後往前)。

附加(@babel/polyfill)

為了使某些功能能夠正常工作。你可以 通過引入 @babel/polyfill 來滿足 Babel 功能的 所有 需求。