HanziWriter 小程序端開發注意事項

Hanzi Writer 是一個開源 javascript 庫,主要用於繪製漢字筆畫順序動畫。運行環境可以是Android、iOS、網頁和小程序。小程序端使用Hanzi Writer小程序插件使用,使用npm安裝。

npm install hanzi-writer-miniprogram

具體用法參見

如果只是安裝使用教程,就沒有寫的必要了,這裏總結一下開發過程中遇到的問題。

1、筆畫數據加載問題

Hanzi Writer 需要加載筆畫渲染數據才能繪製字符,默認情況下,Hanzi Writer 將使用 ajax 從 jsdelivr CDN加載數據。顯然我們需要在小程序後臺配置域名白名單。但問題來了,該域名從2021年12月份備案就被撤銷了,因此小程序直接通過jsdelivr CDN加載筆畫數據基本無解。好在插件提供了 charDataLoader,用於自定義加載筆畫數據。

2、charDataLoader 使用

作者提供了一個 hanzi-writer-data 倉庫,提供了9574個漢字筆畫數據的 JSON 文件。例如,漢字“阿”的json數據格式:

 通過Ajax加載:

var writer = HanziWriter.create('target', '阿', {
  charDataLoader: function(char, onComplete) {
    $.getJSON("/my/server/" + char + ".json", function(charData) {
      onComplete(charData);
    });
  }
});

顯然如果使用Ajax的方式加載數據,我們需要自己搭建服務器,搞定域名、備案、web服務器、數據庫服務等。想想就比較複雜。好在小程序提供了雲開發功能,我們只需要將倉庫中的數據導入到數據庫中,並寫一個雲函數提供查詢接口,這樣會方便許多。

3、npm 模塊加載

除了charDataLoader,作者還提供了NPM 模塊直接加載數據的方式。

var ren = require('hanzi-writer-data/人');

var writer = HanziWriter.create('target', '人', {
  charDataLoader: function() {
    return ren;
  }
});

嘗試了一下,在小程序端行不通。首先是小程序npm構建問題,對於一個node_modules,小程序需要二次構建纔可以直接使用。這裏的json數據無法在小程序端構建。其次是commonJS模塊動態加載問題,這裏的字符數據需要傳入參數進行動態加載,嘗試了一下並未成功。再者就是小程序包上限爲2M的問題,這裏的數據超過了30M,即便是通過分包,也超過了其上限20M。

4、通過node腳本生成導入文件

json文件足足有9000多,使用手動導入,不僅僅是時間問題,而且面子上也掛不住。這裏使用node腳本,生成導入雲數據庫的文件。當然使用其他腳本也是可以的。

const fs = require('fs/promises');
const fss = require('fs');
const dirPath = './test/';

async function read() {
    try {
        const files = await fs.readdir(dirPath);
        var ws = fss.createWriteStream('./output.json', 'utf-8');
        for (const file of files) {
            let filePath = dirPath + file;
            let content = await fs.readFile(filePath, {
                encoding: 'utf-8'
            });
            ws.write(JSON.stringify({
                name: file.split('.')[0],
                json: content
            }));
        }
        ws.end();
        console.log('寫入成功!')
    } catch (error) {
        console.log(error)
    }
}
read();

5、雲函數接口

通過上述腳本導入了幾條測試數據,並通過雲函數接口查詢返回,再將數據傳遞給charDataLoader,理論上就可以完成漢字在小程序端的渲染了。

import createHanziWriterContext from 'hanzi-writer-miniprogram';

Page({
  onLoad: function() {
    this.writerCtx = createHanziWriterContext({
      id: 'hz-writer',
      character: '你',
      page: this,
      charDataLoader: function(char, oncomplete) {
        this.getData(char, function(charData){
          onComplete(charData)
        })
      }
    });
    this.writerCtx.loopCharacterAnimation();
  }
});

然而還是一片空白。仔細尋找查閱發現,問題出現在小程序的基礎庫版本上。將基礎庫的版本更改至2.7.7,微信開發者工具終於可以顯示筆畫數據了。然而推送到手機端的時候,整個頁面都是空白。猜想應該是小程序使用的UI 組件庫 vant 和基礎庫的版本兼容問題。顯然更改基礎庫版本又是無解了。

6、問題修復

實際上類似的問題已經有開發者提出了,本質原因是從基礎庫 2.9.0 開始,官方停止維護了 wx.createCanvasContext接口。已經有PR解決上述問題,出於測試目的,目前需要安裝小程序插件的beta版本,即可解決上述問題。

npm install hanzi-writer-miniprogram@beta

重新構建,編譯,可以看到,手機端可以正常繪製了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章