documents

# 嵌入字体的四大方法

ZSFT 中有四大嵌入方法: 常规 CSS 、预载 HTML 、高级冗余.js 和 英文子集化。

# 常规 CSS

这是最通用也是推荐的方法,任何字体都会提供 “常规 CSS” 选项,可以将它使用在 .css 文件或 HTML 的 <style> 中。

/* 大体积字体,按需加载 */
@import url('https://static.zeoseven.com/zsft/1/main/result.css');

body {
      font-family: "JinzisheTongfang";
      font-weight: normal;
}

/* 小体积字体,完整字库和冗余 */
@font-face {
      font-family: "zsft-a";
      src: url('https://static.zeoseven.com/zsft/a/main.woff2') format('woff2'),
          url('https://static-host.zeoseven.com/zsft/a/main.woff2') format('woff2');
      font-display: swap;
}
body {
      font-family: "zsft-a";
      font-weight: normal;
}

通常用于: .css

需要使用 <style> 包裹的: .html / .htm / .php

优点: 更高的加载优先级,字体被缓存后无闪烁, WebFonts 的标准方法

缺点: 会阻塞 HTML 渲染

提供: 任何字体

# 预载 HTML

此选项可以被用在 HTML 或 PHP 中,通过预先连接 ZSFT CDN 的方法来更快的加载字体。

<link rel="preconnect" href="https://static.zeoseven.com" crossorigin />
<link rel="stylesheet" href="https://static.zeoseven.com/zsft/1/main/result.css" />

<style>
      body {
          font-family: "JinzisheTongfang";
          font-weight: normal;
      }
</style>

通常用于: .html / .htm / .php

优点: 更高的加载优先级,字体被缓存后无闪烁

缺点: 会阻塞 HTML 渲染

提供: 仅大体积字体

# 高级冗余.js

将提供一段 JS 代码动态的加载字体,实现当 CDN 出现错误时立即直接由源服务器提供文件来始终不断的加载字体。

((z,s,f,t)=>{setTimeout(()=>{let $=document.head;let a=(b,c)=>{ /* ... */ })( /* ... */ )

通常用于: .js

需要使用 <script> 包裹的: .html / .htm / .php

优点: 更低的加载优先级,无阻塞 HTML 渲染,加载冗余

缺点: 字体被缓存后仍然闪烁

提供: 仅大体积字体

# 英文子集化

提供一个静态的子集化的 WOFF2 文件,其中包含一小部分字符,用于只需要字体的英文字符和数字的情况下,因为此选项只需要加载 10KB 左右的文件,将庞大的 CJK 字体子集化为英文字体,字符有:

AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890 ,.!?:;-
@font-face {
      font-family: 'zsft-enmin-1';
      src: url('https://static.zeoseven.com/zsft/1/main.woff2') format('woff2'),
          url('https://static-host.zeoseven.com/zsft/1/main.woff2') format('woff2');
      unicode-range: U+0061-007A, U+0041-005A, U+0030-0039, U+002E, U+002C, U+0021, U+003F, U+003A, U+003B, U+002D;
}

body {
      font-family: "zsft-enmin-1";
      font-weight: normal;
}

通常用于: .css

需要使用 <style> 包裹的: .html / .htm / .php

优点: 更高的加载优先级,字体被缓存后无闪烁, WebFonts 的标准方法,加载更快

缺点: 会阻塞 HTML 渲染,字库字符缺失

提供: 仅大体积字体

# CDN 响应标头

static.zeoseven.com 和 static-host.zeoseven.com 的响应标头中,虽然具有一定的相似度,但它们都具有以下响应:

# Cache-Control

public, max-age=31536000, s-maxage=15768000, immutable

这指定了客户端和边缘服务器的缓存行为,即 1/0.5 年时间且不会改变,这意味着客户端只需要加载一次这款字体,那么客户端的浏览器将保留字体文件 1 年时间,但因为浏览器的缓存行为和存储空间,实际上可能无法达到。

# Access-Control-Allow-Origin

*

这指定了任何主机名都可以对其中的资源进行跨域请求,这是 CDN 服务中常见的响应标头且必须。

# Access-Control-Allow-Methods

GET, OPTIONS

这指定了跨域请求允许的请求方法,通常来说,静态资源只需要 GET 和 OPTIONS 方法即可满足使用需求。

# Access-Control-Max-Age

31536000

跨域请求会首先发出预检请求来确认目标服务器是否允许跨域,而此标头指定了跨域请求在发出预检请求后,允许跨域或不允许跨域应该保留 1 年,即最大时间 1 年内都不需要再次发出预检请求确认是否允许跨域。

# Access-Control-Allow-Credentials

false

这指定了不允许跨域请求携带凭据,当然携带凭据也没有什么作用,因为 ZSFT CDN 完全静态。

# 错误示例

# 将 CSS 错误的使用 @font-face 引入

@font-face {
      font-family: "自定义名称";
      src: url('https://static.zeoseven.com/zsft/2/main/result.css');
}

这将导致无法正确引入字体, @font-face 只能引入 ttf, otf, eot, woff, woff2 等字体源文件, CSS 文件需要使用 link 标签或 @import 引入。

# 按需加载的痛

@font-face {font-family: "自定义名称";src:local("自定义名称"),url("https://static.zeoseven.com/zsft/2/main/0601a1cb4a9f56b374f91d612855ddad.woff2") format("woff2");font-style: normal;font-weight: 400;font-display: swap;}
@font-face {font-family: "自定义名称";src:local("自定义名称"),url("https://static.zeoseven.com/zsft/2/main/5e12300c47a34e65160bae82763f87e6.woff2") format("woff2");font-style: normal;font-weight: 400;font-display: swap;}
/* 此处省略很多 @font-face */

html {
      font-family: "自定义名称";
}

这导致了 分包的无效、按需加载的无法工作 及 字体更新后的难以跟进甚至中断。应直接使用 link 标签或 @import 引入可能提供的 CSS 文件。

# 字体收录规则

字体的许可证需要满足三个条件才能收录,1. 免费商用 2. 允许转换和二次分发 3. 允许嵌入

常见的 OFLv1.1 、 MIT 、 Apachev2 、 GPLv2 or v3 ... 等相似许可协议就非常满足三个条件。

# 需要注意的许可协议

以下许可的字体因其许可协议的条款和限制可能会被特殊处理。

IPA / IPA Font License / IPAv1

# 不允许的许可协议

CC BY-NC :不允许商业性使用

# 字体文件大小限制

仅为 单个字体文件 的大小限制,单个字体文件大小应在 60 MB 以下,否则 可能 会导致无法分包而无法提供 WebFonts 。