postcss插件开发:全局添加namespace

Posted 小章鱼哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了postcss插件开发:全局添加namespace相关的知识,希望对你有一定的参考价值。

文章目录


好久不见~

话不多说

postcss

一款css处理的平台,官方文档提供非常全面的api,可以对css的定义,修饰,语句进行定制。

常见很多postcss基础的插件,在官方git仓库中都有提到:https://github.com/postcss/postcss

开发postcss插件

我这边有一个需求,是希望可以全局添加一个namespace。

就想到可以添加postcss插件,为每条选择器添加自己的头部。

话不多说,上代码:

const postcss = require('postcss');

module.exports = postcss.plugin('postcss-global-namespace', opts => 
	
	opts = opts || ;
	let globalClsName = opts.hasOwnProperty('globalClsName') && opts.globalClsName
  return root => 
		root.walk(node => 
			let selectorArr = (node.selector || '').split(',')
			return node.selector = ((selectorArr || []).map((itm) => 
				if (itm.match(/^(\\s*)(html|body)(\\s*)$/)) 
					return itm
				
				return globalClsName + ' ' + itm
			).join(','))
		)

	;

)

usage:

// postcssrc.js

module.exports = 
  "plugins": 
    ...
    "postcss-global-namespace": 
      globalClsName: '.global-name-hahahaha'
    
  

globalClsName是我在postcss插件定义时,添加的props。传入我的postcss-global-namespace之后,我通过root.walk(node,() => ),拿到每一条选择器定义:

// 这就是一条定义
.banner, .banner1 
	color: #abccfc #212231;
	font-size: 1.5em/2;
	font-weight: light;
	position: fixed 0 0;
	size: 100% 48px;

对每一条定义按照,分割开,依次为每一个原子定义添加头部。

output:

.global-name-hahahaha .banner, .global-name-hahahaha .banner1 
	color: #abccfc #212231;
	font-size: 1.5em/2;
	font-weight: light;
	position: fixed 0 0;
	size: 100% 48px;

本插件还对html和body标签做了进行了不处理

if (itm.match(/^(\\s*)(html|body)(\\s*)$/)) 
					return itm
				

默认用户会将.global-name-hahahaha添加到html/body标签,而且业务代码都是从body标签的内部第一个标签开始,所以并没有处理~

单元测试

插件自己最好自带单元测试。

自己写两套css input和output的实例,然后用工具对比就好啦~

var expect = require('chai').expect;

...

describe('test about global classname for css nodes', function() 
  it('test global namespace', function() 
    run(inCase, outCase, globalClsName: '.global-namespace')
  );
);

function run(input, output, opts)  
    return postcss([postcssGlobalNameSpace(opts) ]).process(input) 
    .then(result =>  
     expect(result.css).equal(output); 
     expect(result.warnings().length).equal(0); 
		)
		.catch(err => 
			console.log(err)
		); 
 

打包上传到npm

结语

postcss插件开发非常,简单便捷,灵活

实际上不只是去修改某个css语法,还可以根据自身项目要求,校验某个语法,非常好用的一款插件。

以上是关于postcss插件开发:全局添加namespace的主要内容,如果未能解决你的问题,请参考以下文章

PostCSS理解与运用

Webpack 4:有条件地启用 PostCSS 插件

如何通过新的 @angular/cli v7 angular.json 或 custom-webpack.config.js 添加额外的 postcss 插件?

带有 Next.js 10.0.3 的 Tailwind CSS(PostCSS 插件)在开发环境中导致 Javascript 堆内存不足错误

VUE移动端及PC端适配方案

错误:PostCSS 插件 autoprefixer 需要 PostCSS 8。更新 PostCSS 或降级此插件