【Webpack4】CSS 配置之 postcss-loader

postcss-loader 应该是 Webpack 配置中不可或缺的一个 CSS loader。它负责进一步处理 CSS 文件,比如添加浏览器前缀,压缩 CSS 等。 配置 postcss-loader 时,可以在 webpack.config.js 中配置具体选项,也可以新建一个 postcss.config.js,专门定义 postcss-loader 的配置。 这篇文档基于依赖包版本: webpack:4.39.1 npm i -D webpack postcss-loader:3.0.0 npm i -D postcss-loader cssnano:4.1.10 npm i -D cssnao autoprefixer:9.7.2 npm i -D autoprefixer 添加浏览器前缀 配置 Autoprefixer 之前,需要先添加 Browserslist :在项目根目录添加 .browserslistrc 文件;或者在package.json文件中添加 browserslist ,比如: { "browserslist": [ "defaults" ] } 配置 Autoprefixer: 如果是在项目根目录中创建了 postcss.config.js: module.exports = { plugins: [ require('autoprefixer') ] } 如果直接在 webpack.config.js 中配置: { test: /\.css$/, use: [ 'style-loader', 'css-loader', { loader: 'postcss-loader', options: { plugins: [ require('autoprefixer') ] } } ] } 生产模式中压缩CSS 推荐使用文件 postcss.config.js的方式: module.exports = ({ env }) => ({ plugins: [ require('autoprefixer'), env === 'production' ? require('cssnano') : null ] }) env取值process.env.NODE_ENV,可用来判断是开发模式还是生产模式。 当然也可以在 webpack.config.js 中,只是写起来有点冗余,尤其是需要在多个规则中用到 postcss-loader 时: const devMode = process.env.NODE_ENV === 'development'; // 是否是开发模式 module.exports = { module: { rules:[ { test: /\.css$/, use: [ 'style-loader', 'css-loader', { loader: 'postcss-loader', options: { plugins:devMode?[require('autoprefixer')] :[require('autoprefixer'), require('cssnano')] } } ], } ] } }; 压缩 CSS 其他方法可以参考 Webpack 文档中这一段 。 开发模式下生成 Sourcemap 用 style-loader时: const devMode = process.env.NODE_ENV === 'development'; // 是否是开发模式 module.exports = { module: { rules:[ { test: /\.less$/i, use: [ 'style-loader', { loader: 'css-loader', options: { sourceMap: devMode}}, { loader: 'postcss-loader', options: { sourceMap: devMode}}, { loader: 'less-loader', options: { sourceMap: devMode }} ] }, ] } }; 用 MiniCssExtractPlugin 时,注意 sourcemap 得配置成“inline”,不然调试时仍旧无法定位到.less 源码,只能定位到编译后的 CSS 文件。 const devMode = process.env.NODE_ENV === 'development'; // 是否是开发模式 module.exports = { module: { rules:[ { test: /\.less$/i, use: [ { loader: MiniCssExtractPlugin.loader, options: { // only enable hot in development hmr: devMode, // if hmr does not work, this is a forceful method. reloadAll: true, }, }, { loader: 'css-loader', options: { sourceMap: devMode}}, { loader: 'postcss-loader', options: { sourceMap: devMode?'inline':false}}, // 注意这里是 inline { loader: 'less-loader', options: { sourceMap: devMode }} ] }, ] } };

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):