Получайте уведомления о предстоящих релизах 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, до:

    • алиасинга (включая маппинги Intlayer для browser vs node),
    • удаления неиспользуемого кода (dead-code elimination),
    • разрешения различий между SSR и клиентской сборкой,
    • виртуальных модулей, например у React-Router’а.

    Пакеты Intlayer содержат код, который может работать как в Node, так и в браузере. На промежуточном этапе встроенный модуль Node, такой как node:fs, может появиться в графе до того, как Vite удалит его из клиентской сборки. vite-env-only видит это и сразу же генерирует ошибку, даже если в итоговом бандле этого нет.

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

    В документации React-Router о sоrver module conventions
    (https://reactrouter.com/api/framework-conventions/server-modules), команда явно предлагает использовать vite-env-only, чтобы предотвратить утечку импортов, предназначенных только для сервера, в клиентский бандл.

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

    Как исправить / обойти

    Рекомендуется: удалить vite-env-only

    Просто удалите плагин. Во многих случаях он не нужен — Vite уже сам решает, какие импорты относятся к клиенту, а какие к серверу.

    Это устраняет ложную ошибку node:fs без изменений в Intlayer.

    Проверяйте итоговую сборку вместо этого

    Если вы всё же хотите убедиться, что в клиентской части нет встроенных модулей Node, делайте это после сборки, например:

    pnpm buildgrep -R "node:" dist/

    Если результатов нет, ваши клиентские бандлы чисты.

    Резюме

    • vite-env-only может выдавать ошибку на node:fs, потому что проверяет слишком рано.
    • Vite + Intlayer + соглашения серверных модулей React-Router обычно корректно удаляют ссылки на код, предназначенный только для сервера.
    • Удаление плагина или проверка итоговой сборки обычно является наилучшим решением.