postcss 是一个用javascript 工具和插件转换css 代码的工具。比如我们可以使用Autoprefixer 插件来自动获取浏览器的流行度和能够支持的属性,并根据这些数据帮我们自动的为css 规则添加前缀,将最新的css 语法转换成大多数浏览器都能理解的语法。

    css 模块能让我们永远不用担心命名太大众化而造成冲突

    postcss 与webpack 结合使用,需要安装style-loader、 css-loader、 postcss-loader 三个loader

    Autoprefixer 插件
    比如有时候我们的部分浏览器不支持css3的display: flex 属性,那么我们就需要在此属性前添加对应的前缀来兼容。这个时候我们就可以使用Autoprefixer 插件配合postcss来完成。

    安装Autoprefixer 插件

    1. npm install autoprefixer -D

    创建 postcss.config.js 文件

    1. // postcss.config.js
    2. module.exports = {
    3. plugins: [
    4. require('autoprefixer')
    5. ]
    6. }

    同时在webpack.config.js 配置相关loader

    1. // webpack.config.js
    2. module.exports = {
    3. module: {
    4. rules:[
    5. {
    6. test: /\.css$/,
    7. exclude: /node_modules/,
    8. use: ['style-loader', 'css-loader', 'postcss-loader']
    9. }
    10. ]
    11. }
    12. }

    我们还需要在 package.json 约定浏览器版本

    1. // package.json
    2. {
    3. "browserslist": [
    4. "> 1%", // 支持的浏览器为全球使用率在1%以上的浏览器
    5. "last 2 version" // 浏览器版本为最新的2个版本
    6. ]
    7. }

    最终效果显示
    image.png

    css 模块

    启用css 模块

    1. // webpack.config.js
    2. module.exports = {
    3. module: {
    4. rules:[
    5. {
    6. test: /\.css$/,
    7. exclude: /node_modules/,
    8. use: [
    9. 'style-loader',
    10. {
    11. loader: 'css-loader',
    12. options: {
    13. modules: true
    14. }
    15. },
    16. 'postcss-loader'
    17. ]
    18. }
    19. ]
    20. }
    21. }

    同时在引入css文件的地方,引入的是一个模块

    1. // index.css
    2. body {
    3. background-color: green;
    4. display: flex;
    5. }
    6. body .box {
    7. height: 100px;
    8. width: 100px;
    9. background-color: red;
    10. }
    1. // index.js
    2. // 以往引入的方式为
    3. // import './index.css'
    4. import style from './index.css'
    5. const div = document.createElement('div')
    6. // div.classList.add('box')
    7. div.classList.add(style.box)
    8. document.body.appendChild(div)

    最终效果展示
    image.png
    image.png

    对于css 模块,我们还可以部分开启 css 模块模式,比如全局样式我们可以冠以 .global 前缀,如:
    .global.css 我们使用普通模式
    .css 其它的css我们使用css 模块模式

    1. // webpack.config.js
    2. module.exports = {
    3. module: {
    4. rules:[
    5. // 匹配启用css模块模式的文件
    6. {
    7. test: new RegExp(`^(?!.*\\.global).*\\.css`),
    8. exclude: [path.resolve(__dirname, '..', 'node_modules')],
    9. use: [
    10. 'style-loader',
    11. {
    12. loader: 'css-loader',
    13. options: {
    14. modules: true
    15. }
    16. },
    17. 'postcss-loader'
    18. ]
    19. },
    20. // 匹配普通模式的文件
    21. {
    22. test: new RegExp(`^(.*\\.global).*\\.css`),
    23. exclude: [path.resolve(__dirname, '..', 'node_modules')],
    24. use: [
    25. 'style-loader',
    26. 'css-loader',
    27. 'postcss-loader'
    28. ]
    29. }
    30. ]
    31. }
    32. }