Отримуйте сповіщення про майбутні випуски Intlayer

    vite-env-only відхиляє node:fs в Intlayer

    Якщо ви використовували плагін vite-env-only (як зазначено в старих рекомендаціях React-Router v7) і бачите:

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

    …незважаючи на те, що в клієнтському бандлі немає node:fs, це — хибне спрацювання.

    Чому це відбувається

    vite-env-only виконує перевірку на основі Babel на ранньому етапі резолюції графа Vite, перед:

    • aliasing (включаючи відповідності Intlayer для browser vs node),
    • dead-code elimination,
    • SSR vs client resolution,
    • віртуальні модулі, як-от ті в React-Router.

    Пакети Intlayer містять код, який може працювати як у Node, так і в браузері. На проміжному етапі в графі може з'явитися вбудований модуль Node, наприклад node:fs, перед тим як Vite видалить його з клієнтської збірки. vite-env-only помічає це і відразу видає помилку, хоча у фінальному бандлі його немає.

    React-Router і серверні модулі

    У документації React-Router щодо конвенцій серверних модулів (https://reactrouter.com/api/framework-conventions/server-modules), команда чітко рекомендує використовувати vite-env-only, щоб запобігти потраплянню імпортів, призначених лише для сервера, у клієнтський бандл.

    Однак ці конвенції покладаються на aliasing Vite, conditional exports і tree-shaking для видалення коду, призначеного лише для сервера. Хоча aliasing і conditional exports вже застосовані, деякі утиліти на основі Node все ще присутні в пакетах на кшталт @intlayer/core на цьому етапі (хоча вони ніколи не імпортуються на клієнті). Оскільки tree-shaking ще не відбувся, ці функції все ще парсяться Babel, і vite-env-only виявляє їхні імпорти node: та породжує false positive — хоча вони коректно очищуються з фінального клієнтського бандлу.

    Як виправити / обійти

    Рекомендовано: Видалити vite-env-only

    Просто видаліть цей плагін. У багатьох випадках він не потрібен — Vite вже обробляє розрізнення імпортів для клієнта та сервера через власний механізм резолюції.

    Це виправляє хибну відмову через node:fs без змін в Intlayer.

    Натомість перевірте фінальну збірку

    Якщо ви все ще хочете переконатися, що в клієнтському бандлі немає вбудованих модулів Node, робіть це після збірки, наприклад:

    pnpm buildgrep -R "node:" dist/

    Якщо результатів немає, ваші клієнтські бандли чисті.

    Підсумок

    • vite-env-only може видавати помилку на node:fs, оскільки перевіряє занадто рано.
    • Vite + Intlayer + конвенції server modules у React-Router зазвичай правильно видаляють посилання, призначені тільки для сервера.
    • Видалення плагіна або перевірка фінального виводу зазвичай є найкращим рішенням.