ESM- og CJS-utdata i samme pakke
Generer både ES-modul- og CommonJS-bygg med riktig konfigurasjon av exports-feltet i package.json.
ESM- og CJS-utdata i samme pakke er en gratis leksjon i React Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i React Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i React Academy inneholder totalt 4 leksjoner.
Hva er ESM?
ESM (ECMAScript Modules) er den offisielle JavaScript-modulstandarden som bruker syntaksen import og export. ESM kan analyseres statisk – bundlere kan fastslå nøyaktig hvilke eksporter som brukes under byggingen, noe som muliggjør tree-shaking. Moderne nettlesere og Node.js støtter ESM innebygd.
Hva er CJS?
CJS (CommonJS) bruker syntaksen require() og module.exports. Det var Node.js sitt opprinnelige modulsystem og trengs fortsatt for kompatibilitet med eldre Node.js-miljøer, Jest (som historisk brukte CJS) og kode som bruker require(). CJS evalueres dynamisk, noe som gjør tree-shaking vanskeligere.
Dual package: levere begge formater
En moderne npm-pakke bør leveres i både ESM- og CJS-format for å maksimere kompatibiliteten. Brukere av ESM (Vite, Next.js og moderne bundlere) får importer som kan tree-shakes. Brukere av CJS (eldre Node.js-skript og Jest uten konfigurasjon) får kompatibilitet med require(). Feltet exports i package.json forteller Node og bundlere hvilket format som skal brukes.
Feltet exports
Feltet exports i package.json er den moderne måten å definere betingede inngangspunkter på. Eksempel: { '.': { 'import': './dist/esm/index.js', 'require': './dist/cjs/index.js', 'types': './dist/esm/index.d.ts' } }. Bundlere og Node.js 12+ leser exports for å velge riktig format automatisk.
Feltene main og module for eldre verktøy
Eldre verktøy forstår ikke feltet exports. For kompatibilitet bør du også angi: main, som peker på CJS-utdataene (reserveordning for eldre Node require), og module, som peker på ESM-utdataene (et hint til webpack/rollup, ikke-standardisert, men bredt støttet). Moderne verktøy foretrekker exports, mens eldre verktøy faller tilbake til main/module.
Konsekvenser av type: module
Hvis du setter "type": "module" i package.json, behandles alle .js-filer i pakken som ESM. Hvis du leverer begge formater, trenger du derfor eksplisitte filendelser: bruk .mjs for ESM-filer og .cjs for CJS-filer når type er module, eller omvendt. tsup håndterer dette automatisk.
Filendelsene .mjs og .cjs
Bruk av filendelsene .mjs (ESM) og .cjs (CJS) markerer formatet eksplisitt, uavhengig av type-feltet. Dette unngår tvetydighet. tsup kan produsere: index.js (ESM) og index.cjs (CJS) når format er ['esm', 'cjs'] og ingen type-felt er angitt, i tråd med den vanligste konvensjonen.
Faren ved dual package
Når en pakke tilbyr både ESM- og CJS-formater, kan brukerens bundler laste inn begge versjonene i samme prosess – for eksempel ESM-versjonen for hovedappen og CJS-versjonen for en Jest-test. Hvis pakken har tilstand på modulnivå (for eksempel en React-kontekst), har begge instansene uavhengig tilstand. Dette er faren ved dual package.
Redusere faren ved dual package
Du kan redusere faren på følgende måter: Hold tilstand på modulnivå utenfor biblioteket (unngå singleton-mønstre), bruk exports-betingelsene presist for å sikre at bare ett format lastes inn, og dokumenter at tester bør konfigureres til å bruke ESM. Faren er hovedsakelig relevant for biblioteker med delte singletons.
Teste begge utdataformatene
Kontroller at begge formatene fungerer etter byggingen. 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 løses uten feil før publisering.
exports for flere inngangspunkter
Feltet exports støtter flere inngangspunkter: { '.': { import: './dist/esm/index.js', require: './dist/cjs/index.js' }, './utils': { import: './dist/esm/utils.js', require: './dist/cjs/utils.js' } }. Brukerne kan deretter importere fra 'your-lib' eller 'your-lib/utils' og få riktig format.
exports-feltet i package.json
Hva er hovedformålet med feltet exports i et biblioteks package.json?
Oppsummering av leksjonen: Dual package-utdata
ESM bruker import/export og muliggjør tree-shaking. CJS bruker require() for kompatibilitet med Node.js. Lever begge formatene via exports-feltet i package.json, med betingelsene import/require. Eldre reserveordninger: main (CJS) og module (ESM). Bruk .mjs/.cjs-filendelser eller type: module for å markere formatet eksplisitt. Test begge formatene med node CLI etter byggingen. Vær oppmerksom på faren ved dual package når du har singleton-tilstand.
Lær deg React med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 88
- Leksjoner
- 324
Ofte stilte spørsmål
Er leksjonen «ESM- og CJS-utdata i samme pakke» gratis?
Ja – hele teksten i «ESM- og CJS-utdata i samme pakke» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av React Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i React Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «ESM- og CJS-utdata i samme pakke»?
Generer både ES-modul- og CommonJS-bygg med riktig konfigurasjon av exports-feltet i package.json. Du øver på React Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med React Academy?
Ingen tidligere erfaring er nødvendig. React Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «ESM- og CJS-utdata i samme pakke»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne React Academy-leksjonen?
Ja. Alle React Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Pakking med Rollup og tsup for biblioteker
- ESM- og CJS-utdata i samme pakke
- Peer-avhengigheter og tree shaking
- Publisering til npm og semantisk versjonering