pixijs-environments
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDOMAdapterDOMAdapter.set(...)app.init()DOMAdapterapp.init()DOMAdapter.set(...)Quick Start
快速开始
ts
// worker.ts — OffscreenCanvas posted from main thread
DOMAdapter.set(WebWorkerAdapter);
self.onmessage = async (event) => {
const app = new Application();
await app.init({
canvas: event.data.canvas,
width: 800,
height: 600,
});
};For CSP contexts that block , import the polyfill before any renderer init:
unsafe-evalts
import "pixi.js/unsafe-eval";Related skills: (standard browser init), (settings removal, adapter changes).
pixijs-applicationpixijs-migration-v8ts
// worker.ts — 从主线程传递的OffscreenCanvas
DOMAdapter.set(WebWorkerAdapter);
self.onmessage = async (event) => {
const app = new Application();
await app.init({
canvas: event.data.canvas,
width: 800,
height: 600,
});
};对于阻止 的CSP上下文,请在任何渲染器初始化之前导入polyfill:
unsafe-evalts
import "pixi.js/unsafe-eval";相关技能: (标准浏览器初始化)、(设置移除、适配器变更)。
pixijs-applicationpixijs-migration-v8Core Patterns
核心模式
Web Worker with OffscreenCanvas
结合OffscreenCanvas的Web Worker
Transfer an OffscreenCanvas from the main thread, then initialize PixiJS in the worker:
ts
// main.ts
const canvas = document.createElement("canvas");
canvas.width = 800;
canvas.height = 600;
document.body.appendChild(canvas);
const offscreen = canvas.transferControlToOffscreen();
const worker = new Worker("worker.ts", { type: "module" });
worker.postMessage({ canvas: offscreen }, [offscreen]);ts
// worker.ts
import { Application, DOMAdapter, WebWorkerAdapter } from "pixi.js";
DOMAdapter.set(WebWorkerAdapter);
self.onmessage = async (event) => {
const app = new Application();
await app.init({
canvas: event.data.canvas,
width: 800,
height: 600,
});
};DOMAdapter.set(WebWorkerAdapter)new Application()OffscreenCanvasdocument.createElement('canvas')@xmldom/xmldomFeatures that do not work inside a Web Worker (no DOM access):
- — there is no real DOM node to overlay.
DOMContainer - — depends on live DOM focus and screen reader hooks.
AccessibilitySystem - loading via the Font Loading API — use pre-converted bitmap fonts (
FontFaceorBitmapFont.installassets) instead..fnt
从主线程传递OffscreenCanvas,然后在Worker中初始化PixiJS:
ts
// main.ts
const canvas = document.createElement("canvas");
canvas.width = 800;
canvas.height = 600;
document.body.appendChild(canvas);
const offscreen = canvas.transferControlToOffscreen();
const worker = new Worker("worker.ts", { type: "module" });
worker.postMessage({ canvas: offscreen }, [offscreen]);ts
// worker.ts
import { Application, DOMAdapter, WebWorkerAdapter } from "pixi.js";
DOMAdapter.set(WebWorkerAdapter);
self.onmessage = async (event) => {
const app = new Application();
await app.init({
canvas: event.data.canvas,
width: 800,
height: 600,
});
};DOMAdapter.set(WebWorkerAdapter)new Application()OffscreenCanvasdocument.createElement('canvas')@xmldom/xmldom在Web Worker中无法使用的功能(无DOM访问权限):
- — 没有真实的DOM节点可用于叠加。
DOMContainer - — 依赖实时DOM焦点和屏幕阅读器钩子。
AccessibilitySystem - 通过Font Loading API加载 — 请改用预转换的位图字体(
FontFace或BitmapFont.install资源)。.fnt
Environment-specific subpath imports
环境专属子路径导入
Instead of importing , you can pull in a curated bundle for each environment:
pixi.jsts
import "pixi.js/browser"; // accessibility, dom, events, spritesheet, rendering, filters
import "pixi.js/webworker"; // spritesheet, rendering, filters (no DOM-only modules)pixi.js/webworkeraccessibilitydomeventsloadEnvironmentExtensions除了导入 ,你还可以为每个环境引入特定的打包文件:
pixi.jsts
import "pixi.js/browser"; // 无障碍、dom、事件、精灵表、渲染、滤镜
import "pixi.js/webworker"; // 精灵表、渲染、滤镜(无仅DOM模块)pixi.js/webworkeraccessibilitydomeventsloadEnvironmentExtensionsloadEnvironmentExtensions
loadEnvironmentExtensions
ts
import { loadEnvironmentExtensions } from "pixi.js";
await loadEnvironmentExtensions(false); // false = load defaults; true = skiploadEnvironmentExtensions(skip)autoDetectEnvironmenttrueautoDetectEnvironment(add)loadEnvironmentExtensions(!add)ts
import { loadEnvironmentExtensions } from "pixi.js";
await loadEnvironmentExtensions(false); // false = 加载默认项; true = 跳过加载loadEnvironmentExtensions(skip)autoDetectEnvironmenttrueautoDetectEnvironment(add)loadEnvironmentExtensions(!add)CSP-compliant setup
符合CSP规范的设置
PixiJS uses internally for shader compilation and uniform syncing. In Content Security Policy environments that block , import the polyfill:
new Function()unsafe-evalts
import "pixi.js/unsafe-eval";
import { Application } from "pixi.js";
const app = new Application();
await app.init({ width: 800, height: 600 });The import replaces eval-based code generation with static polyfills for shader sync, UBO sync, uniform sync, and particle buffer updates. The import must come before any PixiJS renderer initialization.
pixi.js/unsafe-evalTension note: The name is counterintuitive. It does not enable unsafe eval; it removes the need for it. The name refers to the CSP directive it works around.
pixi.js/unsafe-evalPixiJS在内部使用 进行着色器编译和同步统一变量。在阻止 的内容安全策略(CSP)环境中,请导入polyfill:
new Function()unsafe-evalts
import "pixi.js/unsafe-eval";
import { Application } from "pixi.js";
const app = new Application();
await app.init({ width: 800, height: 600 });pixi.js/unsafe-eval注意事项: 的名称有违直觉。它并非启用不安全的eval,而是消除对它的需求。这个名称指的是它所规避的CSP指令。
pixi.js/unsafe-evalCustom adapter
自定义适配器
For non-standard environments (Node.js, headless testing, SSR), implement the full Adapter interface:
ts
import { DOMAdapter } from "pixi.js";
import type { Adapter } from "pixi.js";
import { createCanvas, Image } from "canvas";
import { DOMParser } from "@xmldom/xmldom";
const HeadlessAdapter: Adapter = {
createCanvas: (width, height) => createCanvas(width ?? 0, height ?? 0),
createImage: () => new Image(),
getCanvasRenderingContext2D: () => CanvasRenderingContext2D,
getWebGLRenderingContext: () => WebGLRenderingContext,
getNavigator: () => ({ userAgent: "HeadlessAdapter", gpu: null }),
getBaseUrl: () => "file://",
getFontFaceSet: () => null,
fetch: (url, options) => fetch(url, options),
parseXML: (xml) => new DOMParser().parseFromString(xml, "text/xml"),
};
DOMAdapter.set(HeadlessAdapter);The Adapter interface requires these methods: , , , , , , , , .
createCanvascreateImagegetCanvasRenderingContext2DgetWebGLRenderingContextgetNavigatorgetBaseUrlgetFontFaceSetfetchparseXML对于非标准环境(Node.js、无头测试、SSR),请实现完整的Adapter接口:
ts
import { DOMAdapter } from "pixi.js";
import type { Adapter } from "pixi.js";
import { createCanvas, Image } from "canvas";
import { DOMParser } from "@xmldom/xmldom";
const HeadlessAdapter: Adapter = {
createCanvas: (width, height) => createCanvas(width ?? 0, height ?? 0),
createImage: () => new Image(),
getCanvasRenderingContext2D: () => CanvasRenderingContext2D,
getWebGLRenderingContext: () => WebGLRenderingContext,
getNavigator: () => ({ userAgent: "HeadlessAdapter", gpu: null }),
getBaseUrl: () => "file://",
getFontFaceSet: () => null,
fetch: (url, options) => fetch(url, options),
parseXML: (xml) => new DOMParser().parseFromString(xml, "text/xml"),
};
DOMAdapter.set(HeadlessAdapter);Adapter接口需要以下方法:、、、、、、、、。
createCanvascreateImagegetCanvasRenderingContext2DgetWebGLRenderingContextgetNavigatorgetBaseUrlgetFontFaceSetfetchparseXMLChecking the current adapter
检查当前适配器
ts
import { DOMAdapter } from "pixi.js";
const adapter = DOMAdapter.get();
const canvas = adapter.createCanvas(256, 256);
const img = adapter.createImage();DOMAdapter.get()documentImagets
import { DOMAdapter } from "pixi.js";
const adapter = DOMAdapter.get();
const canvas = adapter.createCanvas(256, 256);
const img = adapter.createImage();DOMAdapter.get()documentImageCommon Mistakes
常见错误
[CRITICAL] Not setting adapter before app.init()
[严重] 未在app.init()前设置适配器
Wrong:
ts
const app = new Application();
await app.init({ width: 800, height: 600 });
DOMAdapter.set(WebWorkerAdapter); // too late; adapter already read during initCorrect:
ts
DOMAdapter.set(WebWorkerAdapter);
const app = new Application();
await app.init({ width: 800, height: 600 });DOMAdapter.set()app.init()app.init()new Application()错误示例:
ts
const app = new Application();
await app.init({ width: 800, height: 600 });
DOMAdapter.set(WebWorkerAdapter); // 太晚了;初始化期间已读取适配器正确示例:
ts
DOMAdapter.set(WebWorkerAdapter);
const app = new Application();
await app.init({ width: 800, height: 600 });在非浏览器环境中, 必须在 之前调用。PixiJS在创建渲染器的 过程中读取适配器。 本身仅创建舞台容器,不会读取适配器。
DOMAdapter.set()app.init()app.init()new Application()[HIGH] Using document or Image directly
[高风险] 直接使用document或Image
Wrong:
ts
const img = new Image();
img.src = "texture.png";Correct:
ts
import { DOMAdapter } from "pixi.js";
const img = DOMAdapter.get().createImage();
img.src = "texture.png";All DOM access in PixiJS goes through DOMAdapter. Direct use of , , or other browser globals breaks Web Worker and SSR compatibility.
documentImage错误示例:
ts
const img = new Image();
img.src = "texture.png";正确示例:
ts
import { DOMAdapter } from "pixi.js";
const img = DOMAdapter.get().createImage();
img.src = "texture.png";PixiJS中的所有DOM访问都通过DOMAdapter进行。直接使用 、 或其他浏览器全局对象会破坏Web Worker和SSR的兼容性。
documentImage[HIGH] CSP unsafe-eval import name confusion
[高风险] 混淆CSP unsafe-eval导入名称
Wrong:
ts
// CSP environment, omitting the import
import { Application } from "pixi.js";
// Throws: "Current environment does not allow unsafe-eval,
// please use pixi.js/unsafe-eval module to enable support."Correct:
ts
import "pixi.js/unsafe-eval";
import { Application } from "pixi.js";The import removes the need for / in shader compilation. Despite the name suggesting it enables unsafe eval, it does the opposite: it installs static polyfills so PixiJS works under strict CSP.
pixi.js/unsafe-evaleval()new Function()PixiJS detects CSP blocking at renderer init and throws the error above. The browser may also log its own CSP violation before PixiJS reports; both point to the same fix.
错误示例:
ts
// CSP环境,省略了导入
import { Application } from "pixi.js";
// 抛出错误:"当前环境不允许unsafe-eval,
// 请使用pixi.js/unsafe-eval模块来启用支持。"正确示例:
ts
import "pixi.js/unsafe-eval";
import { Application } from "pixi.js";pixi.js/unsafe-evaleval()new Function()PixiJS会在渲染器初始化时检测CSP阻止情况并抛出上述错误。浏览器也可能在PixiJS报告之前记录自身的CSP违规信息,两者指向相同的修复方案。
[HIGH] Using old settings.ADAPTER pattern
[高风险] 使用旧版settings.ADAPTER模式
Wrong:
ts
import { settings, WebWorkerAdapter } from "pixi.js";
settings.ADAPTER = WebWorkerAdapter;Correct:
ts
import { DOMAdapter, WebWorkerAdapter } from "pixi.js";
DOMAdapter.set(WebWorkerAdapter);The object was removed in v8. All adapter configuration uses .
settingsDOMAdapter.set()错误示例:
ts
import { settings, WebWorkerAdapter } from "pixi.js";
settings.ADAPTER = WebWorkerAdapter;正确示例:
ts
import { DOMAdapter, WebWorkerAdapter } from "pixi.js";
DOMAdapter.set(WebWorkerAdapter);v8版本中已移除 对象。所有适配器配置均使用 。
settingsDOMAdapter.set()