webpack那些事

webpack配置之babel-loader

2022-05-14  本文已影响0人  _静夜听雨_

我们在做项目的时候,都会用到babel-loader,今天来重温一下它的详细配置,gogogo!!!

官网地址:babeljs.cn

第一:Babel 是什么?

Babel 是一个 JavaScript 编译器
Babel 是一个工具链,主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法,以便能够运行在当前和旧版本的浏览器或其他环境中。

下面列出的是 Babel 能为你做的事情:

  • 语法转换
  • 通过 Polyfill 方式在目标环境中添加缺失的特性 (通过引入第三方 polyfill 模块,例如 core-js
  • 源码转换(codemods)
  • 更多参考资料!(请查看这些 视频 以获得启发)
// Babel 输入: ES2015 箭头函数
[1, 2, 3].map(n => n + 1);
// Babel 输出: ES5 语法实现的同等功能
[1, 2, 3].map(function(n) {
  return n + 1;
});

第二:核心依赖包

@babel/core:babel转译器本身,提供了babel的转译API,如babel.transform等,用于对代码进行转译。webpack的babel-loader就是调用这些API来完成转译过程的。
@babel/parse:JS解释器模块内容。提供parse接口解释,最新的 ECMASCRIPT 标准,以及JSX,Flow,TypeScript,和其他实验性语言。这个模块便是以前的babylon。
@babel/traverse:JS遍历AST节点模块。用于遍历解释器模块解析出来的AST节点。
@babel/generator:JS生成器,主要用于将解释器解释得到的AST生成成为可解析的JS代码。

其他功能包:

@babel/cli:命令行工具,cmd运行babel解析过程。并可以设置包括输出路径等等信息。
@babel/types:用于验证,构建,和修改AST节点。
@babel/polyfill:包装了core-js和 regenerate-runtime。
@babel/runtime:和polyfill相似,但是不会修饰全局环境将会和plugin-transform-runtime一同使用。
@babel/registor:通过使用node.js的require字段来引入。会自动的通过babel解析当前文件。

第三:babel在解析JS文件的一个过程:

input string -> @babel/parser parser -> AST -> transformer[s] -> AST -> @babel/generator -> output string

image.png

第四:webpack配置

安装依赖

npm install babel-loader @babel/core @babel/preset-env

当下在好我们的依赖包之后,我们可以通过.babelrc文件来进行配置,或者我们也可以通过webpack.config.js来进行配置。

{
        test: /\.(js|jsx|ts\tsx)$/,
        use: 'babel-loader',
        exclude: 'node_modules/'
},

配置.babelrc
.babelrc主要是为了配置preset和plugins内容项

{
    "presets": [
        [
            "@babel/preset-env",
            {
                "targets": {
                    //目标环境
                    "edge": "17",
                    "firefox": "60",
                    "chrome": "67",
                    "safari": "11"
                },
                "corejs": 2,
                "useBuiltIns": "usage"
            }
        ],
        "@babel/preset-react"
    ]
}

其中的options可以有许多的关键字段,其中一个options是一个对象内容,当然依据不同的preset和plugins会提供不太相同的options的字段进行设置,这里我们是使用了preset-env预设所以暂时只介绍相关的字段。其中主要可用字段是有:

targets:

String | Array | { [String]: string } 。默认为{},这一属性说明了当前的项目的适用环境。可以编写字符串的内容,作为boswerlist的遍历条件。例如:"targets": "> 0.25%, not dead" 或者也可以使一个对象。来设置对于每一个浏览器最低版本的控制。例如:{ "targets": { "chrome": "58", "ie": "11" } },其中的浏览器关键字从如下之中选取:chrome, opera, edge, firefox, safari, ie, ios, android, node, electron。

targets.esmodules

布尔值,是targets属性对象之中的一个值,其表示的是是否开启ES模式。可以和type='module'结合是用,来简化脚本。当检查到当前的属性的时候,targets之中的浏览器属性设置将会被无视。

module

其可以取值是:"amd" | "umd" | "systemjs" | "commonjs" | "cjs" | "auto" | false默认值是 false。将当前的ES编译模式转化成为其他的语法模式,其中的cjs是commonjs的别名。

debug

布尔值,默认是false。将当前版本号和环境输出到控制台。

include

Array<String|RegExp>。这一属性表示的是永远包含的插件内容。当然输入的字符串内容是有一定规范的。要么是全名输入,或者可以使用*号表示,某一目录下所有的内容,或者是使用正则表达式的形势匹配需要引入的插件内容。

exclude

同include相同,不过它表示的是需要排除或者移除的插件内容。

useBuiltIns

"usage" | "entry" | false三个值之一,这一属性确定preset-env如何处理polyfills。
useBuiltIns:false:此时不对 polyfill 做操作。如果引入 @babel/polyfill,则无视配置的浏览器兼容,引入所有的 polyfill。

useBuiltIns:entry:根据配置的浏览器兼容,引入浏览器不兼容的 polyfill。需要在入口文件手动添加 import '@babel/polyfill',会自动根据 browserslist 替换成浏览器不兼容的所有 polyfill。

"useBuiltIns": "entry",
"corejs": 2,

这里需要指定 core-js 的版本, 如果 "corejs": 3, 则 import '@babel/polyfill' 需要改成

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

usage:usage 会根据配置的浏览器兼容,以及你代码中用到的 API 来进行 polyfill,实现了按需添加。

"useBuiltIns": "usage",
"corejs": 2,

stage

  • stage-0 - Strawman: just an idea, possible Babel plugin.
  • stage-1 - Proposal: this is worth working on.
  • stage-2 - Draft: initial spec.
  • stage-3 - Candidate: complete spec and initial browser implementations.
  • stage-4 - Finished: will be added to the next yearly release.

plugins
在设置文件之中我们也可以引入plugins(插件内容)。常见内容也和preset的是相通的,只是引入属性的关键字变成了plugins。当然每个插件也有自己的属性字段可以设置咯。

//要指定参数,请传递一个以参数名作为键(key)的对象
{
  "plugins": [
    [
      "transform-async-to-module-method",
      {
        "module": "bluebird",
        "method": "coroutine"
      }
    ]
  ]
}

插件和Presets执行顺序:

插件在 Presets 前运行。
插件顺序从前往后排列。
Preset 顺序是颠倒的(从后往前)。

ignore
忽视文件属性配置。注意不能忽略nodemodule包中的包文件。例如:

{
    ignore:[
        index.js //当前文件将会被babel忽略编译。
    ]
}

如果要忽略node_modules的文件 ,需要找到webpack的配置文件,

minified

用于设置编译后是否压缩,当使用cli的进行打包配置的时候将会产生效果,但是如果使用其他的架构引入babel的话,当前配置可能会无效果。

comments

布尔类型,表示打包编译之后不产生注释内容。在webpack之中使用UglifyJsPlugin插件也是一样的效果。

env

{
 "env": {
  // test 是提前设置的环境变量,如果没有设置BABEL_ENV则使用NODE_ENV,如果都没有设置默认就是development
  "test": {
   "presets": ["env", "stage-2"],
   // instanbul是一个用来测试转码后代码的工具
   "plugins": ["istanbul"]
  }
 }
}

在打包编译的时候,env的值将会从process.env.BABEL_ENV之中获取,如果没有,则将会获取pocess.env.NODE_ENV,如果还是没有信息的话,将会默认是development。

上一篇 下一篇

猜你喜欢

热点阅读