我正在嘗試編寫使用HTML畫布的共享代碼(在服務器和客戶端上運行)。在服務器和客戶端共享代碼中呈現畫布界面
在客戶端上,這應該工作得很好。在服務器上,Node沒有畫布(或DOM),所以我想使用node-canvas插件:https://github.com/Automattic/node-canvas。
但是,我不能找出一種方法來訪問它,它不會讓webpack嘗試將node-canvas綁定到我的客戶端代碼中(這會導致webpack崩潰)。是否有任何加載node-canvas的方式,以便我可以使用與瀏覽器中使用的相同代碼來引用它,並且不會使webpack崩潰?
我現在的工作,沒有工作:
canvas.server.js
import Canvas from 'canvas';
const createCanvas = (width, height) => new Canvas(width, height);
export default createCanvas;
canvas.client.js
const createCanvas = (width, height) => {
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
return canvas;
};
export default createCanvas;
canvas.js
let createCanvas;
if (typeof document === 'undefined') {
// SERVER/node
createCanvas = require('./canvas.server.js');
} else {
// BROWSER
createCanvas = require('./canvas.client.js');
}
export default createCanvas;
在使用中:
import createCanvas from './canvas';
const canvasElement = createCanvas(width, height);
const ctx = canvasElement.getContext('2d');
不幸的是,仍然的WebPack束在節點畫布。
如果有人想知道:在服務器和客戶端上,畫布會將其內容轉儲到一個數據網址中,該網址在SVG內以的形式呈現在頁面上。這是非常*非常*哈克和怪異,可能無法正常工作,但我想嘗試一下,這是我堅持的一步。 –
futuraprime
我不明白你爲什麼需要渲染同一個畫布的兩個完全相同的副本。您最好在服務器上保留一個抽象的畫布副本,然後當需要圖像(其他客戶端)時,發送摘要並讓每個客戶端渲染圖像。所有node.js畫布API都是軟件渲染和SLOW!您將非常快速地將您的服務器癱瘓,客戶端通過GPU輕鬆處理像素。 – Blindman67
我沒有服務器進程。畫布僅在構建時呈現一次,當整個應用程序縮小爲平面文件時,然後在用戶離開初始視圖時在客戶端上重新創建畫布。 – futuraprime