CSS AST分析器

时间:2016-07-22 10:20:09

标签: javascript css optimization abstract-syntax-tree

我有风格

.a{width: 10px;}
...
.a{width: 20px;}
很明显,第一个选择器未使用。 我搜索一个工具,在css中提供有关这些地方的信息。 例如getUnusedRule(styles) - > style.css,rule,selector,smth中的行号。其他

第二种情况是通知过于嵌套的选择器

.a .b .c .d{...}

getTooLongSelectors(styles, maxNestingNum) - >信息在源代码中找到位置

我不想缩小输出css,但需要在代码中找到这样的位置并手动修复它。 关键是不要缩小代码,而是要使源代码更准确,以便更好地维护并防止堆积不必要的东西。

我认为它可能是css AST analizer,它输出手动源代码改进的信息。

我首选 javascript 工具,我们在团队中有一些js程序。

有什么想法吗?不只是现成的工具,而是欢迎的思维方式。

1 个答案:

答案 0 :(得分:1)

你想要的基本上是一个linter,也许你不需要建立自己的。你可能对CSSLint感兴趣。它由nodeJS构成,并提出了许多预编码规则。

否则,您可以使用reworkCSS访问简单的AST。

'use strict';

var fs = require('fs');
var path = require('path');
var rework = require('css');

// Usage control
if (process.argv.length != 3) {
    console.log('Usage: node index.js ./path/to/my/stylesheet.css');
    process.exit();
}

// Read a file (relative path) with node
function readFile(fileName, cb) {
    var filePath = path.join(__dirname, fileName);
    fs.readFile(filePath, {encoding: 'utf-8'}, function (error, data) {
        if (error) {
            console.log(error);
            process.exit();
        }

        cb(data);
    });
}

// A nice way to walk through every rule
function walkRules(rules, linters) {
    rules.forEach(function(rule) {
        if (rule.rules) {
            walkRules(rule.rules);
        }
        linters.forEach(function(linter){
            linter(rule);
        });
    });
}

// A custom linter
function checkRule(rule) {
    if (rule.selectors) {
        rule.selectors.forEach(function(selector) {
            if (selector.length > 20) {
                console.log('Line ' + rule.position.start.line + ': too long selector "' + selector + '"');
            }
        });
    }
}

// Main part
var fileName = process.argv[2];
readFile(fileName, function(css) {
    var ast = rework.parse(css);
    walkRules(ast.stylesheet.rules, [checkRule]);
});