Реагировать на холст узла: registerFont вызывает TypeError: Object () не является функцией

Я создаю игру в слова с 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,
  ...

Я, наверное, совершаю небольшую глупую ошибку, но не могу ее найти. Помощь?


person Robert Austin    schedule 27.04.2020    source источник


Ответы (1)


Отвечаю себе на случай, если кто-то столкнется с той же проблемой. Я спросил кого-то, кто знает больше, чем я, и после получасового размышления над этим он понял, что node-canvas имеет отдельную точку входа, если он запускается в браузере. Я не знал, что это была вещь, но это так.

В пакете node-canvas package.json есть строка '"browser": "browser.js"', которая указывает ему экспортировать ограниченный набор функций при запуске в браузере.

Моя функция рисования используется в браузере и в отдельном процессе api на стороне сервера. Но мне не нужно регистрировать шрифты в браузере, так как шрифты уже установлены, поэтому я импортирую «registerFont», а затем проверяю, возвращается ли он неопределенным. Если он определен, я использую его, если нет, я должен быть в браузере и мне он не нужен.

person Robert Austin    schedule 28.04.2020