Babel

作者: 肉桂猿 | 来源:发表于2020-03-19 16:02 被阅读0次

refer:
前端工程师的自我修养-关于 Babel 那些事儿

什么是Babel:

JavaScript 编译器,用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前版本和旧版本的浏览器或其他环境中。简单来说 Babel 的工作就是:

  • 语法转换
  • 通过 Polyfill 的方式在目标环境中添加缺失的特性
  • JS 源码转换

注: Babel 只负责编译新标准引入的新语法,比如 Arrow function、Class、ES Module 等,它不会编译原生对象新引入的方法和 API,比如 Array.includesMapSet 等,这些需要通过 Polyfill 来解决。

基本原理:

AST (抽象语法树)

使用:

  1. babel/cli
  2. babel/core
  3. 配置文件 babel.config.js / .babelrc / .babelrc.js / package.json
// package.json
{
 ...
 "babel": {
   "presets": [ ... ],
   "plugins": [ ... ],
 }
}

3.1 插件(Plugins)
插件是用来定义如何转换代码。在预设(Presets) 前按照从左往右的顺序执行。

3.2 预设(Presets)
预设就是一堆插件(Plugin)的组合,从而达到某种转译的能力,就比如 react 中使用到的 @babel/preset-react ,它就是下面几种插件的组合。

@babel/plugin-syntax-jsx
@babel/plugin-transform-react-jsx
@babel/plugin-transform-react-display-name

当然我们也可以手动的在 plugins 中配置一系列的 plugin 来达到目的。但是这样一方面显得不那么优雅,另一方面增加了使用者的使用难度。如果直接使用预设就清新脱俗多了~
为了确保向后兼容,预设的执行顺序是从右往左。

Polyfill:

polyfill 的翻译过来就是垫片,垫片就是垫平不同浏览器环境的差异,让大家都一样。
在 @babel/preset-env 的配置项中提供了 useBuiltIns 这一参数,只要在使用 @babel/preset-env 的时候带上他,Babel 在编译的时候就会自动进行 Polyfill ,不再需要手动的在代码中引入@babel/polyfill 了,同时还能做到按需加载。

{
  "presets": [
    "@babel/preset-flow",
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "8.10"
        },
        // 需要配置一下 corejs 的版本号,不配置编译的时候会报警告
        "corejs": "3", // 声明 corejs 版本
        "useBuiltIns": "usage"
      }
    ]
  ]
}

seBuiltIns 的机构参数:

  • false:此时不对Polyfill 做操作,如果引入 @babel/polyfill 则不会按需加载,会将所有代码引入
  • usage:会根据配置的浏览器兼容性,以及你代码中使用到的 API 来进行 Polyfill ,实现按需加载
  • entry:会根据配置的浏览器兼容性,以及你代码中使用到的 API 来进行 Polyfill ,实现按需加载,不过需要在入口文件中手动加上import ' @babel/polyfill'

Babel 在编译中使用的辅助函数:

@babel/plugin-transform-runtime 可以让 Babel 在编译中复用辅助函数,从而减小打包文件体积。

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "useBuiltIns": "usage",
                "corejs": 3
            }
        ]
    ],
    "plugins": [
       "@babel/plugin-transform-runtime"
    ]
}

相关文章

网友评论

    本文标题:Babel

    本文链接:https://www.haomeiwen.com/subject/qlslyhtx.html