思考
我们前面使用了 css-loader 编译 css 文件,那么我们的 js文件 需要编译吗?
答案是肯定的,如果我们项目中使用了 es6 等语法,浏览器不持支是肯定不行的,所以我们要借助 babel-loader 将 es6 等高级语法编译成浏览器能识别的 es5 语法
实验
我们在 hello.js 文件中采用es6的 async/await 方法
function getString() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('hello')
}, 1000);
})
}
async function Hello() {
let string = await getString
}
export default Hello
然后运行 npx webpack 打包,发现浏览器可以正常运行(是因为谷歌是支持es6语法的),如果换成别不支持es6语法的浏览器就会报错
安装
npm install -D babel-loader @babel/core @babel/preset-env
babel-loader
:在webpack里应用 babel 解析ES6的桥梁@babel/core
:babel 的核心模块@babel/preset-env
:babel预设,一组babel插件的集合配置
rules: [ // 配置资源模块
{
test:/\.js$/, // 匹配 js 文件
exclude:/node_modules/, // 去除编译 node_modules 包
use:{
loader:'babel-loader', // 使用 loader
options:{
presets:['@babel/preset-env'] // 添加预设
}
}
}
]
运行
我们运行 npx webpack 打开app.html,打开控制台发现报错如下:regeneratorRuntime插件
regeneratorRuntime 是webpack打包生成的全局辅助函数,由babel生成,用于兼容asny/await语法。安装
npm install @babel/runtime -D // 满足 regeneratorRuntime 运行需求
npm install @babel/plugin-transform-runtime // 在需要 regeneratorRuntime 的时候自动导包
配置
rules: [ // 配置资源模块
{
test:/\.js$/, // 匹配 js 文件
exclude:/node_modules/, // 去除编译 node_modules 包
use:{
loader:'babel-loader', // 使用 loader
options:{
presets:['@babel/preset-env'], // 添加预设
plugins: [
[
'@babel/plugin-transform-runtime'
]
]
}
}
}
]
完成
我们再来运行 npx webpack 然后打开app.html 发现正常将ES6转换为ES5代码了