Kā novērst kļūdu “Module Not Found: Can’t Resolve fs” programmā Webpack

Pēdējoreiz pārbaudīts: 2026. gada 11. septembrī. Kļūda “Module not found: Error: Can’t resolve 'fs'” parasti nozīmē, ka Webpack veido kodu pārlūkam, taču jūsu avota kods vai viena no tā atkarībām importē Node.js failu sistēmas moduli. Node dokumentācija apraksta node:fs kā API mijiedarbībai ar failu sistēmu, savukārt Webpack pašreizējā dokumentācija norāda, ka Webpack 5 vairs automātiski nepievieno Node.js kodola moduļu polifillus pārlūka būvēšanai.

Svarīgākā daļa ir izvēlēties risinājumu, kas atbilst tam, ko kods patiesībā mēģina izdarīt. Nav viena iestatījuma, kas būtu pareizs katram projektam. Ja jūsu lietojumprogrammai tiešām ir nepieciešams lasīt failus no servera diska, pārvietojiet šo darbību uz Node/servera kodu. Ja atkarība importē fs tikai neobligātai tikai Node paredzētai funkcijai, ko jūsu pārlūka pakotne nekad neizmanto, var būt piemērots resolve.fallback: { fs: false }. Ja pakotnei ir pārlūkā saderīga būve, izmantojiet to. Un, ja pakotne ir paredzēta darbībai Node vidē, norādiet Node mērķi, nevis mēģiniet to uzskatīt par tīmekļa pakotni.

Ātra lēmumu tabula

SituācijaLabākais pirmais risinājumsGalvenā priekšrocībaGalvenais kompromiss
Jūsu pašu pārlūka kods importē fsNoņemiet to no pārlūka ceļa vai pārvietojiet darbību uz serveri/APIAtbilst faktiskajai izpildes videiNepieciešama arhitektūras robeža starp klientu un serveri
Atkarība importē fs, bet šī funkcija pārlūkā netiek izmantotaApsveriet resolve.fallback: { fs: false }Mazs, vienkāršs būves labojumsLoģiski neizdosies, ja pakotne vēlāk izpildīs failu sistēmai atkarīgu kodu
Atkarība piedāvā pārlūka un Node būvesIzmantojiet vai atjauniniet uz pārlūkā saderīgu ieejas punktuSaglabā paredzēto pārlūka uzvedībuVar būt nepieciešamas pakotnes/versijas izmaiņas
Izvade darbojas Node vidē, nevis pārlūkāIzmantojiet target: "node"Saglabā Node iebūvētos moduļus pieejamus izpildes laikāIzvade vairs nav pārlūka pakotne
Mēģināt “polifillēt fs” pārlūkāPārvērtējiet prasībuIzvairās no maldinoša saderības slāņaVar būt nepieciešams cits pārlūka puses glabāšanas/failu darba plūsmas risinājums

Webpack oficiālā resolve.fallback dokumentācija norāda, ka Webpack 5 vairs automātiski nepievieno Node kodola moduļu polifillus. Tās Webpack 5 izlaišanas piezīmes izskaidro iemeslu: automātiskie polifilli varēja pievienot lielu, nevajadzīgu saderības kodu frontend pakotnēm, tāpēc Webpack nodeva atbildību lietotnes vai pakotnes autoram.

1. solis: Noskaidrojiet, kas importē fs

Sāciet ar pirmo noderīgo rindu Webpack kļūdas izvades. Parasti tā norāda uz failu, kurā atrisināšana neizdevās, piemēram:

ERROR in ./src/utils/fileHelper.js 1:0-20
Module not found: Error: Can't resolve 'fs'
AI ģenerēta termināla ilustrācija, kurā Webpack nevar atrisināt Node fs moduli pārlūka būvē
AI ģenerēta ilustrācija par Webpack būves kļūmi, importējot fs. Tā nav īsta projekta izvade; failu nosaukumi un rindu numuri ir ilustratīvi.

Ja kļūdainais fails ir jūsu, meklējiet tajā vienu no šīm formām:

const fs = require('fs')

// vai
import fs from 'node:fs'

// vai
import { readFile } from 'node:fs/promises'

Node oficiālā failu sistēmas dokumentācija apstiprina, ka node:fs un node:fs/promises ir Node API failu sistēmas darbībām. Parasta pārlūka pakotne neiegūst piekļuvi servera diskam tikai tāpēc, ka Webpack var parsēt importu.

Ja kļūdainais fails atrodas node_modules, nekavējoties needitējiet šo pakotni uz vietas. Vispirms identificējiet, kura augstākā līmeņa atkarība to ienesa jūsu pārlūka pakotnē. Noderīgais jautājums nav tikai “Kura pakotne importē fs?” bet gan “Kāpēc šis Node orientētais koda ceļš ir sasniedzams no mana klienta ieejas punkta?”

Izmantojiet šo diagnostiku, kad: kļūda parādās pēc Webpack atjaunināšanas, pievienojot atkarību, importējot iepriekš tikai serverim paredzētu utilītu frontend kodā vai pārvietojot kopīgu kodu uz klienta pakotni.

Praktiska pārbaude: pagaidām noņemiet importu, kas noved pie kļūdainā moduļa, un pārbūvējiet. Ja fs kļūda pazūd, esat apstiprinājis atkarību ceļu, pirms maināt Webpack konfigurāciju.

2. solis: Ja kodam tiešām ir nepieciešama piekļuve failu sistēmai, pārvietojiet to uz Node/servera kodu

Tas ir labākais risinājums, kad kodam ir jālasa konfigurācijas faili, veidnes, lokāli dokumenti, privātās atslēgas, ģenerētie resursi, servera žurnāli vai jebkas cits no mašīnas failu sistēmas.

Piemēram, tas ir piemēroti Node vidē:

import { readFile } from 'node:fs/promises'

export async function loadTemplate() {
  return readFile('./templates/email.html', 'utf8')
}

Bet to nevajadzētu ievilkt pārlūka ieejas punktā. Tā vietā atklājiet rezultātu caur jūsu lietojumprogrammas servera slāni. Vienkāršota sadalīšana varētu būt:

// servera puses kods
import { readFile } from 'node:fs/promises'

app.get('/api/template', async (req, res) => {
  const text = await readFile('./templates/email.html', 'utf8')
  res.type('text/plain').send(text)
})
// pārlūka puses kods
export async function loadTemplate() {
  const response = await fetch('/api/template')
  if (!response.ok) throw new Error('Failed to load template')
  return response.text()
}
AI ģenerēta koda redaktora ilustrācija, kurā failu sistēmas loģika ir pārvietota no pārlūka koda uz servera/API robežu
AI ģenerēta ilustrācija par Node failu sistēmas darba atdalīšanu no pārlūka koda. Tas ir konceptuāls arhitektūras piemērs, nevis konkrēta ietvara ekrānuzņēmums.

Kompromiss ir arhitektūras: jūs pievienojat servera galapunktu vai citu servera puses robežu, bet saglabājat fs semantiku. Pārlūks pieprasa datus; serveris lasa failu sistēmu.

Šis risinājums ir piemērots, kad: failu sistēmas darbība ir reāla un nepieciešama.

Šis risinājums nav nepieciešams, kad: imports eksistē tikai neobligātā Node koda ceļā, ko pārlūks nekad neizpilda. Šajā gadījumā pārlūkam specifisks pakotnes ieejas punkts vai ignorēts fallback var būt tīrāks.

3. solis: Izmantojiet resolve.fallback: { fs: false } tikai tad, ja failu sistēmas uzvedība ir neobligāta

Webpack oficiālā Webpack 4 uz 5 migrācijas rokasgrāmata īpaši norāda, ka konfigurācijas, kas izmantoja veco modeli node.fs: 'empty', jāpārvieto uz:

module.exports = {
  // ...
  resolve: {
    fallback: {
      fs: false
    }
  }
}

Skatiet oficiālo Webpack 5 migrācijas rokasgrāmatu.

AI ģenerēta webpack.config.js ilustrācija, kurā redzams resolve fallback ar fs iestatītu uz false
AI ģenerēta ilustrācija par resolve.fallback: { fs: false }. Izmantojiet to tikai tad, ja pārlūkam nav nepieciešama atkarības failu sistēmas uzvedība.

Fallback iestatīšana uz false norāda Webpack neiekļaut implementāciju šim neatrisinātajam modulim. Tas var būt tieši pareizi pakotnei, kas satur aizsargātu tikai Node zaru, piemēram, kodu, kas izmanto fs tikai servera renderēšanas vai CLI izpildes laikā.

Tas var arī slēpt būves kļūdu, atstājot jūs ar izpildes laika dizaina kļūdu. Apsveriet šo atkarību:

const fs = require('fs')

export function loadUserConfig(path) {
  return fs.readFileSync(path, 'utf8')
}

Ja jūsu pārlūks patiešām izsauc loadUserConfig(), fs aizstāšana ar “nekā” neizveido funkcionējošu pārlūka failu sistēmu. Būve var turpināties, bet funkcija joprojām nevar veikt paredzēto Node darbību.

Izmantojiet fs: false, kad: esat pārbaudījis, ka failu sistēmai specifiskais zars netiek izmantots tīmekļa mērķī.

Neizmantojiet to, kad: jūsu pārlūka funkcija ir atkarīga no readFileSync, direktoriju pārlūkošanas, servera ceļiem vai citas reālas Node failu sistēmas uzvedības.

Kāpēc “vienkārši instalējiet fs polifillu” parasti ir nepareiza pirmā atbilde

Webpack pašreizējā resolve.fallback dokumentācija sniedz piemērus manuāliem polifilliem vairākiem Node kodola moduļiem, piemēram, path, buffer, stream un crypto. Īpaši jāatzīmē, ka tās saderības sarakstā nav vispārīga fs aizstājēja, kas būtu ekvivalents Node failu sistēmai.

Šī atšķirība ir svarīga. JavaScript utilītus bieži var reproducēt pārlūkā. Patvaļīga piekļuve saimniekservera failu sistēmai ir izpildes vides iespēja, nevis tikai trūkstoša palīgfunkcija.

Ja jums patiešām ir nepieciešama pārlūka darba plūsma, izvēlieties pārlūkam raksturīgu dizainu konkrētajam uzdevumam — piemēram, ielādējiet resursu no URL, ļaujiet lietotājam izvēlēties failu vai glabājiet lietojumprogrammas datus, izmantojot atbilstošu pārlūka glabāšanas mehānismu. Nevērtējiet panākumus tikai pēc tā, vai Webpack pārstāj rādīt kļūdu.

4. opcija: Dodiet priekšroku pārlūkā saderīgai atkarībai vai pakotnes eksportam

Ja kļūda nāk no trešās puses pakotnes, pārbaudiet, vai šī pakotne oficiāli atbalsta pārlūkus. Webpack pašreizējā pakotnes exports rokasgrāmata izskaidro, ka pakotnes var nodrošināt nosacītus eksportus vidēm, piemēram, browser un node. Webpack izlaišanas norādījumi arī iesaka pakotņu autoru nodrošināt frontend saderīgas alternatīvas, kad tikai Node implementācijas nav piemērotas pārlūkiem.

Piemēram, pakotne var konceptuāli eksponēt:

{
  "exports": {
    ".": {
      "browser": "./dist/browser.js",
      "node": "./dist/node.js",
      "default": "./dist/browser.js"
    }
  }
}

Ja atjaunināta pakotnes versija nodrošina pareizu pārlūka ieejas punktu, bet jūsu vecākā versija to nedara, atjaunināšana var būt drošāka nekā konfigurēt fs: false. Tāpat Node orientētas pakotnes aizstāšana ar tādu, kas ir īpaši paredzēta lietošanai pārlūkā, var samazināt saderības trikus un pakotnes sarežģītību.

Izvēlieties šo ceļu, kad: atkarībai ir jādarbojas pārlūkos, bet instalētā versija atlasa vai eksponē tikai Node implementāciju.

Kompromiss: pakotnes atjaunināšana vai aizstāšana var ieviest API izmaiņas, tāpēc palaidiet parastos lietojumprogrammas testus, nevis uzskatiet veiksmīgu kompilāciju par pietiekamu.

5. opcija: Ja izvade ir Node pakotne, iestatiet mērķi uz Node

Dažreiz Webpack vispār nerada pārlūka kodu. Jūs varat būvēt CLI, fona darbinieku, būvēšanas rīku, SSR serveri vai Node servisu. Šajā gadījumā mēģinājums apspiest fs ir pretējs: izpildes vide to faktiski nodrošina.

Webpack oficiālā Mērķu dokumentācija norāda, ka:

module.exports = {
  target: 'node'
}

tulko Node.js līdzīgai videi un atstāj iebūvētos moduļus, piemēram, fs un path, lai Node nodrošinātu tos izpildes laikā.

Webpack detalizētā mērķa konfigurācijas atsauce arī atšķir web, node, Electron mērķus, tīmekļa darbiniekus un citas vides.

Izmantojiet target: 'node', kad: iegūtais JavaScript izpildīsies zem Node.

Neizmantojiet to, lai “labotu” parasto pārlūka SPA: mērķa maiņa nepārvērš pārlūku tā, lai tas pēkšņi nodrošinātu Node failu sistēmas API. Tas maina to, kādu vidi Webpack pieņem, ka izpildīs pakotni.

Uzlabotas Node būves: externals var saglabāt iebūvētos moduļus izpildes laikā

Servera pakotnēm Webpack arī nodrošina Node orientētu externals uzvedību. Tās oficiālā Externals dokumentācija norāda, ka externalsPresets.node var uzskatīt Node iebūvētos moduļus, piemēram, fs, path un vm, par ārējiem un ielādēt tos ar Node izpildes require().

Tāpēc tipiska Node orientēta konfigurācija varētu izskatīties šādi:

module.exports = {
  target: 'node',
  externalsPresets: {
    node: true
  }
}

Tas ir uzlabots servera pakotnes jautājums, nevis pārlūka apvedceļš.

4. solis: Pārbūvējiet, pēc tam pārbaudiet funkciju, kas izraisīja importu

Pēc arhitektūras vai konfigurācijas izmaiņu veikšanas pārbūvējiet:

npm run build
AI ģenerēta termināla ilustrācija, kurā redzama veiksmīga Webpack produkcijas būve pēc fs importa problēmas atrisināšanas
AI ģenerēta ilustrācija par veiksmīgu Webpack pārbūvi. Versiju numuri, resursu izmēri un būvēšanas laiki ir izdomāti piemēri.

Tīra kompilācija pierāda tikai to, ka moduļa atrisināšana bija veiksmīga. Tā nepierāda, ka ietekmētā funkcija uzvedas pareizi. Testējiet atbilstoši izvēlētajam risinājumam:

  • Ja pārvietojāt failu piekļuvi uz serveri, izsauciet pārlūka funkciju un pārbaudiet, vai servera galapunkts atgriež paredzētos datus.
  • Ja iestatījāt fs: false, izpildiet atkarību pārlūkā un pārliecinieties, ka tā nekad neieiet failu sistēmai atkarīgajā zarā.
  • Ja pārslēdzāties uz pakotnes pārlūka būvi, palaidiet pakotnes reālo lietotājam paredzēto darba plūsmu.
  • Ja mainījāt mērķi uz Node, izpildiet būvēto izvadi zem atbalstītās Node versijas.

Bieži sastopamo risinājumu salīdzinājums

RisinājumsDrošs pārlūkam?Saglabā reālu Node failu sistēmas piekļuvi?Kad dot priekšroku
Pārvietot fs darbu uz serveri/APIJāJā, serverīJūsu lietojumprogrammai tiešām ir nepieciešami servera failu sistēmas dati
resolve.fallback.fs = falseTikai, ja fs zars netiek izmantotsNēNeobligāts tikai Node atkarības ceļš
Pārlūkam specifiska pakotne/eksportsJā, ja pakotne to atbalstaNē; tā vietā nodrošina pārlūkam specifisku uzvedībuAtkarība ir paredzēta atbalstīt abas izpildes vides
target: 'node'NēJāPakotne faktiski darbojas Node vidē
Vispārīgs “fs polifills”Atkarīgs no bibliotēkas un semantikasNav ekvivalents patvaļīgai Node failu sistēmas piekļuveiTikai pēc tam, kad esat pārbaudījis precīzo pārlūka uzvedību, kas jums nepieciešama

Īpašs gadījums: kopīgs kods, ko importē gan pārlūka, gan servera pakotnes

Biežs šīs kļūdas avots ir utilītu modulis, kas satur gan tīras funkcijas, gan tikai Node palīgfunkcijas:

// 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')
}

Pat ja jūsu pārlūks importē tikai formatDate, augstākā līmeņa fs imports var piespiest Webpack atrisināt fs. Tīrāks dizains ir sadalīt modulius:

// 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')
}

Tas padara izpildes robežu redzamu moduļu grafā, nevis paļaujas uz tree-shaking vai fallback, lai noņemtu nesaderīgu importu.

Īpašs gadījums: kļūda parādījās pēc atjaunināšanas no Webpack 4

Tas ir viens no klasiskajiem Webpack 5 migrācijas simptomiem. Webpack 4 automātiski piegādāja saderības shims daudziem Node kodola moduļiem. Webpack 5 apzināti pārtrauca to darīt. Ja jūsu kods “strādāja pirms atjaunināšanas”, jautājiet, vai tam tiešām bija nepieciešama Node funkcija pārlūkā, vai vecais bundleris klusi injicēja saderības kodu.

Oficiālā Webpack migrācijas rokasgrāmata iesaka izlasīt būves kļūdas norādījumus par mainītām saderības īpašībām un, kur piemērots, aizstāt veco node.* saderības konfigurāciju ar jaunāko risinātāja pieeju.

Neuzskatiet, ka visu Webpack 4 polifillu atjaunošana ir labākā migrācija. Webpack paša izlaišanas piezīmes iesaka frontend saderīgus moduļus, kur vien iespējams.

Galīgā pašpārbaude

Pirms slēgt problēmu, pārbaudiet šos punktus:

  1. Atrodiet precīzo avota failu vai atkarību, kas importē fs.
  2. Apstipriniet, vai ietekmētā pakotne darbojas pārlūkā vai Node vidē.
  3. Ja tā ir pārlūka pakotne, pārbaudiet, vai funkcijai tiešām ir nepieciešama failu sistēmas uzvedība.
  4. Ja ir, pārvietojiet failu sistēmas darbību aiz servera robežas.
  5. Ja atkarības fs lietojums ir neobligāts un nekad netiek izpildīts pārlūkā, apsveriet resolve.fallback: { fs: false }.
  6. Ja pakotne oficiāli nodrošina pārlūka eksportu, dodiet priekšroku tam, nevis nepieciešamās uzvedības apspiešanai.
  7. Ja pakotne izpildās Node vidē, izmantojiet Node mērķi, nevis tīmekļa mērķi.
  8. Pārbūvējiet un pārliecinieties, ka moduļa atrisināšanas kļūda ir pazudusi.
  9. Palaidiet faktisko funkciju, kas iepriekš ievilka fs; neapstājieties pie “kompilēts veiksmīgi”.

Ilgstošais risinājums ir saskaņot kodu ar tā izpildes vidi. fs pieder Node failu sistēmas videi. Webpack 5 padara šo robežu redzamāku, vairs neinjicējot Node kodola polifillus automātiski. Kad esat nolēmis, vai failu sistēmas darbs pieder serverim, ir neobligāts pārlūkā vai ir daļa no Node mērķa pakotnes, pareizo konfigurāciju kļūst daudz vieglāk izvēlēties.

Atstājiet komentāru

Kā novērst kļūdu "ENOSPC: sasniegts failu vērotāju sistēmas ierobežojums" operētājsistēmā Linux

Kā novērst kļūdu "ENOSPC: sasniegts failu vērotāju sistēmas ierobežojums" operētājsistēmā Linux

Novērsiet Linux ENOSPC failu vērotāja kļūdas, pārbaudot inotify ierobežojumus, atrodot procesus, kuros ir daudz vērotāja resursu, droši paaugstinot ierobežojumus un padarot izmaiņas pastāvīgas.

Kā novērst kļūdu “Tailwind CSS stili netiek atjaunināti” Vite React lietotnē

Kā novērst kļūdu “Tailwind CSS stili netiek atjaunināti” Vite React lietotnē

Novērsiet Tailwind CSS stilu neatjaunināšanu pakalpojumā Vite React, pārbaudot Tailwind v4 iestatījumus, CSS importēšanu, avota noteikšanu, dinamiskās klases, HMR un novecojušas kešatmiņas.

Kā novērst ModuleNotFoundError kļūdu: Python 3 nav moduļa ar nosaukumu “pip”

Kā novērst ModuleNotFoundError kļūdu: Python 3 nav moduļa ar nosaukumu “pip”

Novērsiet Python 3 ModuleNotFoundError kļūdu pip funkcijai operētājsistēmās Windows, macOS un Linux, izmantojot ensurepip, OS pakotnes, virtuālās vides un interpretētāja pārbaudes.

Kā GitHub SSH novērst kļūdu "Atļauja liegta (publiskā atslēga)"

Kā GitHub SSH novērst kļūdu "Atļauja liegta (publiskā atslēga)"

Novērsiet GitHub SSH atļaujas liegšanu (publiskā atslēga), pārbaudot resursdatoru, aktīvo SSH atslēgu, GitHub kontu, SSO autorizāciju, attālo URL un 22. porta piekļuvi.

Kā novērst kļūdu “Git Push noraidīts: nepārtīšana uz priekšu”, nezaudējot izmaiņas

Kā novērst kļūdu “Git Push noraidīts: nepārtīšana uz priekšu”, nezaudējot izmaiņas

Droši izlabojiet Git ne-ātrās pārtīšanas kļūdu. Aizsargājiet lokālo darbu, ielādējiet attālinātus izmaiņu izmaiņu ierakstus, izvēlieties apvienošanu vai atkārtotu bāzi, atrisiniet konfliktus un veiciet izmaiņu pārtīšanu, nezaudējot izmaiņas.

Kā novērst kļūdu "Nginx 502 Bad Gateway", veicot starpniekservera darbību ar Node.js

Kā novērst kļūdu "Nginx 502 Bad Gateway", veicot starpniekservera darbību ar Node.js

Izlabojiet Nginx 502 Bad Gateway kļūdas ar Node.js augšupējo resursu, pārbaudot lietotnes portu, NGINX žurnālus, proxy_pass adresi, konteineru tīklošanu, taimautus un atkārtotu ielādi.

Kā TypeScript labot kļūdu “Type 'null' nav piešķirams tipam”

Kā TypeScript labot kļūdu “Type 'null' nav piešķirams tipam”

Novērsta TypeScript kļūda “Tips 'null' nav piešķirams tipam”, izmantojot apvienošanas tipus, sašaurināšanu, noklusējuma vērtības un drošas apgalvojumus, izmantojot strictNullChecks.

Kā novērst kļūdu “Prisma Client has not been generated yet”

Kā novērst kļūdu “Prisma Client has not been generated yet”

Novērsiet Prisma Client ģenerēšanas kļūdu, pārbaudot savu ģeneratoru, shēmu, izvades ceļu, importus, versijas, monorepo iestatījumu un izvietošanas būvēšanas soļus.

Kā novērst kļūdu "ERR_MODULE_NOT_FOUND" Node.js ESM importā

Kā novērst kļūdu "ERR_MODULE_NOT_FOUND" Node.js ESM importā

Izlabojiet Node.js ERR_MODULE_NOT_FOUND kļūdu ESM, pārbaudot importēšanas ceļus, failu paplašinājumus, pakotņu instalēšanu, eksportēšanu, ESM režīmu un tīrās instalācijas.

Kā novērst SSL sertifikāta problēmu: Nevar iegūt vietējo izdevēja sertifikātu Git

Kā novērst SSL sertifikāta problēmu: Nevar iegūt vietējo izdevēja sertifikātu Git

Novērsiet Git kļūdu “nevar iegūt vietējo izdevēja sertifikātu”, identificējot uzticības aizmugurprogrammu, instalējot pareizo CA ķēdi un saglabājot SSL verifikāciju iespējotu.