vite-env-only menolak node:fs dengan Intlayer
Jika Anda menggunakan plugin vite-env-only (seperti disarankan dalam dokumentasi React-Router v7 yang lebih lama) dan melihat:
Error: [vite-env-only] Import denied* Denied by specifier pattern: /^node:/* Importer: index.html* Import: "node:fs"…meskipun tidak ada node:fs di bundel klien Anda, ini adalah false positive.
Apa penyebabnya
vite-env-only menjalankan pemeriksaan berbasis Babel lebih awal dalam resolusi graph Vite, sebelum:
- aliasing (termasuk pemetaan browser vs node milik Intlayer),
- dead-code elimination,
- resolusi SSR vs client,
- modul virtual seperti milik React-Router.
Paket Intlayer berisi kode yang dapat berjalan di Node maupun browser. Pada tahap perantara, built-in Node seperti node:fs mungkin muncul dalam graph sebelum Vite menghapusnya dari build klien. vite-env-only melihat itu dan langsung menghasilkan error, meskipun bundle akhir tidak mengandungnya.
React-Router dan Konvensi Modul Server
Dalam dokumentasi React-Router tentang konvensi modul server
(https://reactrouter.com/api/framework-conventions/server-modules), tim secara eksplisit menyarankan menggunakan vite-env-only untuk mencegah impor yang hanya untuk server bocor ke bundle klien.
Namun, konvensi tersebut bergantung pada aliasing Vite, conditional exports, dan tree-shaking untuk menghapus kode yang hanya untuk server. Meskipun aliasing dan conditional exports sudah diterapkan, beberapa utilitas berbasis Node masih hadir dalam paket seperti @intlayer/core pada tahap itu (meskipun mereka tidak pernah diimpor di sisi klien). Karena tree-shaking belum dijalankan, fungsi-fungsi tersebut masih diparsing oleh Babel, dan vite-env-only mendeteksi impor node: mereka dan menghasilkan false positive — meskipun impor tersebut benar-benar dibersihkan dari bundle klien akhir.
Cara memperbaiki / mengatasi
Direkomendasikan: Hapus vite-env-only
Cukup hapus plugin tersebut. Dalam banyak kasus Anda tidak membutuhkannya — Vite sudah menangani impor client vs server melalui resolusinya sendiri.
Ini memperbaiki penolakan node:fs yang keliru tanpa perubahan pada Intlayer.
Validasi build akhir sebagai gantinya
Jika Anda masih ingin memastikan tidak ada built-in Node di client, lakukan itu setelah build, misalnya:
pnpm buildgrep -R "node:" dist/Jika tidak ada hasil, bundle client Anda bersih.
Ringkasan
- vite-env-only dapat menghasilkan error pada node:fs karena ia melakukan pengecekan terlalu awal.
- Konvensi server modules Vite + Intlayer + React-Router biasanya menghapus referensi yang hanya untuk server dengan benar.
- Menghapus plugin tersebut atau memverifikasi hasil akhir biasanya merupakan solusi terbaik.