Ako opraviť chybu „ERR_MODULE_NOT_FOUND“ v importoch Node.js ESM

ERR_MODULE_NOT_FOUNDznamená, že Node.js dosiahol zavádzač modulov ECMAScript a nedokázal vyriešiť modul požadovaný import, import()alebo vstupným bodom programu. V aktuálnej dokumentácii Node.js je táto chyba konkrétne definovaná ako zlyhanie vyriešenia zavádzača ESM; analogická chyba CommonJS je MODULE_NOT_FOUND. Pozrite si oficiálnu referenciu chýb Node.js.

Najrýchlejšou opravou je identifikovať, aký typ špecifikátora zlyhal, predtým ako čokoľvek zmeníte. Relatívny import, napríklad , ./utils/logger.jssa riadi inými pravidlami ako import balíka, napríklad lodash. Node.js ESM sa tiež rieši inak ako CommonJS: relatívny import vyžaduje explicitné prípony súborov a indexy adresárov sa nehádajú automaticky. Tieto rozdiely vysvetľujú mnohé zlyhania po prechode z . require()na import.

Čo presne Node.js nedokáže nájsť?

Začnite s prvým riadkom chyby, nie s celým sledovaním zásobníka. Zvyčajne vám to prezradí neriešený cieľ aj súbor, ktorý sa ho pokúsil importovať. Zaraďte zlyhávajúci špecifikátor do jednej z týchto skupín:

  • Relatívny súbor: ./utils/logger.js alebo ../config.js.
  • Absolútny súbor alebo URL adresa súboru: absolútna cesta alebo file:URL adresa.
  • Holý balík: lodash , express, alebo @scope/pkg.
  • Podcesta balíka: some-package/feature.js .
  • Alias ​​importu balíka: interný špecifikátor začínajúci na #, definovaný prostredníctvom package.json "imports".
Terminál zobrazuje chybu Node.js ERR_MODULE_NOT_FOUND pre chýbajúci balík lodash
Najprv si prečítajte prvý riadok s chybou: tento príklad identifikuje holý názov balíka, takže ďalšie kontroly by sa mali zamerať na inštaláciu závislostí a rozlíšenie balíkov.

Oficiálna dokumentácia k modulom Node.js ECMAScript oddeľuje relatívne, holé a absolútne špecifikátory, pretože sa neriešia rovnakým spôsobom. Keď zistíte, ktorá kategória zlyhala, vyhnite sa náhodným opravám, ako je vymazanie node_modulesalebo zmena, package.jsonkým na to dôkazy neukazujú.

Obsahuje lokálny import ESM skutočnú príponu súboru?

Pre relatívne a absolútne špecifikátory ESM vyžaduje Node.js príponu súboru. Nevyhľadáva .js, .mjsalebo .jsonpo neúspešnom relatívnom importe. Aktuálna dokumentácia Node.js nazýva toto pravidlo povinnými príponami súborov a tiež uvádza, že indexy adresárov musia byť úplne zadané.

Ak je súbor na disku src/utils/logger.js, toto je bezpečný formulár ESM:

import { logger } from './utils/logger.js';

Nie:

import { logger } from './utils/logger';
Editor kódu porovnávajúci import ESM bez prípony s importom končiacim na .js
Node.js ESM nevykonáva vyhľadávanie prípon pre relatívne importy. Skutočnú príponu súboru napíšte do špecifikátora modulu.

Toto je jeden z najdôležitejších rozdielov oproti rozlíšeniu CommonJS. Oficiálna dokumentácia balíkov Node.js vysvetľuje, že require()je možné vyskúšať rozšírenia a priečinky, zatiaľ čo zavádzač ESM nevykonáva vyhľadávanie rozšírení.

Importujete adresár namiesto skutočného súboru?

Projekt CommonJS sa mohol spoliehať na import adresára, ktorý nakoniec načítal súbor index.js. Nepredpokladajte, že zavádzač ESM urobí to isté. Ak je vaša štruktúra:

src/
  config/
    index.js
  app.js

uprednostňujem:

import config from './config/index.js';

skôr než:

import config from './config';
Terminál zobrazuje chybu ERR_MODULE_NOT_FOUND pre import lokálnych nástrojov bez rozšírenia
Lokálne zlyhanie pri riešení zvyčajne ukazuje na presnú neriešenú cestu. Skontrolujte cestu, príponu a či import smeruje do adresára a nie do súboru.

Oficiálna dokumentácia ESM uvádza, že indexy adresárov, ako napríklad , ./startup/index.jsmusia byť úplne špecifikované. Ak pridanie rozšírenia stále zlyhá, porovnajte každý segment cesty so skutočným stromom adresárov.

Naozaj projekt funguje ako ESM?

Node.js podporuje moduly CommonJS aj ECMAScript. Pre .jssúbory je najjasnejším ukazovateľom na úrovni balíka:

{
  "type": "module"
}

Súbory končiace na sa .mjsvždy považujú za moduly ES, zatiaľ čo súbory končiace na sa .cjsvždy považujú za moduly CommonJS. Aktuálne verzie Node.js dokážu tiež rozpoznať syntax ESM v niektorých nejednoznačných súboroch, ale dokumentácia Node.js odporúča explicitné značky balíkov, pretože sú jasnejšie pre Node.js, nástroje a budúcu údržbu.

Editor súboru Package.json zobrazujúci modul typu a položku závislosti
Skontrolujte najbližší riadiaci súbor package.json. Hodnota typu najvyššej úrovne module spôsobí, že súbory .js v danom balíku budú používať sémantiku ESM.

Pred zmenou si prečítajte oficiálne pravidlá pre balíky a typy modulov"type" . Zmena balíka z CommonJS na ESM môže ovplyvniť viacero súborov naraz. Pamätajte tiež, že pridanie "type": "module"neinštaluje chýbajúcu závislosť ani neopravuje nesprávnu cestu; určuje iba to, ako .jssa interpretujú relevantné súbory.

Je chýbajúci balík v tomto projekte skutočne nainštalovaný?

Ak chyba pomenuje holý balík, napríklad lodash, skontrolujte strom závislostí namiesto predpokladu, že ho sprístupňuje globálne nainštalovaný balík alebo iný pracovný priestor.

npm ls lodash

Aktuálna dokumentácia npm pre npm ls uvádza, že príkaz vypíše nainštalované verzie balíkov a môže hlásiť chýbajúce alebo neplatné závislosti. Ak je balík priamou závislosťou za behu a nie je nainštalovaný, nainštalujte ho do správneho projektu:

npm install lodash
Terminál zobrazujúci npm list lodash vracia prázdny a npm install lodash pridáva balík
V prípade importu holého balíka overte, či sa balík nachádza v aktuálnom strome závislostí, pred zmenou syntaxe ESM.

Oficiálna dokumentácia k inštalácii npm vysvetľuje, že bežná inštalácia projektu umiestňuje závislosti do lokálneho node_modulesstromu a štandardne ukladá explicitne nainštalované balíky do dependencies.

V monorepozitári spustite kontrolu v pracovnom priestore, ktorý vlastní importovaný súbor. Inštalácia balíka inde v repozitári automaticky neznamená, že aktuálny balík má platnú deklarovanú závislosť.

Je názov balíka správny, ale podcesta nesprávna?

Balík môže existovať a stále odmietnuť hlboký import. Moderné balíky môžu definovať "exports"mapu vo svojom poli package.json. Keď toto pole existuje, Node.js povoľuje iba verejné vstupné body deklarované v ňom. Oficiálna dokumentácia k vstupným bodom balíka Node.js uvádza, že "exports"má prednosť pred "main"v podporovaných verziách Node.js a zapuzdruje neuvedené podcesty.

Predpokladajme, že závislosť dokumentuje tento verejný import:

import { parse } from 'example-package/parser';

Nenahrádzajte ho uhádnou vnútornou cestou, ako napríklad:

import { parse } from 'example-package/dist/internal/parser.js';
Editor Package.json zobrazujúci balík ESM a závislosť od lodash
Skontrolujte metadáta nainštalovaného balíka, keď sa holý balík rozlúšti, ale podcesta nie. Verejné podcesty sú riadené mapou exportov balíka, ak je k dispozícii.

Zablokovaná "exports"podcesta často vytvára ERR_PACKAGE_PATH_NOT_EXPORTEDnamiesto ERR_MODULE_NOT_FOUND. Táto zmena v chybovom kóde je užitočným dôkazom: znamená to, že Node.js našiel balík, ale požadovaná cesta nie je súčasťou jeho verejného rozhrania. Namiesto obchádzania zapuzdrenia použite zdokumentovanú cestu importu balíka.

Mohla by sa cesta líšiť iba pravopisom alebo veľkosťou písmen?

Skontrolujte skutočný znak v strome súborov. Importy, ktoré zdanlivo fungujú na vývojovom súborovom systéme bez rozlišovania malých a veľkých písmen, môžu po nasadení do súborového systému rozlišujúceho malé a veľké písmená zlyhať.

Napríklad, ak je skutočný súbor:

src/utils/Logger.js

potom import:

import logger from './utils/logger.js';

nie je prenosný, pretože Logger.jsa logger.jsmôžu mať rôzne názvy súborov.

Prieskumník projektu zobrazujúci adresár src s utils, helper.js, index.js a app.js
Porovnajte import so skutočným adresárovým stromom. Overte každý názov priečinka, názov súboru, príponu a veľkosť písmena.

Taktiež overte, či je import relatívny vzhľadom na importujúci modul , nie vzhľadom na aktuálny adresár shellu. Relatívne špecifikátory ESM sa rozpoznávajú vzhľadom na URL adresu modulu importujúceho súboru.

Ako môžete vidieť, čo by Node.js vyriešil?

V module ES import.meta.resolve()môže pomôcť skontrolovať rozlíšenie:

console.log(import.meta.resolve('./utils/logger.js'));
console.log(import.meta.resolve('lodash'));

Oficiálna referencia Node.js ESM opisuje import.meta.resolve(specifier)funkciu relatívneho rozlišovania modulov, ktorá vracia absolútny reťazec URL a rešpektuje rozlíšenie balíkov a povolené exporty.

Existuje dôležité upozornenie týkajúce sa aktuálnej verzie: pre relatívny file:cieľ import.meta.resolve()môže vrátiť URL adresu, aj keď zodpovedajúci lokálny súbor neexistuje. Použite ho na zodpovedanie otázky „Na aký cieľ uzol prekladá tento špecifikátor?“ a potom overte, či výsledný súbor skutočne existuje. V prípade chýbajúcich holých balíkov alebo neplatných mapovaní balíkov môže samotné prekladanie odhaliť chybu skôr.

Mali by ste odstrániť node_modules a lockfile?

Nie ako prvá odpoveď. Chýbajúce rozšírenie, nesprávna lokálna cesta alebo nepodporovaná podcesta balíka sa neopravia preinštalovaním závislostí.

Ak npm lshlási nekonzistentný strom, projekt má potvrdenú inštaláciu package-lock.jsona chcete reprodukovateľnú čistú inštaláciu, použite:

npm ci

Aktuálna dokumentácia npm ci uvádza, že npm civyžaduje existujúci lockfile, node_modulesautomaticky odstráni existujúci adresár, nainštaluje uzamknutý strom a neprepisuje package.jsonlockfile. Ak package.jsonsa a lockfile nezhodujú, ukončí sa namiesto tichej aktualizácie zámku.

Vyhnite sa mazaniu package-lock.jsonlen preto, aby chyba zmizla. To môže spôsobiť vyriešenie nového grafu závislostí a zmeniť chybu pri riešení modulov na zmenu verzie závislosti.

Aké je najrýchlejšie poradie riešenia problémov?

Aké sú názvy chýbNajprv skontrolujteTypická oprava
./local/pathPresná cesta a rozšíreniePridajte .js/ .mjsa opravte relatívnu cestu
AdresárČi ste očakávaliindex.js./directory/index.jsExplicitný import
package-namenpm ls package-nameNainštalujte alebo správne deklarujte závislosť
package-name/subpathBalík "exports"a oficiálna dokumentácia k balíkuPoužite exportovanú verejnú podcestu
Cesta, ktorá vyzerá správneVeľké a malé písmená názvu súboru a skutočný strom projektuPresne zhodujte súborový systém
Zlyhá iba jedno prostredieLockfile, pracovný priestor, verzia uzla, prípad súborového systémuReprodukovať s rovnakým deklarovaným stromom závislostí

Čomu by ste sa mali vyhnúť pri slepých zmenách?

  • Nepridávajte "type": "module"len preto, že import zlyhal; najskôr potvrďte zamýšľaný systém modulov projektu.
  • Neodstraňujte prípony súborov, aby ste napodobnili príklady CommonJS. Node.js ESM vyžaduje explicitné prípony pre relatívne a absolútne špecifikátory súborov.
  • Neimportujte hlboko súkromné ​​súbory zo závislosti, ak jej "exports"mapa poskytuje podporovaný verejný vstupný bod.
  • Nepredpokladajte, že úspešná globálna inštalácia npm sprístupní závislosť lokálnej aplikácii.
  • Neodstraňujte uzamykateľný súbor ako rutinný krok čistenia vyrovnávacej pamäte.
  • Nepredpokladajte, že pracovný adresár riadi relatívne importy ESM; základom je importujúci modul.

Ako viete, že oprava je dokončená?

Znovu spustite ten istý vstupný bod, ktorý pôvodne zlyhal, a overte, či sa modul vyriešil bez nahradenia chyby iným problémom s riešením. Potom spustite bežné testy projektu alebo príkaz spustenia, aby ste vedeli, že oprava funguje aj po jednom príkaze importu.

Terminál zobrazujúci inštaláciu balíka a následne úspešné spustenie Node.js
Po oprave základného problému s riešením znova spustite pôvodný príkaz a potom bežný testovací alebo spúšťací pracovný postup projektu.

Ak aplikácia teraz narazí na inú chybu, ako napríklad ERR_PACKAGE_PATH_NOT_EXPORTED, ERR_UNKNOWN_FILE_EXTENSIONalebo chybu s názvom exportu, nepovažujte to za rovnaký problém. Znamená to, že riešenie modulov pokročilo ďalej a Node.js teraz hlási špecifickejšiu nekompatibilitu.

Zrátané a podčiarknuté

V prípade Node.js ESM ERR_MODULE_NOT_FOUNDsa problém zvyčajne rieši sledovaním presného špecifikátora, a nie preinštalovaním všetkého. Lokálne súbory potrebujú explicitné prípony a explicitné indexy adresárov. Holé balíky musia byť nainštalované v správnom strome závislostí. Podcesty balíkov musia rešpektovať "exports". Riadiaci prvok package.jsonsa musí zhodovať so zamýšľaným systémom modulov a názvy súborov sa musia presne zhodovať so súborovým systémom.

Keď k chybe pristupujete v tomto poradí – typ špecifikátora, skutočná cesta, pravidlá ESM, strom závislostí, exporty balíkov a potom čistá inštalácia – zvyčajne dokážete príčinu rýchlo identifikovať bez zavedenia nesúvisiacich zmien.

Zanechať komentár

Ako opraviť chybu „CSS štýly Tailwind sa neaktualizujú“ v aplikácii Vite React

Ako opraviť chybu „CSS štýly Tailwind sa neaktualizujú“ v aplikácii Vite React

Opravte neaktualizované štýly CSS v Tailwind vo Vite React kontrolou nastavenia Tailwind v4, importu CSS, detekcie zdrojov, dynamických tried, HMR a zastaraných vyrovnávacích pamätí.

Ako opraviť ModuleNotFoundError: V Pythone 3 neexistuje modul s názvom „pip“

Ako opraviť ModuleNotFoundError: V Pythone 3 neexistuje modul s názvom „pip“

Oprava chyby ModuleNotFoundError v jazyku Python 3 pre príkaz pip v systémoch Windows, macOS a Linux pomocou nástroja ensurepip, balíkov operačného systému, virtuálnych prostredí a kontrol interpretov.

Ako opraviť chybu „Oprávnenie zamietnuté (verejný kľúč)“ v GitHub SSH

Ako opraviť chybu „Oprávnenie zamietnuté (verejný kľúč)“ v GitHub SSH

Opravte chybu „Oprávnenie GitHub SSH zamietnuté (verejný kľúč)“ kontrolou hostiteľa, aktívneho kľúča SSH, účtu GitHub, autorizácie SSO, vzdialenej adresy URL a prístupu na port 22.

Ako opraviť chybu „Git Push Rejected: Non-FastForward“ bez straty zmien

Ako opraviť chybu „Git Push Rejected: Non-FastForward“ bez straty zmien

Bezpečne opravte nerýchle pretáčanie zmien v Gite. Chráňte lokálnu prácu, načítajte vzdialené commity, vyberte zlúčenie alebo rebase, vyriešte konflikty a odošlite zmeny bez straty.

Ako opraviť chybu „Nginx 502 Bad Gateway“ pri proxyovaní do Node.js

Ako opraviť chybu „Nginx 502 Bad Gateway“ pri proxyovaní do Node.js

Opravte chyby Nginx 502 Bad Gateway s Node.js upstream kontrolou portu aplikácie, protokolov NGINX, adresy proxy_pass, siete kontajnerov, časových limitov a opätovného načítania.

Ako opraviť chybu „Typ 'null' nie je priraditeľný k typu“ v TypeScripte

Ako opraviť chybu „Typ 'null' nie je priraditeľný k typu“ v TypeScripte

Oprava chyby „Typ 'null' nie je možné priradiť k typu“ v jazyku TypeScript pomocou typov zjednotenia, zúženia, predvolených hodnôt a bezpečných tvrdení v rámci strictNullChecks.

Ako opraviť chybu „Prisma Client has not been generated yet“

Ako opraviť chybu „Prisma Client has not been generated yet“

Opravte chybu nevygenerovaného Prisma Client kontrolou generátora, schémy, výstupnej cesty, importov, verzií, nastavenia monorepa a krokov zostavenia pri nasadení.

Ako opraviť chybu „ERR_MODULE_NOT_FOUND“ v importoch Node.js ESM

Ako opraviť chybu „ERR_MODULE_NOT_FOUND“ v importoch Node.js ESM

Opravte chybu Node.js ERR_MODULE_NOT_FOUND v ESM kontrolou ciest importu, prípon súborov, inštalácie balíkov, exportov, režimu ESM a čistých inštalácií.

Ako vyriešiť problém so SSL certifikátom: Unable to get local issuer certificate v Git

Ako vyriešiť problém so SSL certifikátom: Unable to get local issuer certificate v Git

Vyriešte chybu Git 'unable to get local issuer certificate' identifikáciou dôveryhodného backendu, inštaláciou správneho reťazca CA a ponechaním zapnutej SSL verifikácie.

Ako opraviť chybu časového limitu siete MongoDB v pripojení Mongoose

Ako opraviť chybu časového limitu siete MongoDB v pripojení Mongoose

Opravte chyby časového limitu siete MongoDB v Mongoose identifikáciou typu časového limitu, testovaním dosiahnuteľnosti Atlasu alebo TCP, opravou URI a ladením časových limitov len v odôvodnených prípadoch.