Я создаю игру в слова с React, и мне нужно нарисовать игру на элементе холста, а затем использовать его в качестве изображения. В основном это работает, за исключением добавления шрифта к изображению.
В частности, моя игра построена с помощью React на next.js и работает локально, просто используя системные шрифты. Но мне также нужно, чтобы он работал с рендерингом на стороне сервера, а на сервере не установлены системные шрифты. Это означает, что он рисует изображение и текст маленькими квадратами там, где должен быть текст.
Моя проблема связана с registerFont в пакете холста. Соответствующая часть моего кода
import { registerFont, createCanvas } from 'canvas';
//import RobotoR from '../../public/Roboto/Roboto-Regular.ttf';
export const drawCanvas = ({ sentence, cards, workingCards, width, height }) => {
// default canvas size
let cw = 1200 // canvas width
let ch = 630 // canvas height; this is a minimun, it might change
~~~
registerFont('../../public/Roboto/Roboto-Regular.ttf', { family: 'Roboto' })
const canvas = createCanvas(cw, ch)
const ctx = canvas.getContext('2d')
Вызов createCanvas работает, вызов registerFont - нет. Я посмотрел в node_modules / canvas, и registerFont экспортируется немного по-другому, но, похоже, он работает буквально для всех остальных.
node_modules / холст / index.js:
function createCanvas (width, height, type) {
return new Canvas(width, height, type)
}
~
/**
* Resolve paths for registerFont. Must be called *before* creating a Canvas
* instance.
* @param src {string} Path to font file.
* @param fontFace {{family: string, weight?: string, style?: string}} Object
* specifying font information. `weight` and `style` default to `"normal"`.
*/
function registerFont (src, fontFace) {
// TODO this doesn't need to be on Canvas; it should just be a static method
// of `bindings`.
return Canvas._registerFont(fs.realpathSync(src), fontFace)
}
~
module.exports = {
Canvas,
...
registerFont,
...
createCanvas,
...
Я, наверное, совершаю небольшую глупую ошибку, но не могу ее найти. Помощь?