Domů
» Základní znalosti
»
Jak opravit chybu Module Not Found: Nelze vyřešit fs ve Webpacku
Jak opravit chybu Module Not Found: Nelze vyřešit fs ve Webpacku
Naposledy ověřeno: 11. září 2026. Chyba „Module not found: Error: Can’t resolve 'fs'“ obvykle znamená, že Webpack sestavuje kód pro prohlížeč, ale váš zdrojový kód – nebo jedna z jeho závislostí – importuje modul souborového systému Node.js. Dokumentace Node popisuje node:fs jako API pro interakci se souborovým systémem, zatímco aktuální dokumentace Webpacku uvádí, že Webpack 5 již automaticky nepolyfilluje jádrové moduly Node.js pro sestavení v prohlížeči.
Důležité je vybrat opravu, která odpovídá tomu, co se kód skutečně snaží dělat. Neexistuje jediné nastavení, které by bylo správné pro každý projekt. Pokud vaše aplikace skutečně potřebuje číst soubory z disku serveru, přesuňte tuto práci do kódu Node/server. Pokud závislost importuje fs pouze pro volitelnou funkci dostupnou jen v Node, kterou váš balíček pro prohlížeč nikdy nepoužívá, může být vhodné nastavení resolve.fallback: { fs: false }. Pokud balíček nabízí kompatibilní sestavení pro prohlížeč, použijte to. A pokud je balíček určen ke spuštění v Node, cílte na Node místo předstírání, že jde o webový balíček.
Rychlá rozhodovací tabulka
Situace
Nejlepší první oprava
Hlavní výhoda
Hlavní kompromis
Váš vlastní kód pro prohlížeč importuje fs
Odstraňte ho z cesty pro prohlížeč nebo přesuňte operaci na server/API
Odpovídá skutečnému běhovému prostředí
Vyžaduje architektonickou hranici mezi klientem a serverem
Závislost importuje fs, ale tato funkce se v prohlížeči nikdy nepoužívá
Zvažte resolve.fallback: { fs: false }
Malá, jednoduchá oprava sestavení
Logicky selže, pokud balíček později spustí kód závislý na souborovém systému
Závislost nabízí sestavení pro prohlížeč i Node
Použijte nebo aktualizujte na vstup kompatibilní s prohlížečem
Zachovává zamýšlené chování v prohlížeči
Může vyžadovat změny balíčku/verze
Výstup běží v Node, ne v prohlížeči
Použijte target: "node"
Zachovává vestavěné funkce Node dostupné za běhu
Výstup již není balíčkem pro prohlížeč
Snažíte se „polyfillovat fs“ v prohlížeči
Přehodnoťte požadavek
Vyhýbá se zavádějící vrstvě kompatibility
Můžete potřebovat jiný pracovní postup pro ukládání/soubory na straně prohlížeče
Oficiální dokumentace resolve.fallback Webpacku uvádí, že Webpack 5 již automaticky nepolyfilluje jádrové moduly Node. Jeho poznámky k vydání Webpack 5 vysvětlují důvod: automatické polyfilly mohly přidat velký, zbytečný kompatibilní kód do balíčků pro frontend, takže Webpack přesunul odpovědnost na autora aplikace nebo balíčku.
Krok 1: Zjistěte, kdo importuje fs
Začněte prvním užitečným řádkem ve výstupu chyby Webpacku. Obvykle ukazuje na soubor, kde došlo k selhání řešení, například:
ERROR in ./src/utils/fileHelper.js 1:0-20
Module not found: Error: Can't resolve 'fs'
Ilustrace generovaná AI, která ukazuje selhání sestavení Webpacku při importu fs. Nejde o výstup ze skutečného projektu; názvy souborů a čísla řádků jsou pouze ilustrační.
Pokud je selhávající soubor váš, prohledejte ho pro obě formy:
const fs = require('fs')
// nebo
import fs from 'node:fs'
// nebo
import { readFile } from 'node:fs/promises'
Oficiální dokumentace File System Node potvrzuje, že node:fs a node:fs/promises jsou API Node pro operace se souborovým systémem. Běžný balíček pro prohlížeč nezíská přístup k disku serveru jen proto, že Webpack dokáže import parsovat.
Pokud je selhávající soubor pod node_modules, neupravujte okamžitě tento balíček na místě. Nejprve identifikujte, která závislost nejvyšší úrovně ho přivedla do vašeho balíčku pro prohlížeč. Užitečná otázka není jen „Který balíček importuje fs?“, ale „Proč je tato cesta kódu orientovaná na Node dosažitelná z mého klientského vstupu?“
Použijte tuto diagnostiku, když: chyba se objeví po aktualizaci Webpacku, přidání závislosti, importu dříve pouze serverové utility do kódu frontendu nebo přesunu sdíleného kódu do klientského balíčku.
Praktická kontrola: dočasně odstraňte import, který vede k selhávajícímu modulu, a znovu sestavte. Pokud chyba fs zmizí, potvrdili jste cestu závislosti před změnou konfigurace Webpacku.
Krok 2: Pokud kód skutečně potřebuje přístup k souborovému systému, přesuňte ho do kódu Node/server
Toto je nejlepší oprava, když kód potřebuje číst konfigurační soubory, šablony, lokální dokumenty, soukromé klíče, generované assety, serverové logy nebo cokoli jiného ze souborového systému stroje.
Například toto je vhodné v Node:
import { readFile } from 'node:fs/promises'
export async function loadTemplate() {
return readFile('./templates/email.html', 'utf8')
}
Do vstupu pro prohlížeč by to však nemělo být taháno. Místo toho vystavte výsledek prostřednictvím serverové vrstvy vaší aplikace. Zjednodušené rozdělení by mohlo vypadat takto:
// browser-side code
export async function loadTemplate() {
const response = await fetch('/api/template')
if (!response.ok) throw new Error('Failed to load template')
return response.text()
}
Ilustrace generovaná AI, která ukazuje oddělení práce se souborovým systémem Node od kódu prohlížeče. Jde o konceptuální příklad architektury, nikoli o snímek obrazovky konkrétního frameworku.
Kompromis je architektonický: přidáte serverový endpoint nebo jinou serverovou hranici, ale zachováte sémantiku fs. Prohlížeč požaduje data; server čte souborový systém.
Toto řešení je vhodné, když: operace se souborovým systémem je reálná a nutná.
Toto řešení není nutné, když: import existuje pouze uvnitř volitelné cesty kódu pro Node, kterou prohlížeč nikdy nespustí. V takovém případě může být čistší vstup balíčku specifický pro prohlížeč nebo ignorovaný fallback.
Krok 3: Použijte resolve.fallback: { fs: false } pouze tehdy, když je chování souborového systému volitelné
Oficiální migrační příručka Webpacku z verze 4 na 5 specificky uvádí, že konfigurace používající starý vzor node.fs: 'empty' by měly přejít na:
Ilustrace generovaná AI pro resolve.fallback: { fs: false }. Použijte toto pouze tehdy, když prohlížeč nepotřebuje chování souborového systému závislosti.
Nastavení fallbacku na false říká Webpacku, aby nezačlenil implementaci pro tento nevyřešený modul. To může být přesně správné pro balíček, který obsahuje chráněnou větev pouze pro Node, například kód, který používá fs pouze během serverového vykreslování nebo spuštění CLI.
Může to také skrýt chybu sestavení a nechat vás s chybou v návrhu za běhu. Zvažte tuto závislost:
Pokud váš prohlížeč skutečně volá loadUserConfig(), nahrazení fs „ničím“ nevytvoří funkční souborový systém prohlížeče. Sestavení může pokračovat, ale funkce stále nemůže provést zamýšlenou operaci Node.
Použijte fs: false, když: jste ověřili, že větev specifická pro souborový systém se v cíli pro web nepoužívá.
Nepoužívejte ho, když: vaše funkce v prohlížeči závisí na readFileSync, procházení adresářů, serverových cestách nebo jiném reálném chování souborového systému Node.
Proč „prostě nainstalujte polyfill fs“ je obvykle špatná první odpověď
Aktuální dokumentace resolve.fallback Webpacku uvádí příklady ručních polyfillů pro několik jádrových modulů Node, jako jsou path, buffer, stream a crypto. Je pozoruhodné, že její seznam kompatibility neposkytuje obecnou náhradu za fs ekvivalentní souborovému systému Node.
Tento rozdíl je důležitý. Utility JavaScriptu lze často reprodukovat v prohlížeči. Libovolný přístup k souborovému systému hostitele/serveru je schopnost běhového prostředí, nikoli jen chybějící pomocná funkce.
Pokud skutečně potřebujete pracovní postup v prohlížeči, zvolte nativní návrh prohlížeče pro konkrétní úkol – například načtěte asset z URL, nechte uživatele vybrat soubor nebo uložte data aplikace pomocí vhodného mechanismu úložiště prohlížeče. Nesuďte úspěch pouze podle toho, zda Webpack přestane zobrazovat chybu.
Možnost 4: Preferujte závislost kompatibilní s prohlížečem nebo export balíčku
Pokud chyba pochází ze balíčku třetí strany, zkontrolujte, zda tento balíček oficiálně podporuje prohlížeče. Aktuální průvodce exports balíčků Webpacku vysvětluje, že balíčky mohou poskytovat podmíněné exporty pro prostředí jako browser a node. Doporučení k vydání Webpacku také doporučuje autorům balíčků poskytovat alternativy kompatibilní s frontendem, když jsou implementace pouze pro Node nevhodné pro prohlížeče.
Pokud aktualizovaná verze balíčku poskytuje správný vstup pro prohlížeč, zatímco vaše starší verze ne, aktualizace může být bezpečnější než konfigurace fs: false. Stejně tak nahrazení balíčku orientovaného na Node balíčkem explicitně navrženým pro použití v prohlížeči může snížit kompatibilní hacky a složitost balíčku.
Zvolte tuto cestu, když: závislost by měla fungovat v prohlížečích, ale nainstalovaná verze vybírá nebo vystavuje implementaci pouze pro Node.
Kompromis: aktualizace nebo nahrazení balíčku může zavést změny API, takže spusťte běžné testy aplikace, místo abyste považovali úspěšné zkompilování za dostatečné.
Možnost 5: Pokud je výstupem balíček Node, nastavte cíl na Node
Někdy Webpack vůbec nevytváří kód pro prohlížeč. Můžete balíčkovat CLI, background worker, build tool, SSR server nebo službu Node. V takovém případě je snaha potlačit fs zpátečnická: běhové prostředí ho skutečně poskytuje.
sestavuje pro prostředí podobné Node.js a ponechává vestavěné moduly, jako jsou fs a path, na Node, aby je poskytl za běhu.
Podrobnější reference konfigurace target Webpacku také rozlišuje web, node, cíle Electron, web workers a další prostředí.
Použijte target: 'node', když: výsledný JavaScript bude spuštěn pod Node.
Nepoužívejte ho k „opravě“ běžné SPA v prohlížeči: změna cíle neznamená, že by prohlížeč najednou poskytl API souborového systému Node. Mění to prostředí, o kterém Webpack předpokládá, že bude balíček spouštět.
Pokročilá sestavení Node: externals mohou ponechat vestavěné funkce za běhu
Pro serverové balíčky Webpack také poskytuje chování externals orientované na Node. Jeho oficiální dokumentace Externals uvádí, že externalsPresets.node může zacházet s vestavěnými funkcemi Node, jako jsou fs, path a vm, jako s externími a načítat je pomocí běhového require() Node.
Typická konfigurace orientovaná na Node by tedy mohla vypadat takto:
Toto je pokročilá záležitost serverového balíčku, nikoli workaround pro prohlížeč.
Krok 4: Znovu sestavte a poté otestujte funkci, která způsobila import
Po provedení architektonické nebo konfigurační změny znovu sestavte:
npm run build
Ilustrace generovaná AI, která ukazuje úspěšné znovu-sestavení Webpacku. Čísla verzí, velikosti assetů a časy sestavení jsou fiktivní příklady.
Čisté zkompilování dokazuje pouze to, že řešení modulů bylo úspěšné. Nedokazuje, že se dotčená funkce chová správně. Testujte podle zvolené opravy:
Pokud jste přesunuli přístup k souborům na server, zavolejte funkci prohlížeče a ověřte, že serverový endpoint vrací očekávaná data.
Pokud jste nastavili fs: false, vyzkoušejte závislost v prohlížeči a potvrďte, že nikdy nevstoupí do větve závislé na souborovém systému.
Pokud jste přešli na sestavení balíčku pro prohlížeč, spusťte skutečný uživatelský workflow balíčku.
Pokud jste změnili cíl na Node, spusťte sestavený výstup pod verzí Node, kterou podporujete.
Srovnání běžných oprav
Oprava
Bezpečné pro prohlížeč?
Zachovává reálný přístup k souborovému systému Node?
Kdy ji preferovat
Přesun práce s fs na server/API
Ano
Ano, na serveru
Vaše aplikace skutečně potřebuje data ze souborového systému serveru
resolve.fallback.fs = false
Pouze pokud se větev fs nepoužívá
Ne
Volitelná cesta závislosti pouze pro Node
Balíček/export specifický pro prohlížeč
Ano, pokud to balíček podporuje
Ne; místo toho poskytuje chování specifické pro prohlížeč
Závislost je určena k podpoře obou běhových prostředí
target: 'node'
Ne
Ano
Balíček skutečně běží v Node
Obecný „fs polyfill“
Závisí na knihovně a sémantice
Není ekvivalentní libovolnému přístupu k souborovému systému Node
Pouze po ověření přesného chování prohlížeče, které potřebujete
Speciální případ: sdílený kód importovaný balíčky pro prohlížeč i server
Častým zdrojem této chyby je utilitní modul, který obsahuje jak čisté funkce, tak pomocné funkce pouze pro Node:
// shared-utils.js
import fs from 'node:fs'
export function formatDate(date) {
return new Intl.DateTimeFormat('en-US').format(date)
}
export function readConfig(path) {
return fs.readFileSync(path, 'utf8')
}
I když váš prohlížeč importuje pouze formatDate, import fs na horní úrovni může donutit Webpack vyřešit fs. Čistší návrh je rozdělit moduly:
// shared/formatDate.js
export function formatDate(date) {
return new Intl.DateTimeFormat('en-US').format(date)
}
// server/readConfig.js
import fs from 'node:fs'
export function readConfig(path) {
return fs.readFileSync(path, 'utf8')
}
To činí hranici běhového prostředí viditelnou v grafu modulů místo spoléhání se na tree-shaking nebo fallback k odstranění nekompatibilního importu.
Speciální případ: chyba se objevila po aktualizaci z Webpack 4
Toto je jeden z klasických příznaků migrace na Webpack 5. Webpack 4 automaticky dodával kompatibilní shims pro mnoho jádrových modulů Node. Webpack 5 to záměrně přestal dělat. Pokud váš kód „fungoval před aktualizací“, zeptejte se, zda skutečně potřeboval funkci Node v prohlížeči, nebo zda starý bundler tichounce vstřikoval kompatibilní kód.
Oficiální migrační příručka Webpacku doporučuje přečíst si pokyny k breaking-change ve výstupu chyby sestavení a nahradit starou kompatibilní konfiguraci node.* novějším přístupem resolveru, kde je to vhodné.
Nepředpokládejte, že recreate každého polyfillu Webpack 4 je nejlepší migrace. Vlastní poznámky k vydání Webpacku doporučují moduly kompatibilní s frontendem, kde je to možné.
Finální self-check
Před uzavřením problému ověřte tyto body:
Najděte přesný zdrojový soubor nebo závislost, která importuje fs.
Potvrďte, zda dotčený balíček běží v prohlížeči nebo v Node.
Pokud je to balíček pro prohlížeč, ověřte, zda funkce skutečně potřebuje chování souborového systému.
Pokud ano, přesuňte operaci se souborovým systémem za serverovou hranici.
Pokud je použití fs závislosti volitelné a nikdy se nespustí v prohlížeči, zvažte resolve.fallback: { fs: false }.
Pokud balíček oficiálně poskytuje export pro prohlížeč, preferujte to před potlačením požadovaného chování.
Pokud balíček běží v Node, použijte cíl Node místo cíle web.
Znovu sestavte a potvrďte, že chyba řešení modulu zmizela.
Spusťte skutečnou funkci, která dříve táhla fs; nezastavujte se na „zkompilováno úspěšně“.
Trvalá oprava spočívá v zarovnání kódu s jeho běhovým prostředím. fs patří do prostředí souborového systému Node. Webpack 5 činí tuto hranici viditelnější tím, že již automaticky nevstřikuje polyfilly jádra Node. Jakmile se rozhodnete, zda práce se souborovým systémem patří na server, je volitelná v prohlížeči, nebo je součástí balíčku cíleného na Node, správná konfigurace se stane mnohem snazší na výběr.