[Tools] PostCSS custom plugin

news/2025/3/17 14:28:03/文章来源:https://www.cnblogs.com/Answer1215/p/18776788

自定义插件

在 PostCSS 官网,实际上已经介绍了如何去编写一个自定义插件:https://postcss.org/docs/writing-a-postcss-plugin

  1. 需要有一个模板
module.exports = (opts = {}) => {// Plugin creator to check options or prepare cachesreturn {postcssPlugin: 'PLUGIN NAME'// Plugin listeners}
}
module.exports.postcss = true

接下来就可以在插件里面添加一组监听器,对应的能够设置的监听器如下:

  • Root: node of the top of the tree, which represent CSS file.
  • AtRule: statements begin with @ like @charset "UTF-8" or @media (screen) {}.
  • Rule: selector with declaration inside. For instance input, button {}.
  • Declaration: key-value pair like color: black;
  • Comment: stand-alone comment. Comments inside selectors, at-rule parameters and values are stored in node’s raws property.
  1. 具体示例

现在在我们的 src 中新建一个 my-plugin.js 的文件,代码如下:

module.exports = (opts = {}) => {// Plugin creator to check options or prepare cachesreturn {postcssPlugin: "PLUGIN NAME",Declaration(decl){console.log(decl.prop, decl.value)}};
};
module.exports.postcss = true;

在上面的代码中,我们添加了 Declaration 的监听器,通过该监听器能够拿到 CSS 文件中所有的声明。

接下来我们就可以对其进行相应的操作。

现在我们来做一个具体的示例:编写一个插件,该插件能够将 CSS 代码中所有的颜色统一转为十六进制。

这里我们需要使用到一个依赖包:color 该依赖就是专门做颜色处理的

pnpm add color -D

之后通过该依赖所提供的 hex 方法来进行颜色值的修改,具体代码如下:

const Color = require("color");module.exports = (opts = {}) => {// Plugin creator to check options or prepare cachesreturn {postcssPlugin: "convertColorsToHex",Declaration(decl) {// 先创建一个正则表达式,提取出如下的声明// 因为如下的声明对应的值一般都是颜色值const colorRegex = /(^color)|(^background(-color)?)/;if (colorRegex.test(decl.prop)) {try {// 将颜色值转为 Color 对象,因为这个 Color 对象对应了一系列的方法// 方便我们进行转换const color = Color(decl.value);// 将颜色值转换为十六进制const hex = color.hex();// 更新属性值decl.value = hex;} catch (err) {console.error(`[convertColorsToHex] Error processing ${decl.prop}: ${error.message}`);}}},};
};
module.exports.postcss = true;

Running the demo:

const fs = require("fs"); // 负责处理和文件读取相关的事情
const postcss = require("postcss");// 引入我们自定义的插件
const myPlugin = require("./my-plugin.js");const style = fs.readFileSync("src/index.css", "utf8");postcss([myPlugin]).process(style, { from: undefined }).then((res) => {console.log(res.css);});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/900377.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

phos 的 checkpoint

我们继续追踪 pos_cli --dump --dir /root/ckpt --pid [your program pid] 的checkpoint阶段 phos的checkpoint在handle_dump函数(pos/cli/src/dump.cpp)中实现 函数开始阶段定义各种变量和初始化我们先来看--pid 在识别到clio.action_type == kPOS_CliMeta_Pid后,我们来到规则…

数据库原理复习

自用数据库原理复习数据库复习 第一章 数据库发展史 1、数据管理技术的发展(特点) 人工管理阶段,文件系统阶段,数据库技术,文件系统的缺陷(数据冗余性,数据不一致性、数据联系弱) 2、数据库技术的产生 进入数据库阶段的标志是20世纪60年代末的三件大事 1968年IBM公司研…

碰撞检测

碰撞产生的必要条件是两个物体都有碰撞器(Collider),至少一个物体有刚体(rigidbody) 有了刚体才会模拟受到力的作用 Mass - 质量 默认为千克 Drag - 阻力 0表示没有阻力 Angular Drag - 扭矩阻力 阻碍旋转的阻力 0表示没有阻力 Is Kinematic - 如果启动此选项,则对象将不会被…

未通过针对firfox的验证,现已被禁用

相信大家很多都碰到过这种问题,我也是网上找了很多方法,都不是很好用,最后破罐子破摔结果就解决了怎么解决呢,直接更新好吧,直接更新最新版本更新完了之后你就会发现解决了,一切都解决了 当然这里只是给大家提供一种思路,虽然网上很多都是复制粘贴,但是特定情况下肯定也…

PCB不同层级的功能和作用

PCB不同层级的功能和作用 示意图:以AltiumDesign为例,各层用途Gerber文件和Altium Design PCB 层级对应关系嘉立创生成geber文件对应功能 生成后的Gerber文件是一个压缩包,解压后文件如下:文件名 类型 备注/说明Gerber_BoardOutline.GKO 边框文件 PCB板厂根据该文件进行切割…

nginx 简单实践:负载均衡【nginx 实践系列之四】

本文为 nginx 简单实践系列文章之三,主要简单实践了负载均衡,仅供参考。〇、前言 本文为 nginx 简单实践系列文章之三,主要简单实践了负载均衡,仅供参考。 关于 Nginx 基础,以及安装和配置详解,可以参考博主过往文章: https://www.cnblogs.com/hnzhengfy/p/Nginx.html …

EFcore 实现带UI的自定义日志记录提供程序

基于 EFcore 实现了一个 .net core 日志记录程序,支持使用 .net 原生的日志框架 Microsoft.Extensions.Logging 将应用程序日志写入关系型数据库,目前支持三种关系型数据库(MS SQL Server、MySQL、PostgreSQL)。日志查看面板 UI 使用 vue3 开发,以嵌入的方式集成到程序集中…

ASE50N30-ASEMI智能家居专用ASE50N30

ASE50N30-ASEMI智能家居专用ASE50N30编辑:ll ASE50N30-ASEMI智能家居专用ASE50N30 型号:ASE50N30 品牌:ASEMI 封装:TO-247 批号:最新 最大漏源电流:50A 漏源击穿电压:300V RDS(ON)Max:68mΩ 引脚数量:3 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:N沟道MO…

wr30u 救砖

变砖了 给 wr30u 刷成了 at3000 的uboot,进而导致我的wr30u路由器成了转,进不去uboot了! 准备硬件 usb转串口设备 购买 usb转串口(ttl)设备,在淘宝随便买就行 没啥差别,几块钱一个:目前流行ch340系列的,推荐 ch340g 即可, 功能更强大也贵杜邦线 一般 你在购买 usb转串口…

滑动窗口-2962.统计最大元素出现至少k次的子数组

设 mx=max(nums)。 右端点 right 从左到右遍历 nums。遍历到元素 x=nums[right] 时,如果 x=mx,就把计数器 cntMx 加一。 如果此时 cntMx=k,则不断右移左指针 left,直到窗口内的 mx 的出现次数小于 k 为止。此时,对于右端点为 right 且左端点小于 left 的子数组,mx 的出现…

The Hackers Labs (防御靶场练习)

我打蓝队时我们队的靶机be like:The Hackers Labs (防御靶场练习) Binary Trail(二进制痕迹) 对公司基础设施至关重要的 Linux 服务器已显示出可疑活动的迹象。在例行审计期间,已发现位于非标准目录中的未知二进制文件的存在。此文件的性质和来源尚不确定,但其行为表明可…