css 兼容性实际上就是根据不同的浏览器内核添加不同的识别前缀。

背景

不同浏览器,不同版本之间css属性存在差异,用 css 前缀来指定特定的内核。

  • -moz-,代表firefox浏览器的私有属性;
  • -ms-,代表ie浏览器的私有属性
  • -webkit-,代表safari、chrome浏览器的私有属性;
  • -o-,代表Opera浏览器的私有属性。

    webpack 5 实现

    package.json 配置

    在 webpack 5 中需要配置浏览器版本(browserslist)列表
    1. {
    2. "browserslist":{
    3. "development":[
    4. "last 1 chrome version",
    5. "last 1 firefox version",
    6. "last 1 safari version"
    7. ],
    8. "production":[
    9. ">0.2%"
    10. ]
    11. }
    12. }

    css 文件

    我们找一个需要转换的属性,如 transform ```css body { background: red; }

.index { color: blue; transform: rotate(-45deg); }

.orange { color: orange; }

  1. 下面是没有做兼容处理时的效果<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1584826/1657102136942-c329f40b-bd56-4974-a62c-788b01e0e468.png#clientId=u7e344423-cfee-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=811&id=uf3663861&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1622&originWidth=2370&originalType=binary&ratio=1&rotation=0&showTitle=false&size=597818&status=done&style=none&taskId=u5f88d93a-f322-4f9e-be32-bd46e4689f6&title=&width=1185)
  2. <a name="WDB5L"></a>
  3. ### 安装依赖
  4. webpack 5 webpack 4 不一样,我们需要 postcss-loader postcss-preset-env 两个包,不需要再额外安装 prefixer 包,postcss-preset-env 中集成了这个包。
  5. ```shell
  6. yarn add postcss-loader postcss-preset-env --dev

配置 postcss.config.js

postcss.config.js 默认在根目录下

/** ./psotcss.config.js **/
let postcssPresetEnv = require('postcss-preset-env');
module.exports = {
  plugins: [
    postcssPresetEnv({
      browsers: 'last 5 version'
    })
  ]
}

配置 webpack.config.js

只需要添加下 post-loader 就行,如下:

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
  devServer: {
    port: 8080,
    open: true,
    compress: true,
    static: './dist',
  },
  entry: {
    index: './src/index.js'
  },
  output:{
    path: path.resolve(__dirname, './dist'),
    filename: '[name].[hash:8].js'
  },
  resolve:{
    alias: {
      '@':path.resolve('src')
    }
  },
  module:{
    rules: [
      {
        test: /\.css$/,
        use:[
          'style-loader',
          { 
            loader:'css-loader',
          },
          'postcss-loader'
        ]
      }
    ]
  },
  plugins: [
    new webpack.CleanPlugin(),
    new HtmlWebpackPlugin({
      filename:'index.html',
      inject: 'body',
      template:'./public/index.html'
    })
  ]
}

这样打包过后我们再来看一下页面,发现已经对浏览器进行了兼容
image.png

webpack 4 实现

设置属性

设置一个需要前缀的属性(有的属性很通用,不需要前缀),如下:

/** ./src/index.css **/
.cc {
    transform: rotateY(45deg);
}

安装依赖

通过 postcss-loader 和 prefixer 两个npm 包来实现。

yarn add postcss-loader autoprefixer --dev

配置webpack

在匹配 css 文件的 loader 中加入 postcss-loader,并将 autoprefixer 加入postcss-loader 的插件中,如下:

let path = require('path');
let { CleanWebpackPlugin } = require('clean-webpack-plugin');
let HtmlWebpackPlugin = require('html-webpack-plugin');

let htmlPlugins = ['index'].map(chunkName => {
  return new HtmlWebpackPlugin({
    filename:`${chunkName}.html`,
    inject: 'body',
    chunks:[chunkName]
  })
});

module.exports = {
  mode: 'development',
  entry: {
    index: './src/index.js'
  },
  output: {
    filename: '[name].[contenthash:8].js',
    path: path.resolve(__dirname, 'dist')
  },
  module: {
    rules: [
      {
        test:/\.css$/,
        use: [
          'style-loader', 
          {
            loader: 'css-loader',
            options: {
              modules: true
            }
          }, 
          {
            loader: 'postcss-loader',
            options: {
              postcssOptions: {
                plugins: [
                  [
                    'autoprefixer',
                    {
                      //选项
                    }
                  ]
                ]
              }
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin({
      cleanOnceBeforeBuildPatterns: ['**/*']
    }),
    ...htmlPlugins
  ]
}

结果

结果我们就发现打包之后的属性自动加上了内核字符串,做到了兼容css。
image.png

补充

postcss-loader 除了可以在 webpack.config.js 中配置外,还可以单独写一个配置文件,如下:

/** ./webpack.config.js **/
module.exports = {
  //...
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ['style-loader', {
          loader: 'css-loader',
          options: {
            modules: true
          }
        },'postcss-loader']
      }
    ]
  }
  //...
}
/** ./postcss.config.js **/
module.exports = {
    plugins: [
        require('autoprefixer')
    ]
}