|
|
@@ -26,11 +26,11 @@ this.rulesMinifier = this.rulesMinifier || (() => {
|
|
|
|
|
|
return {
|
|
|
process: doc => {
|
|
|
- const rulesCache = {
|
|
|
- selectors: {},
|
|
|
+ const rulesData = {
|
|
|
+ selectors: new Set(),
|
|
|
fonts: {
|
|
|
- declared: {},
|
|
|
- used: {}
|
|
|
+ declared: new Set(),
|
|
|
+ used: new Set()
|
|
|
}
|
|
|
};
|
|
|
const stats = {
|
|
|
@@ -41,11 +41,11 @@ this.rulesMinifier = this.rulesMinifier || (() => {
|
|
|
if (style.sheet) {
|
|
|
const processed = style.sheet.cssRules.length;
|
|
|
stats.processed += processed;
|
|
|
- style.textContent = processRules(doc, style.sheet.cssRules, rulesCache);
|
|
|
+ style.textContent = processRules(doc, style.sheet.cssRules, rulesData);
|
|
|
stats.discarded += processed - style.sheet.cssRules.length;
|
|
|
}
|
|
|
});
|
|
|
- const unusedFonts = Object.keys(rulesCache.fonts.declared).filter(fontFamily => !Object.keys(rulesCache.fonts.used).includes(fontFamily));
|
|
|
+ const unusedFonts = Array.from(rulesData.fonts.declared).filter(fontFamily => !rulesData.fonts.used.has(fontFamily));
|
|
|
doc.querySelectorAll("style").forEach(style => {
|
|
|
if (style.sheet) {
|
|
|
const processed = style.sheet.cssRules.length;
|
|
|
@@ -57,23 +57,23 @@ this.rulesMinifier = this.rulesMinifier || (() => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- function processRules(doc, rules, cache) {
|
|
|
+ function processRules(doc, rules, rulesData) {
|
|
|
let stylesheetContent = "";
|
|
|
if (rules) {
|
|
|
Array.from(rules).forEach(rule => {
|
|
|
if (rule.media) {
|
|
|
stylesheetContent += "@media " + Array.prototype.join.call(rule.media, ",") + " {";
|
|
|
- stylesheetContent += processRules(doc, rule.cssRules, cache);
|
|
|
+ stylesheetContent += processRules(doc, rule.cssRules, rulesData);
|
|
|
stylesheetContent += "}";
|
|
|
} else if (rule.selectorText) {
|
|
|
const selector = getFilteredSelector(rule.selectorText);
|
|
|
if (selector) {
|
|
|
try {
|
|
|
- if (cache.selectors[selector] || doc.querySelector(selector)) {
|
|
|
+ if (rulesData.selectors.has(selector) || doc.querySelector(selector)) {
|
|
|
stylesheetContent += rule.cssText;
|
|
|
- cache.selectors[selector] = true;
|
|
|
+ rulesData.selectors.add(selector);
|
|
|
if (rule.style.fontFamily) {
|
|
|
- rule.style.fontFamily.split(",").forEach(fontFamily => cache.fonts.used[fontFamily.trim()] = true);
|
|
|
+ rule.style.fontFamily.split(",").forEach(fontFamily => rulesData.fonts.used.add(fontFamily.trim()));
|
|
|
}
|
|
|
}
|
|
|
} catch (error) {
|
|
|
@@ -82,7 +82,7 @@ this.rulesMinifier = this.rulesMinifier || (() => {
|
|
|
}
|
|
|
} else {
|
|
|
if (rule.type == CSSRule.FONT_FACE_RULE) {
|
|
|
- cache.fonts.declared[rule.style.fontFamily.trim()] = true;
|
|
|
+ rulesData.fonts.declared.add(rule.style.fontFamily.trim());
|
|
|
}
|
|
|
stylesheetContent += rule.cssText;
|
|
|
}
|