13. webpack4.x babel配置——babel-loader

文章参考

  1. webpack babel-loader
  2. Plugin/Preset files are not allowed to export objects,only functions.webpack报错/babel报错的解决办法
  3. Webpack 4.x 从入门到实践(五)—— Babel的配置

什么是babel

  1. Babel 是一个 JavaScript 编译器
  2. Babel 是一个工具链,主要用于在旧的浏览器或环境中将 ECMAScript 2015+ 代码转换为向后兼容版本的 JavaScript 代码:
  • 转换语法
  • Polyfill 实现目标环境中缺少的功能 (通过 @babel/polyfill)
  • 源代码转换 (codemods)

如何安装babel

cnpm install --save-dev babel-loader @babel/core

如果需要ES6语法转换ES5还需要安装

cnpm install @babel/preset-env --save-dev
cnpm install --save babel-preset-es2015

.babelrc babel的配置文件

{ 
  "presets":["@babel/env",]
}

依赖库作用解释

  1. babel-loader
    babel-loader 只是连接webpack 与 babel 的桥梁,本身自己并不将 ES6转ES5

  2. babel-core
    babel-core是作为babel的核心存在,babel的核心api都在这个模块里面,当webpack使用babel-loader处理文档时,babel-loader实际上调用了babel-core的api

  3. babel-preset-env
    babel有几种规则都可以实现对ES6语法的转码,如babel-preset-es2015、babel-preset-es2016、babel-preset-es2017,不过官方现已建议采用babel-preset-env,为什么会这样呢?

我们首先要了解到,ES6发布在2015年,距离现在3年了,很多浏览器已经支持了很大一部分ES6语法,这些浏览器是能够识别ES6语法的,而babel-preset-es2015是将所有ES6语法全部转译为ES5,这就导致一个问题:打包文档过大

那么babel-preset-env给我们带来什么好处呢?他能够按照我们自定义规则,让你指定一个环境且仅仅转译在那个环境中缺少的特性,怎么理解呢?假如我们只需要适配安卓7.0的移动端web浏览器,这个时候,我们只需要找到安卓7.0中不支持的语法(一小部分),将这部分代码转译为ES5即可,就不必将所有的代码一把梭地转译为ES5,具体配置我们下面会详细说明。

  1. babel-plugin-transform-runtime
    首先babel基础包(不安装额外东西)并不是支持完整的新规范语言,当我们在项目中用到哪些新的语法,那么就会从transform-runtime来获取到他的转译源码。

Plugin/Preset files are not allowed to export objects,only functions.webpack报错/babel报错的解决办法?

  1. 在网上搜了解决办法,意思就是说 babel7 之后做了重大改变,前后不兼容的问题
  2. babel-loader 和 babel-core 之间会有版本适配的问题

解决办法

官方给出的是两个方案
  1. webpack 4.x + babel-loader 8.x + babel 7.x (当babel-loader 的版本是8.x的时候 相匹配的 babel为7.x
npm install -D babel-loader @babel/core @babel/preset-env webpack
  1. webpack 4.x + babel-loader 7.x + babel 6.x (当babel-loader 的版本是7.x的时候 相匹配的 babel为6.x
npm install -D babel-loader@7 babel-core babel-preset-env webpack
快速解决办法 package.json 引用的版本号
"@babel/core": "^7.8.3",
"@babel/preset-env": "^7.8.3",
"babel-loader": "^8.0.6",
"@babel/polyfill": "^7.8.3",
"babel-preset-es2015": "^6.24.1"
  1. .babelrc 配置文件,指明编译的目标语法
{ 
  "presets":["@babel/env",]
}

webpack.config.js 配置 babel-loader

module: {
  rules: [
    {
        test: /\.js$/,
        // 排除 node_modules 和 bower_components 下的文件
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: "babel-loader",
          options: {
            presets: [["@babel/preset-env",{
              // 只引用使用了新特性 polyfill
              useBuiltIns: 'usage'
            }]]
          }
        }
      },
      // { 
      //   test: /\.js$/, 
      //   exclude: /node_modules/, 
      //   loader: "babel-loader" 
      // },
  ]
}

让浏览器支持新标准的函数 polyfill

cnpm install --save @babel/polyfill

注意:在所有代码使用之前

import "@babel/polyfill";

缺点:增大了代码体积

解决办法,只引用使用了新特性函数的函数

添加 useBuiltIns: 'usage'

{
	test: /\.js$/,
	// 排除 node_modules 和 bower_components 下的文件
	exclude: /(node_modules|bower_components)/,
	use: {
	  loader: "babel-loader",
	  options: {
		presets: [["@babel/preset-env",{
		  // 只引用使用了新特性 polyfill
		  useBuiltIns: 'usage'
		}]]
	  }
	}
},
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值