webpack 之(10) css 提取,兼容,压缩
生产环境:能让代码优化上线运行的环境
提问:css打包在js文件中会出现什么情况?
答:css在js中,这样js文件体积变得非常大,下载就会非常慢,因为是先加载js,先执行js代码,然后创建style标签加载在页面中,那么页面就会出现闪屏现象,所以需要将css文件内容从js中提取出来
需要做哪些优化:
1/将css抽离出来
2/统一对代码进行压缩
3/部分样式问题和js存在兼容性问题
这样做的好处
1/能够让代码更快的运行,性能更好
2/能够让代码在各个浏览器中平稳的运行,不出现问题
注意命令webpack 和 npx webpack-dev-server的区别
webpack:用于打包
npx webpack-dev-server:用于编译打包,没有输出
提取
重点内容:
需要安装包: npm i mini-css-extract-plugin
在module的rules部分,对css的处理,需要去掉style-loader 变为 MiniCssExtractPlugin.loader
可以通过new MiniCssExtractPlugin({ filename:'css/built.css' }) 进行重命名,默认是 main.css文件
"css-loader": "^5.2.4", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^1.5.0", "style-loader": "^2.0.0", "url-loader": "^4.1.1"
const {resolve} = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') module.exports = { entry:'./src/js/index.js', output:{ filename:'js/built.js', path:resolve(__dirname,'build') }, module:{ rules:[ { test:/\.css$/, use:[ //创建style标签,将样式放入 // 'style-loader', //这个loader取代style-loader.作用:提取css成单独文件 MiniCssExtractPlugin.loader, //将css文件整合到js文件中 'css-loader'] } ] }, plugins:[ new HtmlWebpackPlugin({ template:'./src/index.html' //将复制该文件打包到新的文件中 }), new MiniCssExtractPlugin({ //对输出文件进行重命名 filename: 'css/built.css' }) ], mode:'development' }
兼容
注意点:
需要和webpack.config.js同级添加一个postcss.config.js文件,因为以前的写法不支持了(看下面内容)
同时用得到了 postcss-loader 和 postcss-preset-env 插件
需要在package.json中配置css的兼容处理browserslist
{ "name": "09tiqucss", "version": "1.0.0", "description": "", "main": "webpack.config.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "css-loader": "^5.2.4", "file-loader": "^6.2.0", "html-webpack-plugin": "^5.3.1", "mini-css-extract-plugin": "^1.5.0", "postcss-loader": "^5.2.0", "postcss-preset-env": "^6.7.0", "style-loader": "^2.0.0", "url-loader": "^4.1.1" }, "browserslist": { "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ], "production": [ ">0.2%", "not dead", "not op_mini all" ] } }
const {resolve} = require('path') const HtmlWebpackPlugin = require('html-webpack-plugin') const MiniCssExtractPlugin = require('mini-css-extract-plugin') //设置node环境变量,这一句不写就是默认生产环境 process.env.NODE_ENV = 'development' module.exports = { entry:'./src/js/index.js', output:{ filename:'js/built.js', path:resolve(__dirname,'build') }, module:{ rules:[ { test:/\.css$/, use:[ //创建style标签,将样式放入 // 'style-loader', //这个loader取代style-loader.作用:提取css成单独文件 MiniCssExtractPlugin.loader, //将css文件整合到js文件中 'css-loader', /* css兼容性处理: postcss --> postcss-loader postcss-preset-env(插件) 这个插件帮postcss找到package.json中browserslist里面的配置,通过配置加载指定的css兼容性样式 "browserslist":{ //开发环境 -->设置node环境变量:process.env.NODE_ENV = development "development":[ "last 1 chrome version", //最近的chrome浏览器 "last 1 firefox version",//最近的firefox浏览器W "last 1 safari version" //最近的safari浏览器 ], //生产环境:默认是看生产环境的,与下面的 mode:development 无关 "production":[ ">0.2%", //表示所有的浏览器了 "not dead", //不要死了的浏览器 ie10 "not op_mini all" //不要欧鹏的浏览器 ] } */ /* 使用loader的默认配置 'postcss-loader' 修改loader的配置(如下) */ { loader:'postcss-loader', /* //不支持这种写法,而是抽离成postcss.config.js文件,抽离的文件是不需要任何引入的 options:{ ident:'postcss', plugins: () => [ require('postcss-preset-env')() ] } */ } ] } ] }, plugins:[ new HtmlWebpackPlugin({ template:'./src/index.html' //将复制该文件打包到新的文件中 }), new MiniCssExtractPlugin({ //对输出文件进行重命名 filename: 'css/built.css' }) ], mode:'development' }
压缩
添加一个插件即可进行压缩
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
在webpack.config.js文件中的plugins属性
plugins:[ //默认配置就足够进行压缩了 new OptimizeCssAssetsWebpackPlugin() ]