Webpack4 使用Babel处理ES6语法的方法示例


Posted in Javascript onMarch 07, 2019

修改 index.js 内容,写一些 ES6 的语法:

const arr = [
  new Promise(() => {}),
  new Promise(() => {})
];

arr.map(item => {
  console.log(item);
})

ES6 很强大,但目前并不是所有的浏览器都支持,所以需要用到 Babel,让旧的浏览器或环境中将 ES6 代码转换为向后兼容版本的 JavaScript 代码。

来试一下吧,先安装需要用的 Babel 包:

npm install babel-loader @babel/core -D

配置 webpack.config.js,增加一条 rulues :

module: {
  rules: [{
   test: /\.js$/,
   exclude: /node_modules/, // 排除该目录下的所有代码
   loader: "babel-loader"
  }]
 }

babel-loader 告诉了 webpack 怎么处理 ES6 代码,但它并不会将ES6 代码翻译成向后兼容版本的代码,如果想要执行这一步,还需要安装一个模块 preset-env,它包含了所有 ES6 代码转换的规则:

npm install @babel/preset-env -D

安装完之后配置一下:

rules: [{
 test: /\.js$/,
 exclude: /node_modules/, // 排除该目录下的所有代码
 loader: 'babel-loader',
 options:{
  'presets': ['@babel/preset-env']
 }
}]

这样,运行打包命令,就可以把 ES6 语法翻译成 ES5了,看一下打包的结果:

Webpack4 使用Babel处理ES6语法的方法示例

没问题,语法已经翻译成了当前所有浏览器能识别的语法,但是做到了这一点还是不够,因为那些比较新的对象和函数,比如这里的 Promisemap,在低版本的浏览器里实际还是不存在的。所以这时不仅要进行语法的转换,还要想办法把这些新的特性,补充到低版本的浏览器里。怎么做呢? babel 提供了一个工具叫 polyfill,安装:

npm install @babel/polyfill -D

然后在 index.js 的最顶部,引入这个包:

import '@babel/polyfill'

保存代码,再次进行打包查看结果,可以发现打包后的 main.js 里面,有了很多代码来帮助实现比如 Promisemap 这些新特性。看一下 main.js 文件的大小:

Webpack4 使用Babel处理ES6语法的方法示例

859KB,再看一下没有使用 polyfill 之前的 main.js 大小:

Webpack4 使用Babel处理ES6语法的方法示例

只有4.36KB,使用 polyfill 之后文件变大了很多,这说明了 polyfill 使用了非常多的代码来填入新特性。
但是,index.js 里只使用了 Promisemap,其它的新特性都没用,能不能把那些没用到的实现方法都剔除了呢? 可以,给 preset-env 增加一个 useBuiltIns 配置:

rules: [{
 test: /\.js$/,
 exclude: /node_modules/, // 排除该目录下的所有代码
 loader: 'babel-loader',
 options: {
  'presets': [
   ['@babel/preset-env', {
    useBuiltIns: 'usage'
   }]
  ]
 }
}]

useBuiltIns: 'usage' 的意思就是说,当使用 polyfill 往低版本浏览器填入一些不存在的特性时,不是全部都填入,而是根据业务代码使用到的特性去选择填入,比如这里使用了 Promisemap,那就只填入这两个,其它的都不用。 再次打包查看结果:

Webpack4 使用Babel处理ES6语法的方法示例

可以看到,main.js 的大小只有 138KB了。

这里还可以配置一些其它的参数,比如 targets 参数:

rules: [{
 test: /\.js$/,
 exclude: /node_modules/, // 排除该目录下的所有代码
 loader: 'babel-loader',
 options: {
  'presets': [
   ['@babel/preset-env', {
    useBuiltIns: 'usage',
    targets:{
     edge: '17', // edge高于17的版本
     firefox: '60', // firefox 高于60的版本
     chrome: '67' // chrome高于67的版本
    }
   }]
  ]
 }
}]

targets 是指打包会运行在什么样的浏览器,这有三个浏览器,并注明了最低版本。在打包的过程中,babel 会去看这些浏览器对 ES6 代码的支持情况,是否有必要进行语法转换、填入一些新特性。 运行打包命令查看结果:

Webpack4 使用Babel处理ES6语法的方法示例

发现还是输出的 Promisemap,并没有进行新特性的填入,说明这三个版本的浏览器对 ES6 的支持已经很好了,不需要在进行额外的处理,main.js 的大小是变成了最初的4.36KB。

到此为止,webpackES6 的简单处理就完成了。

关于 babel 还有很多东西和配置项,更多的知识要到 https://babel.docschina.org 来学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
Jan 09 Javascript
HTML Dom与Css控制方法
Oct 25 Javascript
动态创建样式表在各浏览器中的差异测试代码
Sep 13 Javascript
JavaScript操作DOM元素的childNodes和children区别
Apr 01 Javascript
js获取指定字符前/后的字符串简单实例
Oct 27 Javascript
js实现复选框的全选和取消全选效果
Jan 03 Javascript
JavaScript面向对象程序设计创建对象的方法分析
Aug 13 Javascript
Jquery获取radio选中值实例总结
Jan 17 jQuery
jQuery - AJAX load() 实例用法详解
Aug 27 jQuery
纯js实现无缝滚动功能代码实例
Feb 21 Javascript
vue引入静态js文件的方法
Jun 20 Javascript
Element Badge标记的使用方法
Jul 27 Javascript
深入理解react 组件类型及使用场景
Mar 07 #Javascript
如何优雅地在vue中添加权限控制示例详解
Mar 07 #Javascript
node链接mongodb数据库的方法详解【阿里云服务器环境ubuntu】
Mar 07 #Javascript
Vue中的情侣属性$dispatch和$broadcast详解
Mar 07 #Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
Mar 07 #jQuery
在Web关闭页面时发送Ajax请求的实现方法
Mar 07 #Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
Mar 07 #Javascript
You might like
php实现俄罗斯乘法实例
2015/03/07 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
Jquery刷新页面背景图片随机变换的实现方法
2013/03/15 Javascript
jquery 实现二级/三级/多级联动菜单的思路及代码
2013/04/08 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
jQuery选择器querySelector的使用指南
2015/01/23 Javascript
js实现简单计算器
2015/11/22 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
canvas实现粒子时钟效果
2017/02/06 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
vue如何获取点击事件源的方法
2017/08/10 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
vuex入门最详细整理
2020/03/04 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
Python linecache.getline()读取文件中特定一行的脚本
2008/09/06 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
python中自带的三个装饰器的实现
2019/11/08 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
中间件分为哪几类
2012/03/14 面试题
大学生咖啡店创业计划书
2014/01/21 职场文书
小学生元旦广播稿
2014/02/21 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
主题班会演讲稿
2014/05/22 职场文书
法律专业自荐信
2014/06/03 职场文书
2015年个人思想总结
2015/03/09 职场文书
素质教育培训心得体会
2016/01/19 职场文书
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android