typescript - Pixi.js em SvelteKit dá um erro 'self não está definido' apenas durante a compilação


Como o título indica, ao usar Pixi.js no SvelteKit, SOMENTE e apenas durante a construção da aplicação, ele irá gerar um erro "self is not defined", e isso remete ao módulo @pixi/settings. Eu tentei todas as formas possíveis que conheço para resolver isto. Primeiro usei um shim para lhe fornecer algumas informações fictícias, mas isso não funcionou:

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 {};

O shim fornece todas as informações e variáveis falsas necessárias para funcionar, mas eu acho que isso não importa na compilação. Depois tentei importar pixi.js dinamicamente no onMount dentro do código assim:

<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>


Também tentei criar o meu próprio pacote de pixi.js tal como o pixijs.io/customize faz, e isso só cria outro problema com o qual não me quis incomodar.

Então, não faço ideia do que fazer para resolver isto, porque não posso simplesmente contornar o erro e executar o programa.

Resposta #1

Isto foi na verdade causado pelo código do pixijs ter usado self no seu código e quando o compilador do sveltekit o analisa, dá erro porque o nodejs não tem self como variável. Eu corrigi este problema e criei um pull request para o ramo principal do pixijs que será lançado na versão 6.3.0.

Aqui está o PR: https://github.com/pixijs/pixijs/pull/8050

Resposta #2

Não tenho a certeza se isto está relacionado, mas adicionei o Pixi ao meu projeto Svelte (baseado no modelo oficial de arranque do Svelte usando rollup) e comecei a receber este erro:

ReferenceError: url$1 is not defined

Vinha do meu pacote "em geral" e não apontava para um ponto específico de falha.

Depois de alguma pesquisa, descobri que adicionar a configuração preferBuiltins: false às minhas definições do plugin resolve no rollup.config.js resolveu o problema (onde resolve é a importação do plugin @rollup/plugin-node-resolve.

Então, em rollup.config.js:

import resolve from "@rollup/plugin-node-resolve";

export default {
  ...
  plugins: [
    resolve({
      ...
      preferBuiltins: false,
      ...
    })
  ]
  ...
}