Pixijs Environments

pixijs/pixijs-skills/skills/pixijs-environments

作者 pixijs83760c6f5346MIT347 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫7 天前更新

Use this skill when running PixiJS v8 outside a standard browser: Web Workers, OffscreenCanvas, Node/SSR, or CSP-restricted contexts. Covers DOMAdapter.set, BrowserAdapter, WebWorkerAdapter, custom Adapter interface, pixi.js/unsafe-eval for strict CSP. Triggers on: DOMAdapter, BrowserAdapter, WebWorkerAdapter, Web Worker, OffscreenCanvas, Node, headless, SSR, CSP, unsafe-eval, Adapter.

AI 產生的概覽

指導在非標準瀏覽器環境中執行 PixiJS v8,涵蓋 DOMAdapter、Web Worker、OffscreenCanvas、Node/SSR 與 CSP 安全設定。

功能
說明如何為非瀏覽器環境設定 PixiJS v8:在 app.init() 之前設定 DOMAdapter、搭配 OffscreenCanvas 使用 WebWorkerAdapter,以及為 Node、無頭測試或 SSR 實作自訂 Adapter。也介紹依環境區分的子路徑匯入、loadEnvironmentExtensions,以及用於嚴格 CSP 的 pixi.js/unsafe-eval 相容層。文件列出常見錯誤,例如適配器設定過晚、直接使用 document 或 Image,以及已移除的 settings.ADAPTER 寫法。
適用情境
適用於在 Web Worker、OffscreenCanvas、Node 或 SSR、無頭測試或受 CSP 限制的頁面中執行 PixiJS v8。也適用於將適配器設定從已移除的 settings 物件遷移出來。
執行需求
需要 PixiJS v8;使用自訂適配器時還需要 canvas、@xmldom/xmldom 等套件。不包含指令碼,僅為說明文件。

DOMAdapter abstracts every piece of DOM access PixiJS does (canvas creation, Image loading, fetch, XML parsing) so the library can run in non-browser contexts. Call DOMAdapter.set(...) before app.init() to swap in a different adapter.

Quick Start

ts
// worker.ts — OffscreenCanvas posted from main threadDOMAdapter.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 unsafe-eval, import the polyfill before any renderer init:

ts
import "pixi.js/unsafe-eval";

Related skills: pixijs-application (standard browser init), pixijs-migration-v8 (settings removal, adapter changes).

Core Patterns

Web Worker with OffscreenCanvas

Transfer an OffscreenCanvas from the main thread, then initialize PixiJS in the worker:

ts
// main.tsconst 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.tsimport { 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) must happen before new Application(). The WebWorkerAdapter uses OffscreenCanvas instead of document.createElement('canvas') and @xmldom/xmldom for XML parsing.

Features that do not work inside a Web Worker (no DOM access):

  • DOMContainer — there is no real DOM node to overlay.
  • AccessibilitySystem — depends on live DOM focus and screen reader hooks.
  • FontFace loading via the Font Loading API — use pre-converted bitmap fonts (BitmapFont.install or .fnt assets) instead.

Environment-specific subpath imports

Instead of importing pixi.js, you can pull in a curated bundle for each environment:

ts
import "pixi.js/browser"; // accessibility, dom, events, spritesheet, rendering, filtersimport "pixi.js/webworker"; // spritesheet, rendering, filters (no DOM-only modules)

pixi.js/webworker deliberately omits accessibility, dom, and events because they require the DOM. Use these subpath entries when you want static, synchronous module registration instead of relying on loadEnvironmentExtensions to dynamic-import the right set at renderer init.

loadEnvironmentExtensions

ts
import { loadEnvironmentExtensions } from "pixi.js";
await loadEnvironmentExtensions(false); // false = load defaults; true = skip

loadEnvironmentExtensions(skip) replaces the deprecated autoDetectEnvironment helper (since 8.1.6). Pass true to opt out of auto-loading the default browser extensions when you are bootstrapping a custom environment. autoDetectEnvironment(add) still exists as a shim that forwards to loadEnvironmentExtensions(!add).

CSP-compliant setup

PixiJS uses new Function() internally for shader compilation and uniform syncing. In Content Security Policy environments that block unsafe-eval, import the polyfill:

ts
import "pixi.js/unsafe-eval";import { Application } from "pixi.js";
const app = new Application();await app.init({ width: 800, height: 600 });

The pixi.js/unsafe-eval 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.

Tension note: The name pixi.js/unsafe-eval is counterintuitive. It does not enable unsafe eval; it removes the need for it. The name refers to the CSP directive it works around.

Custom 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: createCanvas, createImage, getCanvasRenderingContext2D, getWebGLRenderingContext, getNavigator, getBaseUrl, getFontFaceSet, fetch, parseXML.

Checking 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() returns whatever adapter is currently set. Use this for any DOM access within PixiJS-adjacent code instead of calling document or Image directly.

Common Mistakes

[CRITICAL] Not setting adapter before app.init()

Wrong:

ts
const app = new Application();await app.init({ width: 800, height: 600 });DOMAdapter.set(WebWorkerAdapter); // too late; adapter already read during init

Correct:

ts
DOMAdapter.set(WebWorkerAdapter);const app = new Application();await app.init({ width: 800, height: 600 });

DOMAdapter.set() must be called before app.init() in non-browser environments. PixiJS reads the adapter during app.init() when the renderer is created. new Application() itself only creates the stage Container and does not read the adapter.

[HIGH] Using document or Image directly

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 document, Image, or other browser globals breaks Web Worker and SSR compatibility.

[HIGH] CSP unsafe-eval import name confusion

Wrong:

ts
// CSP environment, omitting the importimport { 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 pixi.js/unsafe-eval import removes the need for eval() / new Function() 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.

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.

[HIGH] Using old settings.ADAPTER pattern

Wrong:

ts
import { settings, WebWorkerAdapter } from "pixi.js";settings.ADAPTER = WebWorkerAdapter;

Correct:

ts
import { DOMAdapter, WebWorkerAdapter } from "pixi.js";DOMAdapter.set(WebWorkerAdapter);

The settings object was removed in v8. All adapter configuration uses DOMAdapter.set().

API Reference

來源與署名

來源:pixijs/pixijs-skills位於skills/pixijs-environments提交83760c6

授權條款: MIT

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架