瀏覽代碼

added cache

Gildas 7 年之前
父節點
當前提交
9467a312d9
共有 1 個文件被更改,包括 20 次插入10 次删除
  1. 20 10
      lib/single-file/css-rules-minifier.js

+ 20 - 10
lib/single-file/css-rules-minifier.js

@@ -32,6 +32,7 @@ this.cssMinifier = this.cssMinifier || (() => {
 			const rulesMatcher = RulesMatcher.create(doc);
 			const mediaAllInfo = rulesMatcher.getAllMatchedRules();
 			const stats = { processed: 0, discarded: 0 };
+			const selectorsCache = new Map();
 			doc.querySelectorAll("style").forEach(styleElement => {
 				if (styleElement.sheet) {
 					let mediaInfo;
@@ -40,7 +41,7 @@ this.cssMinifier = this.cssMinifier || (() => {
 					} else {
 						mediaInfo = mediaAllInfo;
 					}
-					processRules(doc, styleElement.sheet.cssRules, mediaInfo, stats);
+					processRules(doc, styleElement.sheet.cssRules, mediaInfo, selectorsCache, stats);
 					styleElement.textContent = serializeRules(styleElement.sheet.cssRules);
 				}
 			});
@@ -51,12 +52,12 @@ this.cssMinifier = this.cssMinifier || (() => {
 		}
 	};
 
-	function processRules(doc, cssRules, mediaInfo, stats) {
+	function processRules(doc, cssRules, mediaInfo, selectorsCache, stats) {
 		stats.processed += cssRules.length;
 		stats.discarded += cssRules.length;
 		Array.from(cssRules).forEach(cssRule => {
 			if (cssRule.type == CSSRule.MEDIA_RULE) {
-				processRules(doc, cssRule.cssRules, mediaInfo.medias.get(cssRule.media), stats);
+				processRules(doc, cssRule.cssRules, mediaInfo.medias.get(cssRule.media), selectorsCache, stats);
 			} else if (cssRule.type == CSSRule.STYLE_RULE) {
 				const ruleInfo = mediaInfo.rules.get(cssRule);
 				if (ruleInfo) {
@@ -69,14 +70,23 @@ this.cssMinifier = this.cssMinifier || (() => {
 						cssRule.selectorText = ruleInfo.selectorsText.filter(selector => ruleInfo.matchedSelectors.has(selector) || (testFilterSelector(selector) && doc.querySelector(getFilteredSelector(selector)))).join(",");
 					}
 				} else {
-					if (!IGNORED_SELECTORS.includes(cssRule.selectorText.toLowerCase().trim()) && (!testFilterSelector(cssRule.selectorText) || !doc.querySelector(getFilteredSelector(cssRule.selectorText)))) {
-						const parent = cssRule.parentRule || cssRule.parentStyleSheet;
-						let indexRule = 0;
-						while (cssRule != parent.cssRules[indexRule] && indexRule < parent.cssRules.length) {
-							indexRule++;
+					if (!IGNORED_SELECTORS.find(selector => cssRule.selectorText.toLowerCase().includes(selector)) && !testFilterSelector(cssRule.selectorText)) {
+						let noElementsFound;
+						if (selectorsCache.has(cssRule.selectorText)) {
+							noElementsFound = selectorsCache.get(cssRule.selectorText);
+						} else {
+							noElementsFound = !doc.querySelector(getFilteredSelector(cssRule.selectorText));
+							selectorsCache.set(cssRule.selectorText, noElementsFound);
 						}
-						if (cssRule == parent.cssRules[indexRule]) {
-							parent.deleteRule(indexRule);
+						if (noElementsFound) {
+							const parent = cssRule.parentRule || cssRule.parentStyleSheet;
+							let indexRule = 0;
+							while (cssRule != parent.cssRules[indexRule] && indexRule < parent.cssRules.length) {
+								indexRule++;
+							}
+							if (cssRule == parent.cssRules[indexRule]) {
+								parent.deleteRule(indexRule);
+							}
 						}
 					}
 				}