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