作者:叶茂;
标签: webpack,兼容性
![](https://img.haomeiwen.com/i14442426/22ace2d1f6edebbf.jpg)
知识点
webpack简要介绍
- 打包前端代码,优化前端工作流。
注意点
- 使用webpack3, 如果需要使用DevServer,需要安装webpack-dev-server2。
- 使用一些其他插件或loader时也要密切注意版本兼容问题。
// @后面带版本号可安装指定版本的npm包
yarn add webpack@^3 webpack-dev-server@2 --dev
- webpack-dev-server开启热更新需要同时使用HotModuleReplacementPlugin插件。
- ie8 无法使用热更新。
{
devServer: {
hot: true
}
plugins: [
new webpack.HotModuleReplacementPlugin()
]
}
css兼容性
- 使用postcss-loader 和 autoprefixer解决css代码兼容性。只是在属性前加浏览器前缀,解决范围有限,但是百利无一害。
yarn add postcss-loader autoprefixer --dev
- 配置postcss.config.js文件
- 支持的browserlistgithub
// postcss-loader使用autoprefixer有以下两种方式配置
module.exports = {
plugins: [
// 不传参
// require('autoprefixer')
// 传参
require('autoprefixer')({
browsers: ['last 5 versions']
})
]
}
- ie8下不分离css代码会报错,原因是js创建style标签会用到ie8不支持的对象方法。
- 使用extract-text-webpack-plugin分离css代码,webpack4使用mini-css-extract-plugin。
- 配置webpack.config.js文件
// 需要注意loader顺序
module: {
rules: [
// 开发环境可不分离css
/*{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
'postcss-loader'
]
}*/
// css代码分离
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: [ 'css-loader', 'postcss-loader'],
})
},
]
}
// css代码分离需要引入插件
plugins: [
new ExtractTextPlugin('app.css')
]
js代码兼容性
- 使用babel-loader解决js代码兼容性。
- 如果不使用babel,ie 10 及以下浏览器不支持webpack-dev-server,并且使用热更新功能需要引入babel-preset-env,babel-polyfill,因为ie10以下不支持Promise。
- 即使使用babel-polyfill,也不能实现ie8支持webpack-dev-server,因为ie8不支持babel-polyfill。
- 配置文件中引入polyfill
// webpack.config.js
{
entry: ['babel-polyfill', './src/main.js']
}
- 也可以在入口文件中引入
// main.js
require('babel-polyfill')
- 最新版babel-loader 使用@babel/core @babel/preset-env, 注意版本兼容问题。
yarn add babel-loader@^7 babel-core babel-preset-env --dev
// 最新版babel-loader
yarn add babel-loader @babel/core @babel/preset-env --dev
- 使用babel-env解决ie浏览器js代码兼容
- ie11对es6基本不支持,常用的模板字符串、箭头函数都不支持,使用babel-env可以有效解决。
配置.babelrc文件
{
"presets": [
"env"
]
}
- ie8构建生产环境时压缩代码时default的问题,default是es3保留字。
plugins: [
new webpack.optimize.UglifyJsPlugin({
ie8: true,
compress: {
// 不将引号属性查询转换成点号形式
// e['default'] --> e.default
properties: false
}
})
]
- 处理自身代码模块化的默认导出模块。
a. 尽量不要使用export default,用到默认导出的情况,可以使用commonjs的模块化标准。
demo.js
module.exports = function () {
console.log('default function')
}
main.js
var fn = require('./demo.js')
fn()
b. 使用babel-plugin-transform-es2015-modules-simple-commonjs插件。
{
"plugins": [
"transform-es2015-modules-simple-commonjs"
]
}
网友评论