浅谈PostCSS

1. 背景

  • css的预处理器语言(比如 sass, less, stylus)的扩展性不好,你可以使用它们已有的功能,但如果想做扩展就没那么容易。

  • sass是很常用的css预处理器语言,在webpack中要使用它,需要安装sass-loader,而sass-loader又依赖于node-sass。大家知道node-sass很庞大,安装极其缓慢,经常安装失败。而且node-sass各版本对于node版本有严格限制,经常造成为了安装某个node-sass版本而升级node版本的问题(在本地这没有问题,但在服务器上升级node可能牵连很大)。

  • vue项目,都安装了postcss(因为它是vue-loader的依赖项)。我们没必要再安装其它工具处理css。

2. 什么是PostCSS

  • 它是一个js库,能够将css转换成js。

  • 它将css转换成AST语法树(表现为js对象),然后借助各种plugins对转化后的js对象进行操作,最终转化回css。

  • 所以说postcss是不会影响css的,只有安装和配置plugin之后,才会影响css。

  • postcss可以看作是css的babel。

3. 如何在vue 项目 中使用和配置 PostCSS

3.1 webpack中如何使用PostCSS

使用webpack的vue项目,都会安装vue-loader(它是一个webpack的loader,用来将vue sfc组件转换成js模块)。而vue-loader正是借助postcss实现scoped css的,因此安装了vue-loader就默认安装了postcss。当然默认它并不包含我们需要的特性,因此我们就要安装插件并配置。

关于安装何种插件,我们会在后面介绍几种常用的插件。

++vue-loader++可以自动加载以下3种postcss的配置文件

  1. postcss.config.js

  2. .postcssrc

  3. package.json 中的postcss字段

这里我们主要介绍第一种postcss.config.js,其格式如下

注意: 需要先安装插件

javascript 复制代码
module.exports = {
    plugins: [
        ['postcss-import', { path: ['src/css/'] }],
        'postcss-mixins',
        'postcss-nested',
        'postcss-color-mod-function',
        ['postcss-cssnext', {
            warnForDuplicates: false,
        }],
        ['cssnano', {
            sourcemap: false,
            autoprefixer: false,
            safe: true,
            discardComments: {
                removeAll: true,
            },
            discardUnused: false,
            zindex: false,
        }]
    ]
};

对postcss的配置,可以查阅 GitHub - webpack-contrib/postcss-loader: PostCSS loader for webpack

3.2 rollup中如何使用PostCSS

rollup需要引入++rollup-plugin-postcss++,并在rollup.config.js配置postcss,样例如下

rollup-plugin-postcss的配置,参见++官方文档++

javascript 复制代码
// rollup.config.js
import postcss from 'rollup-plugin-postcss'

export default {
  plugins: [
    postcss({
      plugins: []
    })
  ]
}

4. 常用PostCSS 插件

postcss-import4.1 postcss-import:允许从其它 css 文件引入css。

注意:这个插件一般需要放在插件列表的第一位,这样才能保证其它的插件工作正常。

方式:

  • 引入时,指定路径,则从路径下查找
javascript 复制代码
@import '../css/styles.css';
  • 配置中指定 path, 并直接引入文件名,此时会从path查找
javascript 复制代码
// postcss.config.js
['postcss-import', { path: ['src/css/'] }] // 在postcss.config.js中,指定path
javascript 复制代码
// 在文件中引入
@import 'styles.css'; // 会加载src/css/styles.css

4.2 ++++ : 允许mixin

注意: 如果和postcss-simple-vars或者postcss-nested同用,此插件必须放在postcss-simple-vars或者postcss-nested之前

4.3 ++++ :允许像 scss 那样定义变量

javascript 复制代码
$dir:    top;
$blue:   #056ef0;
$column: 200px;

.menu_link {
  background: $blue;
  width: $column;
}
.menu {
  width: calc(4 * $column);
  margin-$(dir): 10px;
}

4.4 ++++ :允许书写嵌套语法

javascript 复制代码
// postcss.config.js
module.exports = {
    plugins: [
        ['postcss-import', { path: ['src/css/'] }],
        'postcss-nested'
    ]
};

4.5 ++++ :用来压缩 css

4.6 ++++ :在老旧浏览器上使用新的或者未来的 css 特性

该插件包含丰富的可选功能,可查看文档选择。这里主要用其控制自定义变量(custom variables),所以介绍如何配置以支持custom variables。

javascript 复制代码
// 配置
module.exports = {
    plugins: [
        ['postcss-import', { path: ['src/css/'] }],
        ['postcss-preset-env', {
            stage: 2,
            // preserve 决定所有的插件是否接受preserve属性(保留(true)或者忽略(false)其它polyfilled css(css的兜底方案)),
            // 这里preserve: false很关键,否则,自定义变量不起效
            preserve: false, 
            // feature详情可查看https://github.com/csstools/postcss-plugins/blob/main/plugin-packs/postcss-preset-env/FEATURES.md
            // 它里面有每个特性的文档和样例
            features: {
                'custom-selectors': true, // 自定义选择器
                'custom-properties': true, // 自定义变量
            },
            // importFrom 用来指定从哪里导入各类变量(比如 Custom Media, Custom Properties, Custom Selectors, Environment Variables)
            // 如果只引入单个文件,可以不用数组
            importFrom: ['./src/css/colorDef.css']
        }]
    ]
};

引入变量时,不需要使用@import

javascript 复制代码
<style lang="postcss" scoped>
  /* 变量--color-danger 是在 'src/css/colorDef.css'文件定义的, 但不用导入css文件 */
  .about {
    .about-details {
      color: var(--color-danger);
      width: 100px;
    }
  }
</style>

postcss-preset-env 可以配置多个特性,见++特性列表++。

4.7 postcss-px-to-viewport

rem 响应式布局的缺陷:必须通过 js 来动态控制根元素font-size的大小。

postcss-px-to-viewport 的配置项

javascript 复制代码
{
    unitToConvert: "px", // 要转化的单位
    viewportWidth: 3024, // UI设计稿的宽度
    unitPrecision: 2, // 转换后的精度,即小数点位数
    propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
    viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vw
    fontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vw
    // selectorBlackList: ["wrap"], // 指定不转换为视窗单位的类名,
    minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
    // mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
    replace: true, // 是否转换后直接更换属性值
    // exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配
    landscape: false // 是否处理横屏情况
}

5. 团队介绍

三翼鸟数字化技术平台-ToC服务平台」以用户行为数据为基础,利用推荐引擎为用户提供"千人千面"的个性化推荐服务,改善用户体验,持续提升核心业务指标。通过构建高效、智能的线上运营系统,全面整合数据资产,实现数据分析-人群圈选-用户触达-后效分析-策略优化的运营闭环,并提供可视化报表,一站式操作提升数字化运营效率。

相关推荐
mldong7 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排8 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60618 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角9 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!10 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰10 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi11 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen12 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马13 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu13 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss