webpack配置之babel-loader

我们在做项目的时候,都会用到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。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容