---
createdAt: 2026-01-11
updatedAt: 2026-01-11
title: `vite-env-only` & Intlayer – ложноположительная ошибка отказа `node:fs`
description: Почему vite-env-only сообщает об отклонённом импорте `node:fs` с Intlayer + React-Router + Vite и что с этим делать.
keywords:
- intlayer
- vite
- react-router
- vite-env-only
- node:fs
- отклонённый импорт
- алиас
- клиентский бандл
slugs:
- frequent-questions
- vite-env-only-node-fs-false-positive
---
# vite-env-only отклоняет `node:fs` в Intlayer
Если вы использовали плагин **vite-env-only** (как указано в старых рекомендациях React-Router v7) и видите:
```bash
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, делайте это **после сборки**, например:
```bash
pnpm build
grep -R "node:" dist/
```
Если результатов нет, ваши клиентские бандлы чисты.
## Резюме
- `vite-env-only` может выдавать ошибку на `node:fs`, потому что проверяет слишком рано.
- Vite + Intlayer + соглашения серверных модулей React-Router обычно корректно удаляют ссылки на код, предназначенный только для сервера.
- Удаление плагина или проверка итоговой сборки обычно является наилучшим решением.