使用 Autoprefixer 自动处理浏览器兼容性

Lasted 2020-12-02 14:33:25

Autoprefixer 插件是最流行的 CSS 处理工具之一,用于自动处理浏览器兼容性问题,比如自动添加 CSS 属性前缀。

安装

使用下面的命令安装:

npm install autoprefixer postcss postcss-cli

下载安装完成后,需要在 package.json 中配置一个 script 命令,如下所示,css-prefix 表示自动格式化 css 文件。下面的配置文件有个隐藏的 bug 没有达到预期修改,下面详细讲解。

{
  "name": "npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "css": "npm-run-all css-compile css-prefix",
    "css-compile": "sass ./src/main.scss:./dist/main.css",
    "css-prefix": "postcss dist/*.css --use autoprefixer -d dist/"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "autoprefixer": "^10.0.4",
    "npm-run-all": "^4.1.5",
    "postcss": "^8.1.10",
    "postcss-cli": "^8.3.0",
    "sass": "^1.29.0"
  }
}

运行 npm run 执行 css 命令,如下所示:

npm run css

上面的命令会第一步执行 sass 命令,把 scss 文件编译为 css 文件。第二步 执行 postcss 命令,处理编译后的 css 文件,处理结果如下所示:

::placeholder {
  color: gray;
}

.flex {
  display: flex;
  transition: 1s;
}

编译后的结果如下:

::-moz-placeholder {
  color: gray;
}

:-ms-input-placeholder {
  color: gray;
}

::placeholder {
  color: gray;
}

.flex {
  display: flex;
  transition: 1s;
}

上面结果显示 ::placeholder 属性已经自动替换,但是 display 的 flex 属性和 transition 没有自动处理,没有达到预期效果。

默认情况下 Autoprefixer 只会兼容浏览器当前主版本的前一浏览器版本,隐藏根据当前浏览器主版本不会自动生成 -webkit-。需要在 package.json 文件中添加 browserslist 属性值,如下所示:

{
  "name": "npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "css": "npm-run-all css-compile css-prefix",
    "css-compile": "sass ./src/main.scss:./dist/main.css",
    "css-prefix": "postcss dist/*.css --use autoprefixer -d dist/"
  },
  "author": "",
  "license": "ISC",
  "browserslist": "last 4 versions",
  "dependencies": {
    "autoprefixer": "^10.0.4",
    "npm-run-all": "^4.1.5",
    "postcss": "^8.1.10",
    "postcss-cli": "^8.3.0",
    "sass": "^1.29.0"
  }
}

添加 browserslist 参数后编译的结果如下所示:

::-webkit-input-placeholder {
  color: gray;
}

::-moz-placeholder {
  color: gray;
}

:-ms-input-placeholder {
  color: gray;
}

::-ms-input-placeholder {
  color: gray;
}

::placeholder {
  color: gray;
}

.flex {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-transition: 1s;
  -o-transition: 1s;
  transition: 1s;
}

另外一种方法是在下面下添加 .browserslistrc 文件设置兼容的浏览器版本,Autoprefixer 会根据配置自动决定兼容的浏览器

# https://github.com/browserslist/browserslist#readme

>= 1%
last 1 major version
not dead
Chrome >= 60
Firefox >= 60
# needed since Legacy Edge still has usage; 79 was the first Chromium Edge version
# should be removed in the future when its usage drops or when it's moved to dead browsers
not Edge < 79
iOS >= 10
Safari >= 10
Android >= 6
not Explorer <= 11
注:.browserslistrc 和 package.json 文件的 browserslist 不能同时使用,同时使用报错误:contains both .browserslistrc and package.json with browsers