安装命令
postcss-loader依赖postcss,postcss要做智能预设所以也需要postcss-preset-env所以要三个依赖包
npm i postcss-loader postcss postcss-preset-env -D
webpack.config.js
写的时候要留意放置位置 只有test值为.css的配置项放在css-loader后面其它的css样式配置需要放到 "css-loader",之后与 "xxx-loader",之前
- module.exports = {
- module: {
- rules: [
- {
- test: /\.css$/,
- use: [
- 'style-loader',// MiniCssExtractPlugin.loader, //单独生成css文件
- 'css-loader',
- {
- loader: 'postcss-loader',
- options: {
- postcssOptions: {
- plugins: [
- [
- 'postcss-preset-env', 能解决大多数样式兼容性问题
- {
- // 其他选项
- },
- ],
- ],
- },
- },
- },
- ],
- },
- {
- test: /\.s[ac]ss$/, //a和c结尾的文件都行(sass|scss)
- use: [
- // 将 JS 字符串生成为 style 节点
- MiniCssExtractPlugin.loader,
- // 将 CSS 转化成 CommonJS 模块
- "css-loader",
- {
- loader: "postcss-loader",
- options: {
- postcssOptions: {
- plugins: [
- "postcss-preset-env", // 能解决大多数样式兼容性问题
- ],
- },
- },
- },
- // 将 Sass 编译成 CSS
- "sass-loader",
- ],
- }
- ],
- },
- };

效果发现css3的兼容性并没有改前缀
源代码:

打包后的代码:

控制兼容性
我们可以在 package.json 文件中添加 browserslist 来控制样式的兼容性做到什么程度。
以下为做到大于IE8的程度
- {
- // 其他省略
- "browserslist": ["ie >= 8"]
- }
再次打包查看打包后的结果

或者也可以这样写(取最近两个版本的浏览器兼容不需要用到前缀所以没有前缀)
- "browserslist": [
- "last 2 version", //针对所有浏览器只要最近两个版本
- "> 1%", //覆盖99%的浏览器
- "not dead" //去掉弃用的版本
- ]
针对兼容性多个复用进行整合(MiniCssExtractPlugin 为独立打包css)
- // https://webpack.docschina.org/plugins/mini-css-extract-plugin
- const MiniCssExtractPlugin = require("mini-css-extract-plugin");
-
- // 获取处理样式的Loaders
- const getStyleLoaders = (preProcessor) => {
- return [
- MiniCssExtractPlugin.loader, //单独生成css文件
- "css-loader", //将css资源编译成commonjs的模块到js中
- {
- loader: "postcss-loader",
- options: {
- postcssOptions: {
- plugins: [
- "postcss-preset-env", // 能解决大多数样式兼容性问题
- ],
- },
- },
- },
- preProcessor,
- ].filter(Boolean); //过滤掉preProcessor为undefined值
- };
-
- module.exports = {
- // 入口 (相对路径)
- entry: "./src/main.js",
- // 输出
- output: {
- // 文件输出路径
- path: path.resolve(__dirname, "../dist"),
- // 入口文件打包输出文件名
- filename: "static/js/main.js",
- clean: true, //webpack5特性打包前清除上一次打包记录
- },
- // 加载器
- module: {
- rules: [
- // loader的配置
- {
- test: /\.css$/, //只检测.css文件
- use: getStyleLoaders(),
- },
- {
- test: /\.less$/,
- // use与loader的区别,use可以用多个loader;loader只能用一个(loader:'xxxx')
- use: getStyleLoaders("less-loader"),
- },
- {
- test: /\.s[ac]ss$/, //a和c结尾的文件都行(sass|scss)
- use: getStyleLoaders("sass-loader"),
- },
- // https://webpack.docschina.org/guides/asset-modules/#resource-assets
- {
- test: /\.(png|jpe?g|gif|webp|svg)$/, //$匹配结尾,在多行检测中,会匹配一行的结尾
- type: "asset", //转base64
- parser: {
- dataUrlCondition: {
- maxSize: 10 * 1024, // 小于10kb的图片转为base64,用于减少请求数据,但体积会大一点点
- },
- },
- generator: {
- // 生成输出的图片名字[hash:10]表示只取前10位
- // ext:扩展名
- // query图片参数
- filename: "static/images/[hash:10][ext][query]",
- },
- },
- {
- test: /\.(ttf|woff2?|mp3|mp4|avi)$/, //匹配字体图标库或者视频文件
- type: "asset/resource", //resource对文件原样的输出
- generator: {
- //输出media名称
- filename: "static/media/[hash:10][ext][query]",
- },
- },
- {
- test: /\.js$/,
- exclude: /(node_modules)/, //排除node_modules不做js转换处理
- use: {
- loader: "babel-loader",
- // options: {options配置可以写到babel.config.js文件中好维护
- // presets: ["@babel/preset-env"],
- // },
- },
- },
- ],
- },
- }