10-babel深入

173 阅读3分钟

babel深入

[官网] - Babel](www.babeljs.cn/docs/)

介绍

其实官网介绍的很详细了,建议仔细阅读:

babel是什么

babel是用nodejs写的js语法解析器,你可以认为是用nodejs解析.js文件,最后生成js文件,在解析翻译的过程出插入、删除、转换代码。

npm install --save-dev @babel/core
// nodejs下
const babel = require("@babel/core");
// 获取文件字符串
const toParseCode = fx.readFileSync('filename.js')

babel.transformSync(toParseCode, optionsObject);

@babel/core 包含 我们常说的babel的所有核心功能(发现当一个库的功能大而全的时候都会进行拆分:postcss 支持插件、webpack plugin和loader)

@babel/cli

@babel/cli 是一个能够从终端(命令行)使用的工具

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

(./node_modules/.bin/babel | npx babel) src --out-dir lib

编译src所有的js文件,并输出到 lib目录下

插件和预设(preset)

预设是一组插件的集合,单个插件为了精简和细分尽量的模块化,导致完成一个功能需要多个插件,为了减少配置,我们之间使用preset 配置我们想要的功能

在没有babel任何插件配置的情况下,babel是什么都不会做的,只是一遍扫描

  • 常用插件:

  • 常用预设:

    • @babel/preset-env:包含所有的类似@babel/plugin-transform-arrow-functions这样能够转换 ES6+语法 到 低版本(ES5 或者更低)

      {
        "presets": [
          // 注意 preset 配置 options 的方式
          [
            "@babel/preset-env",
            {
              "targets": {
                "edge": "17",
                "firefox": "60",
                "chrome": "67",
                "safari": "11.1"
              }
            }
          ]
        ]
      }
      

Polyfill

Babel 7.4.0 版本之前,主要靠 @babel/polyfill 完成 js代码的polyfill,但是从 Babel 7.4.0 版本开始,这个软件包已经不建议使用了,建议直接包含 core-js/stable (用于模拟 ECMAScript 的功能)和 regenerator-runtime/runtime 需要使用转译后的生成器函数

@babel/polyfill 怎么做

// 预设 @babel/preset-env 会帮你下好所有需要的插件,比如 @babel/core
npm i @babel/preset-env babel-loader -D

// 这个代码需要塞到浏览器里,所有用save
npm install --save @babel/polyfill

项目下 babel.config.json 文件

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "edge": "17",
          "firefox": "60",
          "chrome": "67",
          "safari": "11.1"
        },
        // 按需加载 优化
        // 默认是 false ,直接全量加载 
        // entry,根据环境配置 加载配置的允许的浏览器需要那些 polyfill
        "useBuiltIns": "usage",
        "corejs": 3
      }
    ]
  ]
}

babel会检查你所有的代码,找到你使用过的所有ES6+的超前特性,把需要的polyfill包含进来最终和打包源代码一起输出。

@babel/polyfill 最新替代方案

@babel/polyfill 就是 由 core-js + regenerator-runtime 组成,官方不维护这个 @babel/polyfill,因此我们需要完成兼容可以直接的找 core-js就好

npm r @babel/polyfill -S
npm i core-js@3 regenerator-runtime -S
  • 如果你希望按需加载

    {
      "presets": [
        [
          "@babel/preset-env",
          {
            // 根据允许浏览器配置文件 
            "useBuiltIns": "usage",
            "corejs": 3
          }
        ]
      ]
    }
    
  • 希望通过browserslist + preset-env的target,按照浏览器预设加载浏览器需要的 polyfill

    {
      "presets": [
        [
          "@babel/preset-env",
          {
            // 根据允许浏览器配置文件 
            "useBuiltIns": "entry",
            "corejs": 3
          }
        ]
      ]
    }
    

    需要注意的是,这种模式下,需要手动的引入一下

    import "core-js/stable";
    import "regenerator-runtime/runtime";
    

    总结

    babel是否能够按需引入,或者全量引入,或者按browserslist引入,可以从打包的文件大小看的出来,可以通过这个测试