pixijs-environments
PixiJS v8 を標準ブラウザ以外の環境(Web Worker・OffscreenCanvas・Node.js/SSR・CSP制限環境など)で動作させる際に使用するスキル。`DOMAdapter.set`・`BrowserAdapter`・`WebWorkerAdapter`・カスタム Adapter インターフェースの実装方法や、厳格な CSP 環境向けの `pixi.js/unsafe-eval` の利用方法をカバーする。
description の原文を見る
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.
SKILL.md 本文
DOMAdapter はPixiJSが行うすべてのDOM アクセス(キャンバス作成、画像読み込み、fetch、XML パース)を抽象化し、ライブラリが非ブラウザ環境で実行できるようにします。app.init() の前に DOMAdapter.set(...) を呼び出して、別のアダプターに切り替えます。
クイックスタート
// 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,
});
};
unsafe-eval をブロックするCSP環境では、レンダラー初期化の前にポリフィルをインポートします:
import "pixi.js/unsafe-eval";
関連スキル: pixijs-application(標準的なブラウザ初期化)、pixijs-migration-v8(設定削除、アダプター変更)。
コアパターン
Web Worker と OffscreenCanvas
メインスレッドから OffscreenCanvas を転送してから、ワーカー内で PixiJS を初期化します:
// 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]);
// 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() の前に実行する必要があります。WebWorkerAdapter は document.createElement('canvas') の代わりに OffscreenCanvas を使用し、XML パースには @xmldom/xmldom を使用します。
Web Worker 内では動作しない機能(DOM アクセスなし):
DOMContainer— オーバーレイする実際の DOM ノードがありません。AccessibilitySystem— ライブ DOM フォーカスとスクリーンリーダーフックに依存します。- Font Loading API 経由の
FontFace読み込み — 代わりに事前変換されたビットマップフォント(BitmapFont.installまたは.fntアセット)を使用してください。
環境別のサブパスインポート
pixi.js をインポートする代わりに、各環境用に厳選されたバンドルをインポートできます:
import "pixi.js/browser"; // accessibility, dom, events, spritesheet, rendering, filters
import "pixi.js/webworker"; // spritesheet, rendering, filters (DOM のみのモジュール除外)
pixi.js/webworker は意図的に accessibility、dom、events を除外しています。これらは DOM を必要とするためです。loadEnvironmentExtensions がレンダラー初期化時に動的インポートで適切なセットを読み込むのに頼らず、静的で同期的なモジュール登録が必要な場合に、これらのサブパスエントリを使用します。
loadEnvironmentExtensions
import { loadEnvironmentExtensions } from "pixi.js";
await loadEnvironmentExtensions(false); // false = デフォルトを読み込む; true = スキップ
loadEnvironmentExtensions(skip) は非推奨の autoDetectEnvironment ヘルパー(v8.1.6 以降)を置き換えます。カスタム環境をブートストラップするときに、レンダラー初期化時のデフォルトブラウザ拡張の自動読み込みをオプトアウトするには true を渡します。autoDetectEnvironment(add) はまだシムとして存在し、loadEnvironmentExtensions(!add) に転送されます。
CSP準拠のセットアップ
PixiJS はシェーダーコンパイルと uniform 同期に new Function() を内部で使用します。unsafe-eval をブロックする Content Security Policy 環境では、ポリフィルをインポートします:
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 ベースのコード生成を、シェーダー同期、UBO 同期、uniform 同期、およびパーティクルバッファ更新用の静的ポリフィルで置き換えます。インポートはいかなる PixiJS レンダラー初期化の前に実行される必要があります。
注釈: pixi.js/unsafe-eval という名前は直感的ではありません。これは unsafe eval を有効にするのではなく、その必要性を取り除きます。この名前は回避する CSP ディレクティブを参照しています。
カスタムアダプター
非標準環境(Node.js、ヘッドレステスト、SSR)の場合、完全な Adapter インターフェースを実装します:
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 インターフェースには以下のメソッドが必要です:createCanvas、createImage、getCanvasRenderingContext2D、getWebGLRenderingContext、getNavigator、getBaseUrl、getFontFaceSet、fetch、parseXML。
現在のアダプターを確認する
import { DOMAdapter } from "pixi.js";
const adapter = DOMAdapter.get();
const canvas = adapter.createCanvas(256, 256);
const img = adapter.createImage();
DOMAdapter.get() は現在設定されているアダプターを返します。PixiJS 関連コード内での DOM アクセスには、document や Image を直接呼び出さず、これを使用します。
よくある間違い
[重要] app.init() の前にアダプターを設定しない
間違い:
const app = new Application();
await app.init({ width: 800, height: 600 });
DOMAdapter.set(WebWorkerAdapter); // 遅すぎます; 初期化時にアダプターが既に読み込まれています
正しい:
DOMAdapter.set(WebWorkerAdapter);
const app = new Application();
await app.init({ width: 800, height: 600 });
非ブラウザ環境では、DOMAdapter.set() を app.init() の前に呼び出す必要があります。PixiJS はレンダラー作成時に app.init() 中にアダプターを読み込みます。new Application() 自体はステージ Container のみを作成し、アダプターを読み込みません。
[高] document や Image を直接使用する
間違い:
const img = new Image();
img.src = "texture.png";
正しい:
import { DOMAdapter } from "pixi.js";
const img = DOMAdapter.get().createImage();
img.src = "texture.png";
PixiJS 内のすべての DOM アクセスは DOMAdapter を通過します。document、Image、またはその他のブラウザグローバルの直接使用は、Web Worker と SSR 互換性を破壊します。
[高] CSP unsafe-eval インポート名の混乱
間違い:
// CSP 環境、インポートを省略
import { Application } from "pixi.js";
// スロー: "Current environment does not allow unsafe-eval,
// please use pixi.js/unsafe-eval module to enable support."
正しい:
import "pixi.js/unsafe-eval";
import { Application } from "pixi.js";
pixi.js/unsafe-eval インポートはシェーダーコンパイルで eval() / new Function() の必要性を取り除きます。名前は unsafe eval を有効にすることを示唆していますが、実際はその反対です。つまり、PixiJS が厳密な CSP で動作するように静的ポリフィルをインストールします。
PixiJS はレンダラー初期化時に CSP ブロッキングを検出し、上記のエラーをスローします。ブラウザは PixiJS がレポートする前に独自の CSP 違反もログに記録する可能性があります。どちらも同じ修正を指しています。
[高] 古い settings.ADAPTER パターンを使用する
間違い:
import { settings, WebWorkerAdapter } from "pixi.js";
settings.ADAPTER = WebWorkerAdapter;
正しい:
import { DOMAdapter, WebWorkerAdapter } from "pixi.js";
DOMAdapter.set(WebWorkerAdapter);
settings オブジェクトは v8 で削除されました。すべてのアダプター設定は DOMAdapter.set() を使用します。
API リファレンス
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- pixijs
- リポジトリ
- pixijs/pixijs-skills
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/pixijs/pixijs-skills / ライセンス: MIT
関連スキル
doubt-driven-development
重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。
apprun-skills
TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。
desloppify
コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。
debugging-and-error-recovery
テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。
test-driven-development
テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。
incremental-implementation
変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。