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 相关文章推荐
网上抓的一个特效
May 11 Javascript
asp.net下使用jquery 的ajax+WebService+json 实现无刷新取后台值的实现代码
Sep 19 Javascript
javascript:;与javascript:void(0)使用介绍
Jun 05 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
Apr 06 Javascript
JavaScript对象学习小结
Sep 02 Javascript
vue货币过滤器的实现方法
Apr 01 Javascript
JS ES6多行字符串与连接字符串的表示方法
Apr 26 Javascript
浅谈JsonObject中的key-value数据解析排序问题
Dec 06 Javascript
Angular4 Select选择改变事件的方法
Oct 09 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
JavaScript缺少insertAfter解决方案
Jul 03 Javascript
一百多行代码实现react拖拽hooks
Mar 23 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数组应该有多大的分析
2009/07/30 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
PHP ElasticSearch做搜索实例讲解
2020/02/05 PHP
不使用XMLHttpRequest实现异步加载 Iframe和script
2012/10/29 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
Javascript中实现trim()函数的两种方法
2015/02/04 Javascript
jQuery+ajax实现文章点赞功能的方法
2015/12/31 Javascript
Bootstrap每天必学之标签页(Tab)插件
2020/08/09 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
浅谈angularjs依赖服务注入写法的注意点
2017/04/24 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
jQuery Datatables 动态列+跨列合并实现代码
2020/01/30 jQuery
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
Python对象的属性访问过程详解
2020/03/05 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
html5 touch事件实现触屏页面上下滑动(一)
2016/03/10 HTML / CSS
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
澳洲小众品牌的集合网站:BNKR
2018/02/23 全球购物
使用Vue.js和MJML创建响应式电子邮件
2021/03/23 Vue.js
校园安全检查制度
2014/02/03 职场文书
电焊工岗位职责
2014/03/06 职场文书
水毁工程实施方案
2014/04/01 职场文书
工地安全生产标语
2014/06/06 职场文书
平面设计师岗位职责
2014/09/18 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
创业计划之特色精品店
2019/08/12 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python