Otrzymuj powiadomienia o nadchodzących wydaniach Intlayera

    vite-env-only odrzuca node:fs w Intlayer

    Jeśli używasz wtyczki vite-env-only (jak wspomniano w starszych sugestiach React-Router v7) i widzisz:

    Error: [vite-env-only] Import denied* Denied by specifier pattern: /^node:/* Importer: index.html* Import: "node:fs"

    …mimo że w twoim pakiecie klienckim nie ma node:fs, jest to fałszywy alarm.

    Co to powoduje

    vite-env-only wykonuje sprawdzenie oparte na Babel wcześnie w fazie rozwiązywania grafu Vite, zanim:

    • aliasowanie (w tym mapowania Intlayer dla przeglądarki vs node),
    • eliminacja martwego kodu,
    • rozwiązywanie SSR vs klienta,
    • moduły wirtualne, takie jak te z React-Routera.

    Pakiety Intlayer zawierają kod, który może działać zarówno na Node, jak i w przeglądarce. Na etapie pośrednim w grafie może pojawić się wbudowany moduł Node, taki jak node:fs, zanim Vite usunie go z kompilacji dla klienta. vite-env-only to wykrywa i natychmiast zgłasza błąd, mimo że finalny bundle go nie zawiera.

    React-Router i moduły serwerowe

    W dokumentacji React-Router dotyczącej konwencji modułów serwerowych
    (https://reactrouter.com/api/framework-conventions/server-modules), zespół wyraźnie sugeruje użycie vite-env-only, aby zapobiec przedostawaniu się importów tylko dla serwera do bundle'a klienta.

    Jednakże te konwencje opierają się na aliasingu Vite, conditional exports oraz tree-shaking, aby usunąć kod tylko dla serwera. Chociaż aliasing i conditional exports są już stosowane, niektóre narzędzia oparte na Node nadal występują w pakietach takich jak @intlayer/core na tym etapie (nawet jeśli nigdy nie są importowane po stronie klienta). Ponieważ tree-shaking jeszcze się nie uruchomił, te funkcje są nadal parsowane przez Babel, a vite-env-only wykrywa ich importy node: i zgłasza false positive — mimo że są poprawnie usuwane z ostatecznego bundle'a klienta.

    Jak naprawić / obejść

    Zalecane: Usuń vite-env-only

    Po prostu usuń wtyczkę. W wielu przypadkach nie jest ona potrzebna — Vite sam obsługuje rozróżnienie importów dla klienta i serwera poprzez własne rozwiązywanie.

    To naprawia fałszywy błąd dotyczący node:fs bez konieczności wprowadzania zmian w Intlayer.

    Zamiast tego zweryfikuj końcowy build

    Jeśli nadal chcesz upewnić się, że żadne wbudowane moduły Node nie trafiają do klienta, sprawdź to po buildzie, np.:

    pnpm buildgrep -R "node:" dist/

    Jeśli brak wyników, twoje client bundles są czyste.

    Podsumowanie

    • vite-env-only może zgłaszać błąd dotyczący node:fs, ponieważ sprawdza zbyt wcześnie.
    • Vite + Intlayer + konwencje modułów serwerowych React-Routera zwykle poprawnie usuwają odwołania przeznaczone wyłącznie dla serwera.
    • Usunięcie wtyczki lub weryfikacja końcowego wyniku zwykle jest najlepszym rozwiązaniem.