使用postcss,工作效率提升30%

137 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 3 天,点击查看活动详情

前言

提高工作效率,腾出更多的时间来摸鱼,是我一直的追求的目标。使用更高效的工具,可以帮助我们提高工作效率。所以就让我们一起来探索postcss,看他如何提高我们的工作效率

what is postcss?

PostCSS 不是预处理器(尽管它可以表现得像一个),他其实是一个node.js工具,A tool for transforming CSS with JavaScript,一个用Javascript转化css的工具

实际上,PostCSS 的主要功能只有两个:

  • 第一个就是前面提到的把 CSS 解析成 JavaScript 可以操作的 AST,
  • 第二个就是调用插件来处理 AST 并得到结果。

再用一句话改过postcss,postcss对于css就像babel对于js

what is the advantage of postcss?

  • 让你可以在浏览器中使用最新的css语法,postcss可以帮你转到浏览器可以识别的样式,就像babel可以把es6语法转化为es5一样
  • postcss的插件可以帮你在样式上添加浏览器厂商的前缀,进行浏览器兼容
  • 拥有极高的处理性能(3倍以上的处理速度
  • 多样化的功能插件,创建了一个生态的插件系统

postcss与webpack的结合

不结合webpack的知识咱们不就不讲了, 因为官网上有,咱怎么写也写不过官网。

先实现一个最简单的使用postcss-loader的环境

那我们要先明白postcss-loader是用来干什么的?

what is postcss-loader?

它负责把 CSS 代码解析成抽象语法树结构(Abstract Syntax Tree,AST),再交由插件来进行处理。插件基于 CSS 代码的 AST 所能进行的操作是多种多样的,比如可以支持变量和混入(mixin),增加浏览器相关的声明前缀,或是把使用将来的 CSS 规范的样式规则转译(transpile)成当前的 CSS 规范支持的格式。从这个角度来说,PostCSS 的强大之处在于其不断发展的插件体系。目前 PostCSS 已经有 200 多个功能各异的插件。开发人员也可以根据项目的需要,开发出自己的 PostCSS 插件。

webpack配置

目录如下

image.png

需要安装的依赖

npm i webpack webpack-cli css-loader mini-css-extract-plugin postcss-loader -D

webpack.config.js

const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');


module.exports = {
  mode: 'development',
  entry: './src/index.js',
  output: {
    path: path.join(__dirname, './dist'),
    filename: 'build.js'
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: [
          MiniCssExtractPlugin.loader,
          'css-loader',
          'postcss-loader'
        ]
      }
    ]
  },
  plugins: [new MiniCssExtractPlugin()]
}

index.js

import './index.css';

index.css

.hello {
  box-sizing: border-box;
}

package.json中的script配置如下

  "scripts": {
    "start": "webpack --config webpack.config.js"
  },

执行命令

npm start

就可以看到dist下面多出两个文件

image.png

查看main.css

/*!***********************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./src/index.css ***!
  \***********************************************************************************************************/
.hello {
  box-sizing: border-box;
}

postcss 插件的使用

autoprefixer

autoprefixer: 意思是自动添加前缀
利用从 Can I Use 网站获取的数据为 CSS 规则添加特定厂商的前缀。Autoprefixer 自动获取浏览器的流行度和能够支持的属性,并根据这些数据帮你自动为 CSS 规则添加前缀。

安装:npm i autoprefixer -D
postcss.config.js 引入插件

module.exports = {
  plugins: [
    require('autoprefixer'),
  ]
}

在package.json添加如下配置

"browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version",
      "last 1 ie version"
    ]
  }

修改一下index.css文件

.hello {
  box-sizing: border-box;
  transform: scale(0.5);
}

然后再进行打包

/*!***********************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./src/index.css ***!
  \***********************************************************************************************************/
.hello {
  box-sizing: border-box;
  -webkit-transform: scale(0.5);
          transform: scale(0.5);
}

发现为特定浏览器厂商添加了前缀,good

postcss-preset-env

看到这个是不是和babel-preset-env很像呀,它的工作原理和babel-preset-env是一样的,都是把语法转化为当前浏览器能够理解的代码,会根据你的目标浏览器确定你需要的polyfills

postcss-preset-env 已经内置了 autoprefixer、postcss-nesting/postcss-nested(嵌套)、postcss-import(使用import引入css文件) 等相关功能。

所以我们使用postcss-loader完全只需要装一个postcss-preset-env插件就可以满足大部分需求了(相同的是babel-loader也只需要安装babel-preset-env这一个预设就可以了)

接下来我们把autoprefixer去掉,使用postcss-preset-env插件(虽然名字中有预设两个字,但是是一个插件)

打包后,发现文件内容和autoprefixer的效果是一致的,good

/*!***********************************************************************************************************!*\
  !*** css ./node_modules/css-loader/dist/cjs.js!./node_modules/postcss-loader/dist/cjs.js!./src/index.css ***!
  \***********************************************************************************************************/
.hello {
  box-sizing: border-box;
  -webkit-transform: scale(0.5);
          transform: scale(0.5);
}

参考