【发布时间】:2017-10-04 12:56:25
【问题描述】:
我正在尝试编写使用 HTML 画布的共享代码(在服务器和客户端上运行)。
在客户端上,这应该可以正常工作。在服务器上,Node 没有画布(或 DOM),所以我想使用 node-canvas 插件:https://github.com/Automattic/node-canvas。
但是,我无法找到一种不会使 webpack 尝试将 node-canvas 捆绑到我的客户端代码中的方法来访问它(这会使 webpack 崩溃)。有没有什么方法可以加载节点画布,这样我就可以使用在浏览器中使用的相同代码来引用它,并且不会让 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 仍然捆绑在 node-canvas 中。
【问题讨论】:
-
如果有人想知道:在服务器和客户端上,画布将其内容转储到数据 URL 中,该 URL 在页面上呈现为 SVG 内的
。这都是非常 hacky和奇怪的,可能无论如何都不会起作用,但我想尝试一下,这是我坚持的步骤。 -
我不明白为什么您需要渲染同一画布的两个相同副本。您最好在服务器上保留画布的抽象副本,然后在需要图像时(其他客户端)发送摘要并让每个客户端渲染到图像。所有 node.js 画布 API 都是软件渲染和慢!您将很快使服务器陷入瘫痪,从而使客户端通过 GPU 轻松处理像素。
-
我没有服务器进程。画布仅在构建时将整个应用程序缩减为平面文件时呈现一次,然后在用户离开初始视图时在客户端上重新创建。
标签: node.js canvas webpack node-canvas