Использование Chart.js в Web Worker

#javascript #chart.js #web-worker

#javascript #chart.js #web-worker

Вопрос:

Я пытаюсь использовать Worker для рисования диаграммы с помощью Chart.js , как упоминалось на Chart.js страница:
https://www.chartjs.org/docs/master/general/performance/
Раздел: Параллельный рендеринг с Web workers (только для Chrome)

Но в worker.js файле я получаю сообщение об ошибке:

 Uncaught ReferenceError: Chart is not defined
  

У меня есть приведенный ниже код в worker.js :

 onmessage = function(event) {
    const {canvas, config} = event.data;
    const chart = new Chart(canvas, config); // Error for Chart 

    canvas.width = 100;
    canvas.height = 100;
    chart.resize();
};
  

Комментарии:

1. Предоставляете ли вы автономный объект canvas при отправке события в соответствии с документами?

2. Да, я отправляю автономный холст в web worker. Поскольку я хочу одновременно обрабатывать parellel на нескольких графиках.

Ответ №1:

Вам необходимо импортировать библиотеку в скрипт вашего worker.

Для этого вы можете использовать importScripts() метод.

Также обязательно используйте версию 3 библиотеки, поскольку версия v2.x ожидала появления DOM HTMLElement, и, наконец, кажется, вам нужно установить глобальную window переменную (установите ее в self ) в вашем Worker:

 const worker_script = `
  const window = self;
  importScripts("https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.0.0-beta/chart.min.js");

  onmessage = function(event) {
    const {canvas, config} = event.data;
    const chart = new Chart(canvas, config); // Error for Chart 

    canvas.width = 500;
    canvas.height = 500;
    chart.resize();
  };
`;
const worker_url = URL.createObjectURL(new Blob([worker_script], { type: "text/javascript" }));

const worker = new Worker(worker_url);
const canvas = document.getElementById("canvas").transferControlToOffscreen();
const config = { type:"line",data:{labels:["January","February","March","April","May","June","July"],datasets:[{label:"My First Dataset",data:[65,59,80,81,56,55,40],fill:false,borderColor:"rgb(75, 192, 192)",lineTension:0.1}]} };

worker.postMessage({ canvas, config }, [canvas]);  
 <canvas id="canvas"></canvas>  

Комментарии:

1. Спасибо. Возможность импорта Chart.js но получение ошибки Chart.min.js- Uncaught TypeError: Failed to set the 'width' property on 'OffscreenCanvas': Value is not of type 'unsigned long'.