typescript - Pixi.js v SvelteKit spôsobuje chybu 'self is not defined' iba pri budovaní
Ako názov uvádza, pri používaní Pixi.js v SvelteKit, LEN a LEN počas kompilácie aplikácie sa objaví chyba „self is not defined“ a jej pôvod vedie späť k modulu @pixi/settings. Skúšal som všetky možné spôsoby, ktoré poznám, aby som to opravil. Najprv som použil shim, aby som mu poskytol niektoré fiktívne informácie, ale nepomohlo to:
if (typeof window === 'undefined') {
globalThis.window = {} as any;
}
if (typeof self === 'undefined') {
globalThis.self = globalThis.window;
}
if (typeof document === 'undefined') {
if (window.document) {
globalThis.document = window.document;
} else {
globalThis.document = window.document = {
createElement: (elementName: string) => {
switch (elementName) {
case 'canvas':
return {
getContext: (contextName: string) => {
switch (contextName) {
case 'webgl':
return {
getExtension: () => {}
};
case '2d':
return {
fillRect: () => {},
drawImage: () => {},
getImageData: () => {}
};
}
}
};
}
}
} as any;
}
if (typeof CanvasRenderingContext2D === 'undefined') {
globalThis.CanvasRenderingContext2D = { prototype: {} };
}
}
export {};
Shim poskytuje všetky potrebné falošné informácie a premenné potrebné na spustenie, ale hádam na zostavení nezáleží. Potom som sa pokúsil importovať pixi.js dynamicky na onMount v kóde takto:
<script lang="ts">
import '$utils/pixi-ssr-shim';
import { onMount } from 'svelte';
import App from './utils/App';
import { run } from './seating-chart';
let el: HTMLDivElement;
onMount(async () => {
//@ts-ignore
const PIXI = await import('pixi.js');
run(el, PIXI);
window.addEventListener('resize', () => {
App.app.destroy(true);
App.app = null;
App.viewport = null;
run(el, PIXI);
});
});
</script>
<div class="flex items-center justify-around">
<div bind:this={el} />
</div>
Skúsil som tiež vytvoriť vlastný balíček pixi.js tak, ako to robí pixijs.io/customize, a to vytvorilo len ďalší problém, s ktorým som sa nechcel zaoberať.
Takže, nemám ani potuchy, čo robiť, aby som to opravil, pretože nemôžem jednoducho obísť chybu a spustiť program.
Odpoveď č. 1
Toto bolo vlastne spôsobené tým, že kód pixijs použil self vo svojom kóde a keď ho kompilátor SvelteKit analyzuje, vyskytne sa chyba, pretože Node.js nemá premenú self. Tento problém som opravil a vytvoril pull request do hlavnej vetvy pixijs, ktorý bude vydaný vo verzii 6.3.0.
Tu je PR: https://github.com/pixijs/pixijs/pull/8050
Odpoveď č. 2
Nie som si istý, či to súvisí, ale do môjho Svelte projektu som pridal Pixi (na základe oficiálneho Svelte štartovacieho šablónu s použitím Rollupu) a začal sa mi zobrazovať tento chybový hlásenie:
ReferenceError: url$1 is not defined
Vyplývalo to z môjho balíka „vo všeobecnosti“ a neukazovalo na konkrétny bod zlyhania.
Po niekoľkých pátraniach som zistil, že pridanie nastavenia preferBuiltins: false do mojich nastavení pluginu resolve v rollup.config.js to opravilo (kde resolve je import z pluginu @rollup/plugin-node-resolve.
Takže v rollup.config.js:
import resolve from "@rollup/plugin-node-resolve";
export default {
...
plugins: [
resolve({
...
preferBuiltins: false,
...
})
]
...
}
