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 обычно корректно удаляют ссылки на код, предназначенный только для сервера.
- Удаление плагина или проверка итоговой сборки обычно является наилучшим решением.