一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第N天,点击查看活动详情。
单独提取css
为什么需要单独打包css呢?
将css文件单独提取出来,那么就可以先在页面的最前面引入这个单独的css文件,浏览器先解析了css文件就会生成cssom从而与dom tree生成渲染树从而以最快速度渲染出页面(为什么要将css文件放在头部)。如果放在js文件中,不仅会增加js文件体积,使js文件的下载时间延长,而且进行解析js文件往往都是在dom树生成之后,那么这两者增加的延迟会大大影响渲染速度,削弱用户体验。
-
需要下载插件npm i mini-css-extract-plugin -D
-
作用:取代style-loader提取js中的css成单独的文件,可以减小js体积
创建webpack.config.js:
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const {resolve} = require('path')
module.exports = {
entry:'./src/js/index.js',
output:{
filename:'js/built.js',
path:resolve(__dirname,'build')
},
module:{
rules:[
{
test:/\.css$/,
use:[
MiniCssExtractPlugin.loader,
'css-loader'
]
}
]
},
plugins:[
new HtmlWebpackPlugin({
template:'./src/index.html'
}),
new MiniCssExtractPlugin({
//对输出的文件进行重新命名
filename:'css/built.css'
})
],
mode:'development'
}
上面的不需要加上style-loader,因此他的作用是把样式插入到head中,但是这里我们需要单独分离css。
打包之后可以看到生成了单独的css文件:
css兼容性处理
开发中可能会遇到css在不同浏览器的兼容性问题,对此可以使用插件来进行处理。
先创建css写入样式如下:
需要先安装:npm i postcss-loader postcss-preset-env -D
在webpack.config.js中配置:
//...相同部分
// 设置nodejs环境变量
process.env.NODE_ENV = 'production';
module.exports = {
//...相同部分
module: {
rules: [
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
// 修改loader的配置
{
loader: 'postcss-loader',
ident: 'postcss',
options: {
postcssOptions: {
//或者将插件引入写在单独的配置js中
//config: './config/postcss.config.js',
plugins: [
require('postcss-preset-env')()
]
}
}
}
]
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
}),
new MiniCssExtractPlugin({
filename: 'css/built.css'
})
],
mode: 'development'
};
另外还需要在package.json中进行如下配置来帮助我们识别哪些浏览器需要做兼容性处理,如下:
"browserslist": {
// 开发环境 --> 设置node环境变量:process.env.NODE_ENV = development
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
],
// 生产环境:默认是看生产环境
"production": [
">0.1%",
"not dead",
"not op_mini all"
]
}
执行命令webpack就可以看到打包完的css中自动帮助我们加上了前缀:
以上内容是本人在学习webpack中踩到的一些坑,希望可以帮助到大家~