本文衔接上篇文章:

不睡觉的怪叔叔:webpack的模块热替换​zhuanlan.zhihu.com

一、为什么需要Babel?

由于某些浏览器不支持ES6,所以使用ES6写的JavaScript程序不能在这些浏览器中运行。

比如index.js中写一段ES6代码:

let set = new Set();
set.add(1);
set.add(2);
set.add(3);

然后进行打包:

现在这个程序在某些不支持ES6的浏览器中是不能运行的。

可以在webpack中使用babel来将ES6代码转换为ES5的代码。

二、babel的基本配置

首先安装babel-loader与@babel/core:

然后在webpack.config.js中进行相应的配置:

webpack.config.js:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webpack = require('webpack');module.exports = {mode: 'development',devtool: 'cheap-module-eval-source-map',                entry: {main: './src/index.js',                   },output: {filename: '[name].js',                 path: path.resolve(__dirname, 'dist')   },plugins:[new HtmlWebpackPlugin({filename: 'dist.html',          template: './src/template.html' }),new CleanWebpackPlugin(),new webpack.HotModuleReplacementPlugin()       // 开启模块热替换          ],devServer: {contentBase: './dist',                   port: '8080',                            hot: true,              // 开启模块热替换hotOnly: true           },module: {rules: [{rules: [{test: /.(png|svg|jpg|gif)$/,  use: [{loader: 'url-loader',     options: {limit: 1024            }}]},{test: /.css$/,use: ['style-loader','css-loader']},{// 针对babel的配置rules: [{test: /.js$/,   exclude: /node_modules/,  // 无需对第三软件库进行转换,因为它们已经做了转换loader: 'babel-loader'}]}]    }]}
}

三、使用preset-env实现代码转换

目前已经做好了关于Babel的基础配置,但是现在Babel还不能对代码进行转换,还需要@babel/preset-env的帮助,它才能做从ES6到ES5的转换。

那么首先要安装@babel/preset-env:

然后再配置webpack.config.js:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webpack = require('webpack');module.exports = {mode: 'development',devtool: 'cheap-module-eval-source-map',                entry: {main: './src/index.js',                   },output: {filename: '[name].js',                 path: path.resolve(__dirname, 'dist')   },plugins:[new HtmlWebpackPlugin({filename: 'dist.html',          template: './src/template.html' }),new CleanWebpackPlugin(),new webpack.HotModuleReplacementPlugin()       // 开启模块热替换          ],devServer: {contentBase: './dist',                   port: '8080',                            hot: true,              // 开启模块热替换hotOnly: true           },module: {rules: [{rules: [{test: /.(png|svg|jpg|gif)$/,  use: [{loader: 'url-loader',     options: {limit: 1024            }}]},{test: /.css$/,use: ['style-loader','css-loader']},{// 针对babel的配置rules: [{test: /.js$/,   exclude: /node_modules/,  // 无需对第三软件库进行转换,因为它们已经做了转换loader: 'babel-loader',options: {presets: ["@babel/preset-env"]}}]}]    }]}
}

现在再打包代码:

检查打包出来的main.js可以发现ES6的let关键字被转换为ES5的var关键字:

现在已经将能转换为ES5的代码转换了,但是不支持ES6的浏览器仍然无法识别ES6的Set类,此时就要借助Babel的polyfill的帮助了。

四、使用polyfill补充代码

polyfill能为不支持ES6的浏览器补充ES6的相关代码。那么首先来安装polyfill:

然后修改index.js文件以导入polyfill补充的代码:

index.js:

import "@babel/polyfill";let set = new Set();
set.add(1);
set.add(2);
set.add(3);

现在再次打包:

此时就导入了polyfill补充的代码了,可以发现main.js文件增加到了934kb。至此就兼容了那些不支持ES6的浏览器。

五、更多配置

Babel功能非常强大,配置也非常繁杂,这里说几个简单实用的配置。

5.1、使polyfill只补充相关代码

由于polyfill除了补充与我们业务代码相关的代码外,还会补充与我们业务代码无关的代码。

比如本例中polyfill除了补充Set类相关的代码外,还会补充其他ES6相关补全代码,所以致使main.js增加到934kb。

可以手动配置,来使polyfill只补充相关的代码。

修改webpack.config.js进行配置:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webpack = require('webpack');module.exports = {mode: 'development',devtool: 'cheap-module-eval-source-map',                entry: {main: './src/index.js',                   },output: {filename: '[name].js',                 path: path.resolve(__dirname, 'dist')   },plugins:[new HtmlWebpackPlugin({filename: 'dist.html',          template: './src/template.html' }),new CleanWebpackPlugin(),new webpack.HotModuleReplacementPlugin()       // 开启模块热替换          ],devServer: {contentBase: './dist',                   port: '8080',                            hot: true,              // 开启模块热替换hotOnly: true           },module: {rules: [{rules: [{test: /.(png|svg|jpg|gif)$/,  use: [{loader: 'url-loader',     options: {limit: 1024            }}]},{test: /.css$/,use: ['style-loader','css-loader']},{// 针对babel的配置rules: [{test: /.js$/,   exclude: /node_modules/,  // 无需对第三软件库进行转换,因为它们已经做了转换loader: 'babel-loader',options: {presets: [["@babel/preset-env",{useBuiltIns: 'usage'   // 只补充相关的代码}]]}}]}]    }]}
}

index.js文件中可以不用手动导入@babel/polyfill,因为babel会自动导入:

index.js:

let set = new Set();
set.add(1);
set.add(2);
set.add(3);

再次打包:

可以发现main.js缩减为192kb。

5.2、指定适配的浏览器版本

可以指定适配的浏览器版本,以使Babel针对该浏览器版本进行ES6到ES5的转换。

配置webpack.config.js:

const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const webpack = require('webpack');module.exports = {mode: 'development',devtool: 'cheap-module-eval-source-map',                entry: {main: './src/index.js',                   },output: {filename: '[name].js',                 path: path.resolve(__dirname, 'dist')   },plugins:[new HtmlWebpackPlugin({filename: 'dist.html',          template: './src/template.html' }),new CleanWebpackPlugin(),new webpack.HotModuleReplacementPlugin()       // 开启模块热替换          ],devServer: {contentBase: './dist',                   port: '8080',                            hot: true,              // 开启模块热替换hotOnly: true           },module: {rules: [{rules: [{test: /.(png|svg|jpg|gif)$/,  use: [{loader: 'url-loader',     options: {limit: 1024            }}]},{test: /.css$/,use: ['style-loader','css-loader']},{// 针对babel的配置rules: [{test: /.js$/,   exclude: /node_modules/,  // 无需对第三软件库进行转换,因为它们已经做了转换loader: 'babel-loader',options: {presets: [["@babel/preset-env",{useBuiltIns: 'usage',   // 只补充相关的代码targets: {chrome: '67'        // 指定适配的浏览器版本}}]]}}]}]    }]}
}

5.3、将配置项单独放在一个文件中

当Babel配置的中的opions项中的配置越来越多时,最好使用单独的文件来放置这些配置。

在webpack-demo根目录中创建一个文件.babelrc,并将options中的内容放进去:

.babelrc:

{presets: [["@babel/preset-env",{useBuiltIns: 'usage',   // 只补充相关的代码targets: {chrome: '67'        // 指定适配的浏览器版本}}]]
}

再次打包:

配置生效!

webpack devserver配置_在webpack中使用babel相关推荐

  1. 结合webpack配置_前端 Webpack 工程化的最佳实践

    作者 | 阿里文娱前端开发专家 芃苏责编 | 屠敏头图 | CSDN 下载自视觉中国 引言 ▐ 前端构建工具的演变 回想在2015-2016年的时候,开发者们开始渐渐把视线从大量使用Task Runn ...

  2. webpack打包原理_对于webpack打包原理你知道有多少?

    什么是 webpack ? 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler).当 webpack 处理应用程序时,它会递归地构建一个依 ...

  3. webpack devserver配置_webpack中webpack-dev-server的contentBase和index属性实测

    在配置webpack时,在webpack-dev-server的配置中有这样两个属性contentBase和index.例子如下(同时配有官方文档): devServer: {host: '127.0 ...

  4. webpack初体验_使用webpack打包js文件_json文件_使用webpack开发模式_生产模式打包---webpack工作笔记003

    我们首先去初始化一下npm npm init 然后package name 输入webpack_test 然后初始化npm以后,我们去 安装npm i webpack webpack-cli -g 全 ...

  5. asp.net 获取计算机配置_智能制造中的计算机视觉应用瓶颈问题

    点击上方"新机器视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文摘自于:雷林建, 孙胜利, 向玉开, 张悦, 刘会凯. 202 ...

  6. java tomcat 404配置_在Tomcat中配置404自定义错误页面详解

    一直使用tomcat,今天想到一个问题,自定义404错误页面, 为了获得很好的用户感受,是不应当向用户暴露404这样的页面的, 问题的出发点是我在Struts2中定义错误页面, 在Struts2中是这 ...

  7. team网卡配置_在CentOS7中配置网路成组(Network Team)

    之前写了一篇网络成组的文章,使用的是nmtui图形界面配置,但JSON字符串输入很繁琐.因此,建议nmcli进行配置.另外,在CentOS7中推荐网络成组的方式替代以往的网卡绑定,对于具体的操作在红帽 ...

  8. nmi中断配置_关于单片机中的NMI_Handler(不可屏蔽中断处理器)

    该博客文章以MKL15Z4系列单片机为例,参考文档均来自NXP官方提供的芯片用户手册和数据手册:所使用的的开发环境是MCUXpresso. 一.简单的介绍 首先请看两张截图: 一张是截取于单片机工程的 ...

  9. 三.webpack基本配置

    webpack基本配置 1.关于webpack.config.js 首先我们先建立这样的目录 文件说明: src : 放置源文件的目录 dist : 放置打包后文件的目录 index.html : 初 ...

最新文章

  1. 20. matlab 中的gtext 函数
  2. netbeans 添加gif图片_怎么制作动态图片?手机如何制作清晰gif动图?
  3. 8核移动处理器时代来临
  4. Javapinyin4J实现中文名转拼音
  5. 如何在友好的情景下向用户索取手机权限?
  6. Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降
  7. ipad怎么连接电脑_蓝牙的使用,蓝牙耳机怎么连接手机,怎么连接电脑
  8. TOPAS 命令详解
  9. 一步一步学Ruby(十一):控制语句
  10. py获取前端的参数_微前端 qiankun 项目实践
  11. Xtreme8.0 - Kabloom dp
  12. 【conda】解决 An HTTP error occurred when trying to retrieve this URL.
  13. 要显示的8个字符已存放在以BUF开始的存储区单元中(称为显示缓冲区),依次送到LED显示器中显示。CPU通过P0口和P2口控制8位LED显示器,LED为共阴极显示器。
  14. PCA原理及代码实现
  15. 论文中三线式表格的快速插入(word)
  16. 字符常量与字符串常量
  17. 通过YYtext实现文本点击(类似微博效果)
  18. [贪心][区间dp]Zero-One Codeforces1733D1D2
  19. 激活Windows Vista Home Basic Aero玻璃效果
  20. 【PMP认证考试感悟】走向管理的开始

热门文章

  1. asp.net web submit链接页面_41. Web 安全之 target=quot;_blankquot; 触发钓鱼风险
  2. 贪心算法——洛谷(P3817)小A的糖果
  3. PAT乙级(1014 福尔摩斯的约会)
  4. PAT乙级(1006 换个格式输出整数)
  5. MySQL亿级数据数据库优化方案测试-银行交易流水记录的查询
  6. 2019年5月数据库流行度排行:老骥伏枥与青壮图强
  7. Scrum Master们,难道每天都在摸鱼?
  8. 多语言ASR?没有什么听不懂,15种语言我全都要
  9. 4种语义分割数据集Cityscapes上SOTA方法总结
  10. 【华为云技术分享】Entity Framework Core 捕获数据库变动