字蛛是一个 WebFont 智能压缩工具,它能自动化分析页面中所使用的 WebFont 并进行按需压缩,通常好几 MB 的中文字体可以被压缩成几 KB 大小。
字蛛主页: http://font-spider.org
字蛛从 2014 年 7 月诞生以来,时隔近两年,终于发布了 v1.0.0 正式版本,改进如下:
- 支持绝大多数的中英文 Truetype 字体
- 支持开源图标字体库 (New: v1.0.0新特性)
- 支持 CSS 伪元素解析,支持 content: "string" 与 content: attr(value) 表达式
- 支持远程页面解析,并支持资源映射
- 支持四种样式规则:
- 支持四种调用方式:命令行、Gulp、Grunt、JS Api
- 性能、稳定性大幅提高
新特性:图标字体库压缩
得益于对 CSS 伪元素的支持,除了常规中英文字体压缩之外,v1.0.0 还带来了万众期待的——图标字体压缩支持,能够支持业界流行的开源图标字库。
以 Font Awesome 为例,它是一个典型的开源图标字体项目,目前包含有 628 个图标,并且还不断在添加中。虽然它已经做了很多优化,但字库的体积在移动端来说依然偏大,会影响页面载入速度。使用字蛛可以删除掉字体中没有用到的图标,将字体瘦身。例如一个使用 Font Awesome 的示例页面:
输入 font-spider 命令,启动字蛛进行字体压缩:
经过字蛛分析与压缩处理后, Font Awesome 字体中只保留了页面所用到的 20 个图标,ttf 格式字体体积由 142 KB 降为 6 KB,如果再配合使用 Webpack 等前端工具将字体 Base64 编码后内嵌到 CSS 中,载入速度可以进一步提升。
爬虫实现原理
为什么字蛛能够找到字体中没有使用的字形数据?这里就涉及到对 HTML 与 CSS 的静态分析。
虚拟浏览器技术
字蛛 v1.0.0 版本使用了虚拟浏览器技术来实现 HTML 与 CSS 加载与解析,爬虫模块所依赖的浏览器相关 API 均为它提供。
- 处理
标签以及资源定位 - 加载 标签或 @import 语句导入的 CSS 文件
- 处理 CSS Unicode 字符
- 管理网络请求,处理资源映射配置
- 支持 CSS3 选择器、样式表树、文本节点读取
由于虚拟浏览器部分涉及到太多的东西且不是本文重点,所以本文将会略过这部分细节。这部分代码已经分离出来并开源,有兴趣可以去了解: https://github.com/aui/browser-x
操作样式语法树
字蛛是通过解析样式表语法树(CSSOM)来获得 WebFont 信息,在浏览器中可以通过 document.styleSheets 来访问 CSS 的语法树,遍历 CSS 规则的函数实现:
// 遍历 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); } };})();
注:浏览器环境不允许访问跨域后的 CSSOM,但虚拟浏览器没有做此限制
查找字体
遍历样式表每一个规则,收集 CSSFontFaceRule 信息:
// 字体信息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 id="面朝大海-春暖花开">面朝大海,春暖花开</h1></body></html>
得到 webFonts :
{ "demo-font": { "family": "demo-font", "src": "url(\"file:///Users/aui/Documents/demo-font.ttf\")", "chars": "" }}
查找字符
利用 document.querySelectorAll() 来获取使用 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); }); } }});
此时 webFonts :
{ "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
至此,以上例子已经成功演示了字蛛爬虫查找字体、查找文本的工作原理。实际上 HTML 与 CSS 远比上面示例页面复杂,需要处理:
- 伪类选择器
- font 缩写
- 行内样式
- 完整的字体匹配算法
由于篇幅有限,上述细节部分可以参见 字蛛爬虫模块源码 。

HTML的未来充满了无限可能。1)新功能和标准将包括更多的语义化标签和WebComponents的普及。2)网页设计趋势将继续向响应式和无障碍设计发展。3)性能优化将通过响应式图片加载和延迟加载技术提升用户体验。

HTML、CSS和JavaScript在网页开发中的角色分别是:HTML负责内容结构,CSS负责样式,JavaScript负责动态行为。1.HTML通过标签定义网页结构和内容,确保语义化。2.CSS通过选择器和属性控制网页样式,使其美观易读。3.JavaScript通过脚本控制网页行为,实现动态和交互功能。

HTMLISNOTAPROGRAMMENGUAGE; ITISAMARKUMARKUPLAGUAGE.1)htmlStructures andFormatSwebContentusingtags.2)itworkswithcsssforstylingandjavascript for Interactivity,增强WebevebDevelopment。

HTML是构建网页结构的基石。1.HTML定义内容结构和语义,使用、、等标签。2.提供语义化标记,如、、等,提升SEO效果。3.通过标签实现用户交互,需注意表单验证。4.使用、等高级元素结合JavaScript实现动态效果。5.常见错误包括标签未闭合和属性值未加引号,需使用验证工具。6.优化策略包括减少HTTP请求、压缩HTML、使用语义化标签等。

HTML是一种用于构建网页的语言,通过标签和属性定义网页结构和内容。1)HTML通过标签组织文档结构,如、。2)浏览器解析HTML构建DOM并渲染网页。3)HTML5的新特性如、、增强了多媒体功能。4)常见错误包括标签未闭合和属性值未加引号。5)优化建议包括使用语义化标签和减少文件大小。

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

HTML的作用是通过标签和属性定义网页的结构和内容。1.HTML通过到、等标签组织内容,使其易于阅读和理解。2.使用语义化标签如、等增强可访问性和SEO。3.优化HTML代码可以提高网页加载速度和用户体验。

htmlisaspecifictypefodyfocusedonstructuringwebcontent,而“代码” badlyLyCludEslanguagesLikeLikejavascriptandPytyPythonForFunctionality.1)htmldefineswebpagertuctureduseTags.2)“代码”代码“ code” code code code codeSpassSesseseseseseseseAwiderRangeLangeLangeforLageforLogageforLogicIctInterract


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3汉化版
中文版,非常好用

SublimeText3 Linux新版
SublimeText3 Linux最新版

禅工作室 13.0.1
功能强大的PHP集成开发环境