ホームページ > 記事 > ウェブフロントエンド > WebFont インテリジェント圧縮ツール - Zizi 1.0.0 正式版リリース_html/css_WEB-ITnose
Zizhu は、ページで使用されている WebFont を自動的に分析し、オンデマンドで圧縮できる WebFont インテリジェント圧縮ツールです。通常、数 MB の中国語フォントを数 KB のサイズに圧縮できます。
Font-spider ホームページ: http://font-spider.org
font-spider は 2014 年 7 月に誕生して以来、ほぼ 2 年を経て、ついに正式版 v1.0.0 をリリースしました。 改良点は次のとおりです。
ほとんどの中国語と英語の Truetype フォントをサポート
font-spider コマンドを入力して、フォント圧縮のために Spider を開始します:
Spider の分析と圧縮処理の後、ページで使用されている Font Awesome フォントのみが保持されます。 20 個のアイコンでは、ttf 形式のフォント サイズが
142KB から
6KB に減少しました。Webpack などのフロントエンド ツールを使用してフォントを Base64 エンコードし、CSS に埋め込むと、読み込み速度がさらに向上します。改善されました。
クローラー実装の原理 Word Spider はなぜフォントで使用されていないグリフ データを見つけることができるのでしょうか?これには、HTML と CSS の静的分析が含まれます。 仮想ブラウザ テクノロジー Word Spider v1.0.0 は、仮想ブラウザ テクノロジーを使用して、HTML と CSS の読み込みと解析を実装し、クローラー モジュールが依存するブラウザ関連の API を提供します。 ... 、スタイル シート ツリー、テキスト ノードの読み取り
動作スタイル構文ツリー
// 遍历 CSS 的规则var eachCssRuleList = (function() { // 遍历 CSSRuleList function cssRuleListFor(cssRuleList, callback) { var index = -1; var length = cssRuleList.length; var cssRule, cssStyleSheet; while (++index < length) { cssRule = cssRuleList[index]; // 导入的样式规则 if (cssRule instanceof CSSImportRule) { cssStyleSheet = cssRule.styleSheet; cssRuleListFor(cssStyleSheet.cssRules || [], callback); // CSS 媒体查询规则 } else if (cssRule instanceof CSSMediaRule) { cssRuleListFor(cssRule.cssRules || [], callback); // 普通的规则 } else { callback(cssRule); } } } return function(callback) { var index = -1; var styleSheetList = document.styleSheets; var length = styleSheetList.length; var cssStyleSheet, cssRuleList; // 遍历 StyleSheetList while (++index < length) { cssStyleSheet = styleSheetList[index]; cssRuleList = cssStyleSheet.cssRules || []; cssRuleListFor(cssRuleList, callback); } };})();
// 字体信息var webFonts = {};// 字体对应的元素列表var elements = {};// 找到 webFonteachCssRuleList(function(cssRule) { if (cssRule instanceof CSSFontFaceRule) { var style = cssRule.style; var family = style['font-family']; var src = style.src; // 保存使用此字体的所有元素列表 elements[family] = []; // 保存字体信息 webFonts[family] = { family: family, src: src, chars: '' }; }});
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="UTF-8"> <title>font-spider</title> <style> @font-face { font-family: 'demo-font'; src: url('./demo-font.ttf'); } h1.title { font-family: 'demo-font'; } h1.title::after { content: '——海子'; } </style></head><body> <h1 class="title">面朝大海,春暖花开</h1></body></html>
{ "demo-font": { "family": "demo-font", "src": "url(\"file:///Users/aui/Documents/demo-font.ttf\")", "chars": "" }}文字を検索
document.queryS electorAll() を使用して文字を取得します。 using WebFont:
// 获取当前节点所使用的 webFontfunction matchFontFamily(cssRule) { var style = cssRule.style; var family = style['font-family']; return webFonts[family];}// 将 fontFace 与元素、字符关联起来eachCssRuleList(function(cssRule) { if (cssRule instanceof CSSStyleRule) { var selector = cssRule.selectorText; var webfont = matchFontFamily(cssRule); if (webfont) { // 根据选择器来查找元素 var elems = document.querySelectorAll(selector); Array.prototype.forEach.call(elems, function(element) { // 获取元素的文本 webfont.chars += element.textContent; // 将元素与字体关联起来 elements[webfont.family].push(element); }); } }});
{ "demo-font": { "family": "demo-font", "src": "url(\"file:///Users/aui/Documents/demo-font.ttf\")", "chars": "面朝大海,春暖花开" }}疑似要素
// 处理伪元素,找到继承的 webFonteachCssRuleList(function(cssRule) { if (cssRule instanceof CSSStyleRule) { var selector = cssRule.selectorText; var pseudoName = /\:\:?(?:before|after)$/i; if (!pseudoName.test(selector)) { return; } // 查找伪元素所在的节点 selector = selector.replace(pseudoName, ''); var elems = document.querySelectorAll(selector); // 获取伪元素 content 值 var content = cssRule.style.content.replace(/^["']|["']$/g, ''); for (var i = 0; i < elems.length; i ++) { var elem = elems[i]; for (var family in webFonts) { // 从伪元素自身不断冒泡,直到找到继承的字体 while (elem) { if (elements[family].indexOf(elem) !== -1) { webFonts[family].chars += content; break; } elem = elem.parentNode; } } } }});
この時点で WebFont:
{ "demo-font": { "family": "demo-font", "src": "url(\"file:///Users/aui/Documents/demo-font.ttf\")", "chars": "面朝大海,春暖花开————海子" }}フルコードのオンラインデモ: https://jsfiddle.net/9ont96c4/2
疑似クラス セレクター
フォント略語
完全なフォント マッチング アルゴリズム
スペースが限られているため、上記の詳細は、字幕の Spider クローラー モジュールのソース コードで確認できます。