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