JSDOM для эмуляции работы браузераPostCSS для парсинга CSSnpm install uncss
const uncss = require('uncss');
const files = ['index.html', 'https://google.com'];
uncss(files, function (error, clearCSS) {
console.log(clearCSS);
});
CSS, добавленный на JSJSDOM, не требует запуска браузераonload"DOMCheerio для работы с DOMCSSOM для парсинга CSSnpm install ucss
UnCSS
<script src="helium.js"></script>
<script type="text/javascript">
window.addEventListener('load', function(){
helium.init();
}, false);
</script>
Как мы узнаем о том, что CSS код мертв? Несмотря на то, что инструменты вроде uncss очень мощные, они не совсем подходят под наши требования. А что, если нам нужно решение в основу которого положен принцип мониторинга реальных пользователей, который позволяет увидеть какой код действительно используется у реальных пользователей на реальном сайте?
.some .selector {
background-image: url('/img/dead/some_selector.gif');
color: red;
padding: 0;
}
.title-search-item :hover {
/* declarations */
prop: value;
...
}
@media screen and (max-width: 1200px) {
/* rules */
...
}
.title-search-item { ... }
.title-search-item a:hover { ... }
.title-search-item :hover { ... }
.cart-amount__title::after { ... }
/(>?\s?:[\S]+)/g
![]() |
![]() |
![]() |
| Rework CSS parser | CSSTree | PostCSS |
const parser = require('css')
...
var { stylesheet: { rules } } = parser.parse(cssString)
walker(rules, (filtered) => {
...
}, walker);
const csstree = require('css-tree');
...
var ast = csstree.parse(cssString);
csstree.walk(ast, function(node) {
...
});
//csstree.generate(ast)
const postcss = require('postcss');
const proc = postcss((ast) => {
ast.walkRules(/^\D/, (rule) => {
let { selector } = rule;
...
});
}).process(cssString).then(result => {...});
ast.walkRules(/^\D/, (rule) => {
let { selector } = rule;
selector = selector.replace(/\n/g, '');
selectors.push(...selector.split(','));
});
[
".rightcol-profile .button-cancel",
".cart-step-3 .prb span",
"#block-analogues-popup .prb span",
".cart-step-3 .prb.old::after",
...
]
document.querySelector(selector)
и отбирают только существующие
localStorage и БД
DOM EventListener
{
"url" : "/index.html",
"data" : [
".rightcol-profile .button-cancel",
".cart-step-3 .prb span",
".selector1", ".selector2", ".selector3"
...
]
}
cssclear index ./css path/to/selectors.json
cssclear clear -f path/to/live.json ./css ./dest
<script>
var cssClear = {
pathToSelectors: 'https://yourdomain.com/selectors.json',
dataStoreProvider: {
name: 'postData',
options: {
apiKey: "d58e3582afa99040e27b92b13c8f2280",
URL: 'https://apidomain.com/save/point/'
}
}
};
</script>
<script async src="path/to/csscleaner.bundle.js"></script>
|
Denis Zavgorodny |