1. 引入
Node-fontnik的安装本身很顺畅,但因为过程中需要从亚马逊s3下载相关二进制包,可能会被墙阻隔,因此在普通环境下不容易安装成功.况且Node-fontnik默认只兼容Linux和Mac的,尤其是在Linux下想要翻越避障,难度又增加了.
不过好在Node-fontnik本身是一个低频应用.只要在一个合适的环境中安装好了,我们使用其成果即可.所以在国内,较好的使用体验是将Node-fontnik的环境封装为一个Docker镜像,这样就无需安装,并能兼容Windows系统了.
2. 安装
我将Node-fontnik封装的镜像发布在国内的阿里云了,可以直接拉取
docker pull registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik
3. 使用
镜像中封装了Node-fontnik环境和调用脚本.
默认情况下,可以直接通过映射路径的方式调用:
docker run -v {字体所在路径}:/input -v {输出路径}:/output \
registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik
执行脚本会自动搜索字体所在路径
下的全部.ttc
后缀名的文件,输出位*.pbf
到输出路径/{字体名}/
文件夹下.
若使用ttf
格式的字体.需要追加参数:
docker run -v {字体所在路径}:/input -v {输出路径}:/output -e EXTENSION=.ttf \
registry.cn-beijing.aliyuncs.com/kzfile/node-fontnik
- 并非所有的国内字体都能正常的处理,比如常见的宋体
- 建议使用思源字体
- 矢量字体瓦片天生不适合CJK字符集,用户第一次加载字符瓦片的流量压力相当大,所以可能不是未来的方向
4. Dockerfile源码
FROM node:dubnium-stretch-slim as builder
ADD node-fontnik-master.tar /
WORKDIR /node-fontnik-master
RUN yarn install && yarn add single-line-log
FROM node:dubnium-stretch-slim
WORKDIR /fontnik
COPY main.js /fontnik
COPY --from=builder /node-fontnik-master/index.js ./index.js
COPY --from=builder /node-fontnik-master/lib ./lib
COPY --from=builder /node-fontnik-master/bin ./bin
COPY --from=builder /node-fontnik-master/node_modules ./node_modules
CMD ["node","/fontnik/main.js"]
5. 默认脚本
可以直接替换该脚本,定制复杂功能
const glob = require("glob"),
log = require('single-line-log').stdout;
const fontnik = require("./index")
const fs = require("fs"),
path = require("path")
const INPUT_DIR = '/input',
OUTPUT_DIR = "/output",
FONT_EXTENSION = process.env.EXTENSION||".ttc"
var percent = 0
function output2pbf(font, start, end, outputDir) {
if (start > 65535) return
let _percent = Math.round(start * 100 / 65535.0)
if (_percent != percent)
log((percent = _percent) + '%')
fontnik.range({ font, start, end }, (_, pbf) => {
const pbfPath = path.join(outputDir, start + "-" + end + ".pbf")
fs.writeFileSync(pbfPath, pbf)
output2pbf(font, end + 1, end + 1 + 255, outputDir)
})
}
glob(INPUT_DIR + `/*${FONT_EXTENSION}`, (_, fonts) =>
fonts.forEach(fontPath => {
fontName = path.basename(fontPath, `${FONT_EXTENSION}`)
outputPath = path.join(OUTPUT_DIR, fontName)
if (!fs.existsSync(outputPath))
fs.mkdirSync(outputPath, { recursive: true })
const font = fs.readFileSync(fontPath)
output2pbf(font, 0, 255, outputPath)
})
)
网友评论