Dobbelt ESM- og CJS-package-output
Generér både ES-module- og CommonJS-builds med korrekt konfiguration af exports-feltet i package.json.
Dobbelt ESM- og CJS-package-output er en gratis React Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i React Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. React Academy-kurset indeholder 4 lektioner i alt.
Hvad er ESM?
ESM (ECMAScript Modules) er den officielle JavaScript-modulstandard, der bruger syntaksen import og export. ESM kan analyseres statisk — bundlere kan på byggetidspunktet præcist afgøre, hvilke eksporter der bruges, så tree-shaking bliver mulig. Moderne browsere og Node.js understøtter begge ESM indbygget.
Hvad er CJS?
CJS (CommonJS) bruger syntaksen require() og module.exports. Det var Node.js' oprindelige modulsystem og er stadig nødvendigt af hensyn til kompatibilitet med ældre Node.js-miljøer, Jest (som historisk brugte CJS) og kode, der bruger require(). CJS evalueres dynamisk, hvilket gør tree-shaking vanskeligere.
Dobbeltpakke: Udgiv begge formater
En moderne npm-pakke bør levere både ESM og CJS for at maksimere kompatibiliteten. ESM-brugere (Vite, Next.js og moderne bundlere) får importer, der kan tree-shakes. CJS-brugere (ældre Node.js-scripts og Jest uden konfiguration) får kompatibilitet med require(). Feltet exports i package.json fortæller Node og bundlere, hvilket format der skal bruges.
Feltet exports
Feltet exports i package.json er den moderne måde at definere betingede indgangspunkter på. Eksempel: { '.': { 'import': './dist/esm/index.js', 'require': './dist/cjs/index.js', 'types': './dist/esm/index.d.ts' } }. Bundlere og Node.js 12+ læser exports for automatisk at vælge det korrekte format.
Ældre felter: main og module
Ældre værktøjer forstår ikke feltet exports. Af hensyn til kompatibiliteten skal du også angive: main, der peger på CJS-resultatet (ældre Node require-tilbagefald), og module, der peger på ESM-resultatet (et tip til webpack/rollup, ikke standardiseret, men bredt understøttet). Moderne værktøjer foretrækker exports, mens ældre værktøjer falder tilbage til main/module.
Konsekvenser af type: module
Hvis du angiver "type": "module" i package.json, behandles alle .js-filer i pakken som ESM. Hvis du udgiver i begge formater, skal du derfor bruge eksplicitte filendelser: Brug .mjs til ESM-filer og .cjs til CJS-filer, når type er module, eller omvendt. tsup håndterer dette automatisk.
.mjs- og .cjs-udvidelser
Ved eksplicit at bruge filendelserne .mjs (ESM) og .cjs (CJS) markeres formatet uanset type-feltet. Det fjerner tvetydighed. tsup kan producere: index.js (ESM) og index.cjs (CJS), når format er ['esm', 'cjs'], og intet type-felt er angivet, hvilket følger den mest udbredte konvention.
Risikoen ved dobbeltpakker
Når en pakke leverer både ESM- og CJS-formater, kan brugerens bundler indlæse begge versioner i samme proces — f.eks. ESM-versionen til hovedappen og CJS-versionen til en Jest-test. Hvis pakken har tilstand på modulniveau (f.eks. en React-kontekst), har begge instanser uafhængig tilstand. Dette er risikoen ved dobbeltpakker.
Sådan mindsker du risikoen ved dobbeltpakker
For at mindske risikoen skal du holde tilstand på modulniveau ude af biblioteket (ingen singleton-mønstre), bruge betingelserne i exports præcist for at sikre, at kun ét format indlæses, og dokumentere, at tests skal konfigurere deres bundler til at bruge ESM. Risikoen er primært relevant for biblioteker med delte singletoner.
Test af begge resultatformater
Kontrollér, at begge formater fungerer efter bygningen. Test CJS: node -e "const lib = require('./dist/cjs/index.js'); console.log(lib)". Test ESM: node --input-type=module --eval "import { Component } from './dist/esm/index.js'; console.log(Component)". Begge bør kunne indlæses uden fejl, før pakken publiceres.
exports til flere indgangspunkter
Feltet exports understøtter flere indgangspunkter: { '.': { import: './dist/esm/index.js', require: './dist/cjs/index.js' }, './utils': { import: './dist/esm/utils.js', require: './dist/cjs/utils.js' } }. Brugerne kan derefter importere fra 'your-lib' eller 'your-lib/utils' og får det korrekte format.
Feltet package.json exports
Hvad er det primære formål med feltet exports i et biblioteks package.json?
Opsummering af lektionen: resultat for dobbeltpakker
ESM bruger import/export og muliggør tree-shaking. CJS bruger require() af hensyn til Node.js-kompatibilitet. Udgiv begge via feltet exports i package.json med betingelserne import/require. Ældre tilbagefald: main (CJS) og module (ESM). Brug .mjs/.cjs-udvidelser eller type: module til eksplicit markering af formatet. Test begge formater med node CLI efter bygningen. Vær opmærksom på risikoen ved dobbeltpakker, når der bruges singleton-tilstand.
Lær React med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 88
- Lektioner
- 324
Ofte stillede spørgsmål
Er lektionen “Dobbelt ESM- og CJS-package-output” gratis?
Ja — hele teksten til “Dobbelt ESM- og CJS-package-output” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af React Academy-kurset, skal du opgradere til CoddyKit PRO. React Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Dobbelt ESM- og CJS-package-output”?
Generér både ES-module- og CommonJS-builds med korrekt konfiguration af exports-feltet i package.json. Du øver dig i React Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på React Academy?
Der kræves ingen tidligere erfaring. React Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Dobbelt ESM- og CJS-package-output”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne React Academy-lektion?
Ja. Alle React Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Bundling med Rollup og tsup til biblioteker
- Dobbelt ESM- og CJS-package-output
- Peer-afhængigheder og tree shaking
- Udgivelse til npm og semantisk versionering