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 相关文章推荐
优化网页之快速的呈现我们的网页
Jun 29 Javascript
JS中setInterval、setTimeout不能传递带参数的函数的解决方案
Apr 28 Javascript
javascript之typeof、instanceof操作符使用探讨
May 19 Javascript
单元选择合并变色示例代码
May 26 Javascript
jQuery结合ajax实现动态加载文本内容
May 19 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
Jul 06 Javascript
js 颜色选择插件
Jan 23 Javascript
AngularJS报错$apply already in progress的解决方法分析
Jan 30 Javascript
jQuery实现搜索页面关键字的功能
Feb 16 Javascript
JavaScript数据结构之二叉树的删除算法示例
Apr 13 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
Dec 14 Javascript
原生JS实现天气预报
Jun 16 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
php在数组中查找指定值的方法
2015/03/17 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
用javascript实现计算两个日期的间隔天数
2007/08/14 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
jQuery简单实现网页选项卡特效
2014/11/24 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
基于d3.js实现实时刷新的折线图
2016/08/03 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
浅谈JS封闭函数、闭包、内置对象
2017/07/18 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
微信小程序实现页面浮动导航
2019/01/28 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
Python算法之图的遍历
2017/11/16 Python
Python中的并发处理之asyncio包使用的详解
2018/04/03 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
CSS3制作半透明边框(Facebox)类似渐变
2012/12/09 HTML / CSS
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
元旦联欢会感言
2014/03/04 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
课前一分钟演讲稿
2014/08/26 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
详细介绍python操作RabbitMq
2022/04/12 Python