webpack5---3 css兼容性处理

1,940 阅读1分钟

在实际项目中css需要兼容不同的浏览器,那么就需要使用插件将写好的css代码,做兼容性处理。这里我介绍下在 webpack5 中处理兼容性

此时webpack提供了postcss-loader和对应插件postcss-preset-env

而这两个东西的使用在webpack4和webpack5有些许不同

{
    loader: 'postcss-loader',
    options: {
        // webpack4配置
        // ident: 'postcss',
        // plugins: () => [ 
        //     // postcss插件
        //     require('postcss-preset-env')()
        // ]

        //webpack5
        postcssOptions: {
            plugins: [
                require('postcss-preset-env')(),
            ]
        }
    }
}

而对应的插件postcss-preset-env是帮postcss找到package.json中的browserlist里面的配置,通过配置加载指定的css兼容性样式

我们需要对应的在package.json中配置browserlist

"browserslist": {
    "development": [
      "last 1 chrome version"
    ],
    "production": [
      "> 1%",
      "last 2 versions",
      "not ie <= 8"
    ]
}

在打包的过程中默认使用 production 模式, 那么在开发中,需要在webpack.config.js 中将node.js 的环境变量设置为 development
process.env.NODE_ENV = 'development'

以下是自己测试用的代码

/**
 * 开发环境
 */

const {resolve} = require('path')
const htmlWebpackPlugin = require('html-webpack-plugin')
const miniCssExtractPlugin = require('mini-css-extract-plugin')
//process.env.NODE_ENV = 'development'
module.exports = {
  // 入口起点
  entry: './src/index.js',
  // 出口文件
  output: {
    // 输出文件名
    filename: 'built.js',
    path: resolve(__dirname, 'build')
  },
  // loader 的处理
  module: {
    rules: [
      // 详细loader配置
      {
        test: /\.css$/,
        use: [
          // 'style-loader',
          miniCssExtractPlugin.loader,
          'css-loader',
          {
            loader: "postcss-loader",
            options: {
              postcssOptions: {

                plugins: [
                  require('postcss-preset-env')(),
                ]
              }
            }
          },
        ]
      },
      {
        test: /\.less$/,
        use: [
          // 'style-loader',
          miniCssExtractPlugin.loader,
          'css-loader',
          {
            loader: "postcss-loader",
            options: {
              postcssOptions: {

                plugins: [
                  require('postcss-preset-env')(),
                ]
              }
            }
          },
          'less-loader'
        ]
      },
      {
        // 处理图片资源
        test: /\.(jpg|png|gif)$/,
        // 使用一个loader
        loader: "url-loader",
        options: {
          // 图片小于 8kb 就处理为 base64
          limit: 8*1024,
          // 关闭es6 模式
          esModule: false,
          // 给图片重命名, ext 取源文件的扩展名
          name: '[hash:10].[ext]',
          // 将图片输出到输出目录的 img 下
          outputPath: 'img'
        },
        
      },
      {
        test: /\.html$/,
        loader:"html-loader"
      },
      {
        exclude: /\.(html|css|less|jpg|png|js|gif)/,
        loader: "file-loader",
        options: {
          name: "[hash:10].[ext]"
        }
      }
    ]
  },
  // plugins 配置
  plugins: [
    // 详细plugins 的配置
    new htmlWebpackPlugin({
      template: './index.html',
    }),
    new miniCssExtractPlugin({
      filename: "css/[name].css"
    })
  ],
  // 模式
  //mode: "development",
   mode: "production",
  
  devServer: {
    // 
    contentBase: resolve(__dirname,'build'),
    // 启动gzip 压缩
    compress: true,
    // 端口号
    port: 3000,
    // 自动打开浏览器
    open: true
  },
  
}