美文网首页GIS后端
Make it works(7) 在国内更方便的使用Node-f

Make it works(7) 在国内更方便的使用Node-f

作者: 默而识之者 | 来源:发表于2021-04-11 15:29 被阅读0次

    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)
      })
    )
    

    相关文章

      网友评论

        本文标题:Make it works(7) 在国内更方便的使用Node-f

        本文链接:https://www.haomeiwen.com/subject/mwbakltx.html