当前位置: 首页 > 软件库 > Web应用开发 > CSS框架 >

PowCSS

CSS 预处理工具
授权协议 MIT
开发语言 JavaScript
所属分类 Web应用开发、 CSS框架
软件类型 开源软件
地区 国产
投 递 者 鄢选
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

PowCSS

PowCSS 是个 CSS 预处理工具. 特征:

混合 CSS, JavaScript 缩进语法
编译结果是原生 JavaScript 函数

用 PowCSS 写 CSS 才够原生

image

工作原理:

针对 CSS 语法特点对源码进行 Tree 结构转化, 丢弃行尾注释, 续行被拼接为单行
编译插件对节点进行编译并返回编译后的代码, 嵌套占位符为 '...'
依据 Tree 结构, 把这些代码拼接(嵌套)到一起

PowCSS 的写法简单直接, 示例:

let x = [1,2,3];
each(x, (n, i) => {...}) // 源码中自带嵌套占位符
  col-${n}
    color: red

编译步骤分解:

step 1

let x = [1,2,3]; // JS 原生语法, 原样保留

step 2

let x = [1,2,3];
ctx.each(x, (n, i) => {...}) // 插件只是补全了 ctx., 也可以在源码中直接这样写.

step 3

let x = [1,2,3];
ctx.each(x, (n, i) => {
  // 嵌套占位符被 'col-${n}' 生成的代码替换, 'col-${n}' 也产生了新的嵌套占位符
  ctx.open(`col-${n}`);
  ...
  ctx.close();
})

step 4

let x = [1,2,3];
ctx.each(x, (n, i) => {
  ctx.open(`col-${n}`);
  // 嵌套占位符被 'color: red' 生成的代码替换, 没有产生新的嵌套占位符
  ctx.decl('color', 'red');
  ctx.close();
})

最终的编译结果:

function(ctx) {
  let x = [1,2,3];
  ctx.each(x, (n, i) => {
    ctx.open(`col-${n}`);
    ctx.decl('color', 'red');
    ctx.close();
  })
  return ctx; // PowCSS 补全最后一条语句
}

编译插件被称作 Compiler, ctx 被称作 Context, 它们配套使用且完成真正的构建行为.

install

nodejs 环境

yarn add powcss

for gulp see gulp-powcss

浏览器环境

usage

nodejs 环境, 演示 runkit

const powcss = require('powcss');

// const context = require('powcss/lib/context');

let ctx = powcss().run(`
.class
  color: green
`);
// ctx.toCSS() or ...

浏览器环境, 演示 codepen, requirebin

缩进语法

PowCSS 支持缩进风格的 CSS 源码, 花括号和分号是可选的, 确保正确的缩进即可.

/**
 * 支持块注释, 单行注释以及行尾注释, '/*!' 开头的顶层注释被保留, 其它注释被抛弃.
 * 兼容 CSS 花括号块写法.
 */

/*!
 * Reserved comment, top and start with '/*!'
 */
selector1 {
  key: val;
}

selector2
  key: val

// 续行符是 '&\,+-/*|=([' 之一
continuation
  border: 1px solid \ // 符号 '\' 会被剔除, 其它续行符会被保留
    red

属性分隔符 ':' 后面必须跟一个空格或换行, 除非该行以 '@' 开头.

Compiler

编译器负责识别嵌入的 ES6 语句, 并编译返回 JS 源代码.

编译器需要实现 compile 方法作为编译接口

/**
 * 编译接口
 * @param  {object}   n  解析后节点树中的一个节点对象
 * @param  {number}   i  节点 n 在 ns 中的序号
 * @param  {object[]} ns 节点 n 所在的兄弟节点集合
 * @return {?string}  js 编译节点 n 产生的 js 源码, 最多包含一个嵌套占位符
 */
compile(n, i, ns){}

PowCSS 实现的 Compiler 直接使用原生 JS 语法, 不对语法进行分析.

参见 API

提示: 把 CSS 当作 JavaScript 来写就对了

源码中比较容易常犯的错误:

// incorrect
if (something)
  color: 1px
  border: 1px

// correct
if (something) {...}
  color: 1px
  border: 1px

下面两种写法具有相同效果:

if (something)
  color: 1px
border: 1px

// same

if (something)
color: 1px
border: 1px

Context

Context 负责提供生成和维护 CSS 规则的基本方法, 值表达式由配套的 Compiler 生成.

PowCSS 实现的 Context 维护规则的 open 和 close 等操作, 并负责处理 '&' 占位符.

参见 API

License

MIT License <https://gitee.com/powjs/powcss/blob/master/LICENSE>

 相关资料
  • 预处理工具 不同的 CSS 预处理工具有着不同的特性、功能以及语法。编码习惯应当根据使用的预处理工具进行扩展, 以适应其特有的功能。推荐在使用 SCSS 时遵守以下指导。 将嵌套深度限制在1级。对于超过2级的嵌套,给予重新评估。这可以避免出现过于详实的 CSS 选择器。 避免大量的嵌套规则。当可读性受到影响时,将之打断。推荐避免出现多于20行的嵌套规则出现。 始终将@extend语句放在声明块的第

  • WebGL着色器语言和C语言一样提供了一些用于预处理的命令#define、#include、#if等以#号开头的命令。 宏定义#define 注意宏定义和着色器声明的变量不同,着色器程序执行前需要进行编译处理,着色器程序编译处理之后程序才会在GPU上执行,宏定义主要是在编译处理阶段起作用。比如宏定义#define PI 3.14,PI符号表示圆周率3.14,如果在代码return float f

  • 在Webpack中,所有预处理器都需要应用相应的加载器。 vue-loader允许你使用其他Webpack加载器处理Vue组件的一部分。它将从语言块的lang属性自动推断出要使用的正确加载器。 CSS 例如,让我们用SASS编译我们的<style>标签: npm install sass-loader node-sass --save-dev <style lang="sass"> /* 在

  • 在 webpack 中,所有的预处理器需要匹配对应的 loader。vue-loader 允许你使用其它 webpack loader 处理 Vue 组件的某一部分。它会根据 lang 属性自动推断出要使用的 loader。 CSS 例如,使用 Sass 编译我们的 <style> 语言块: npm install sass-loader node-sass --save-dev <style

  • 得益于 vue-loader, 我们可以通过 lang 属性在组件中的<template>, <script> 或 <style> 上使用各种预处理器。 举个例子,我们在 pages/index.vue 组件中使用 Pug, CoffeeScript 和 Sass: <template lang="pug"> h1.red Hello {{ name }}! </template> <scr

  • 这个模板已经预设设置大部分流行的css预处理器,包括 LESS, SASS, Stylus, 和 PostCSS。要使用一个预处理器的话 ,所有你需要做的就是安装相应的webpack loader。例如,使用SASS: npm install sass-loader node-sass --save-dev 你需要安装node-sass,因为saas-loader需要这个依赖项 在组件里面使用预

  • #,## # 和 ## 操作符是和#define宏使用的. 使用# 使在#后的首个参数返回为一个带引号的字符串. 例如, 命令 #define to_string( s ) # s 将会使编译器把以下命令 cout << to_string( Hello World! ) << endl; 理解为 cout << "Hello World!" << endl;

  • 预处理命令 #, ## manupilate字符串 #define 定义变量 #error 显示一个错误消息 #if, #ifdef, #ifndef, #else, #elif, #endif 条件操作符 #include 插入其它文件的内容 #line 设置行和文件信息 #pragma 执行特殊命令 #undef 取消定义变量 预定义变量 其它变量