Stabilitet: 2 – Stabil

Introduksjon#

ECMAScript moduler er den offisielle standard format for å pakke JavaScriptcode for gjenbruk. Modulene er definert ved hjelp av et utvalg av import ogexport uttalelser.

følgende eksempel på en ES-modul eksport funksjon:

// addTwo.mjsfunction addTwo(num) { return num + 2;}export { addTwo };

følgende eksempel på en ES-modul import funksjonen fra addTwo.mjs:

// app.mjsimport { addTwo } from './addTwo.mjs';// Prints: 6console.log(addTwo(4));

– Noden.,js støtter fullt ut ECMAScript moduler som de er i dag angitt andprovides interoperabilitet mellom dem og de opprinnelige modul-format,CommonJS.

Aktiverer#

– Noden.js behandler JavaScript-kode som CommonJS modulene som standard.Forfattere kan fortelle Node.js å behandle JavaScript-kode som ECMAScript modulesvia .mjs file extension, package.json "type" – feltet, eller--input-type flagg. SeeModules: Pakker for moredetails.

Pakker#

Denne delen ble flyttet til Moduler: – Pakker.,

importer Specifiers#

Terminologi#

Den specifier av en import uttalelse er strengen etter from søkeord,f.eks. 'path' i import { sep } from 'path'. Specifiers er også brukt iexport from uttalelser, og som argument til en import() uttrykk.

Det er tre typer specifiers:

  • i Forhold specifiers som './startup.js' eller '../config.mjs'. De referto en bane i forhold til plasseringen av å importere filen., Filen extensionis alltid nødvendig for disse.

  • Nakne specifiers som 'some-package' eller 'some-package/shuffle'. De canrefer til de viktigste inngangspunkt av en pakke med pakken navn, eller aspecific funksjonen modul i en pakke som inneholder et prefiks med pakken navn som perthe eksempler henholdsvis. Inkludert filtypen er bare necessaryfor pakker uten en "exports" – feltet.

  • Absolutt specifiers som 'file:///opt/nodejs/config.js'. De referdirectly og eksplisitt til en full bane.,

Nakne specifier vedtak blir behandlet av Noden.js-modul resolutionalgorithm. Alle andre specifier vedtak er alltid bare løst withthe standard relative URL-oppløsning semantikk.

Som i CommonJS, modul-filer i pakker kan nås ved å legge sti til pakken navn med mindre pakken package.json inneholder en"exports" – feltet, og i så fall filer i pakker kan bare være accessedvia baner som er definert i "exports".,

For detaljer om disse pakken oppløsning regler som gjelder bart specifiers i Noden.js-modul oppløsning, kan du se pakker dokumentasjon.

Obligatorisk filen-utvidelser#

En file extension må oppgis når du bruker import søkeord for å resolverelative eller absolutt specifiers. Katalogen indekser (f.eks. './startup/index.js')må også være fullt ut beskrevet.

Dette problemet kamper hvordan import oppfører seg i nettleseren miljøer, forutsatt atypically konfigurert server.,

Nettadresser#

ES moduler er løst, og lagret som Nettadresser. Dette betyr at filer containingspecial tegn, for eksempel # og ? trenger å være rømt.

file: Nettadresser#

Moduler er lastet flere ganger hvis import specifier brukes til å resolvethem har en annen spørring eller fragment.

import './foo.mjs?query=1'; // loads ./foo.mjs with query of "?query=1"import './foo.mjs?query=2'; // loads ./foo.mjs with query of "?query=2"

volumet rot kan bli referert til via /, // eller file:///., Gitt thedifferences mellom URL og bane oppløsning (for eksempel prosent encodingdetails), er det anbefalt å bruke url -.pathToFileURL når du importerer en bane.

data: Import#

Lagt inn: v12.10.,0

data: url-er som har støtte for import med følgende MIME-typer:

  • text/javascript for ES Moduler
  • application/json for JSON
  • application/wasm for Wasm

data: Nettadresser bare løse Bart specifiers for innebygde modulesand Absolutt specifiers. ResolvingRelative specifiers fungerer ikke fordi data: er ikke aspecial ordningen., For example, attempting to load ./foofrom data:text/javascript,import "./foo"; fails to resolve because thereis no concept of relative resolution for data: URLs. An example of a data:URLs being used is:

import 'data:text/javascript,console.log("hello!");';import _ from 'data:application/json,"world!"';

node: Imports#

Added in: v14.13.1

node: URLs are supported as an alternative means to load Node.js builtinmodules. This URL scheme allows for builtin modules to be referenced by validabsolute URL strings.,

import fs from 'node:fs/promises';

Innebygde moduler#

Core moduler gir heter eksport av deres felles API. Adefault eksport er også tilgjengelig, som er verdien av CommonJS eksport.Standard eksport kan bli brukt til blant annet å endre namedexports. Oppkalt eksport av innebygde moduler er kun oppdateres ved å ringemodule.syncBuiltinESMExports().

import EventEmitter from 'events';const e = new EventEmitter();
import { readFile } from 'fs';readFile('./foo.txt', (err, source) => { if (err) { console.error(err); } else { console.log(source); }});

importere() uttrykk#

Dynamisk import() støttes i både CommonJS og ES moduler. I CommonJSmodules den kan brukes til å laste ES moduler.,

importer.meta#

  • <Objektet>

import.meta meta property er en Object som inneholder followingproperties.

importer.metatag.url – #

  • <string> Den absolutte file: URL-en av modulen.

Dette er definert nøyaktig det samme som det er i nettlesere som gir den URL-en til thecurrent modul fil.,

This enables useful patterns such as relative file loading:

import { readFileSync } from 'fs';const buffer = readFileSync(new URL('./data.proto', import.meta.url));

import.meta.resolve(specifier)#

Stability: 1 – Experimental
  • specifier <string> The module specifier to resolve relative to parent.
  • parent <string> | <URL> The absolute parent module URL to resolve from., Hvis noneis angitte verdien av import.meta.url brukes som standard.
  • Returnerer: <Løfte>

Gir en modul-relative oppløsning funksjon omfattet til hver modul, returningthe URL-strengen.

const dependencyAsset = await import.meta.resolve('component-lib/asset.css');

import.meta.resolve aksepterer også et annet argument som er den overordnede modulefrom som å løse fra:

await import.meta.resolve('./dep', import.meta.url);

Denne funksjonen er asynkron fordi ES modul resolver i Noden.js isallowed å være asynkron.,

Interoperabilitet med CommonJS#

importer uttalelser#

En import uttalelse kan referere til et ES modul eller en CommonJS modul.import uttalelser er kun tillatt i ES moduler, men dynamisk import()uttrykk støttes i CommonJS for lasting ES moduler.

Når du importerer CommonJS moduler,module.exports objektet er angitt som standard eksport. Oppkalt eksport kan beavailable, levert av statisk analyse som et hjelpemiddel for bedre ecosystemcompatibility.,

krever#

CommonJS modulen require alltid behandler filer som er det referanser som CommonJS.

ved Hjelp av require for å laste inn en ES-modulen er ikke støttes fordi ES moduler haveasynchronous gjennomføring. I stedet, bruke import() for å laste inn en ES modulefrom en CommonJS modul.

CommonJS Navnerom#

CommonJS modulene består av en module.exports objekt som kan være av hvilken som helst type.,

Når du importerer en CommonJS modul, kan det være pålitelig importeres ved hjelp av den ESmodule standard importere eller tilsvarende sukker syntaks:

ECMAScript Modul Navnet er representasjon av en CommonJS modulen er alwaysa navnerom med en default eksporter nøkkelen peker til CommonJSmodule.exports verdi.

Denne Modulen Navnerom Eksotiske Objekt kan være direkte observert enten ved bruk avimport * as m from 'cjs' eller en dynamisk import:

import * as m from 'cjs';console.log(m);console.log(m === await import('cjs'));// Prints:// { default: <module.exports> }// true

For bedre kompatibilitet med eksisterende bruk i JS økosystem, Node.,jsin tillegg forsøk på å bestemme CommonJS heter eksport av hver importedCommonJS module) for å gi dem som separate E-modul eksport ved hjelp av en staticanalysis prosessen.

For eksempel, tenk deg en CommonJS modul skrevet:

// cjs.cjsexports.name = 'exported';

De foregående modulen støtter heter import i ES moduler:

Som kan sees fra de siste eksempel på Modulen Navnerom Eksotiske Objekt beinglogged, name eksporter er kopiert av module.exports objekt og setdirectly på ES-modul navnet er når modulen er importert.,

Live bindende oppdateringer eller nye eksport lagt til module.exports er ikke detectedfor disse heter eksport.

påvisning av navngitte eksport er basert på felles syntaks mønstre, men ikke notalways riktig oppdage heter eksport. I disse tilfeller, ved hjelp av defaultimport form som er beskrevet ovenfor kan være et bedre alternativ.

som Heter eksport deteksjon dekker mange vanlige eksport mønstre, videreeksportere patternsand bygge verktøy og transpiler utganger. Se cjs-modul-lexer for exactsemantics implementert.,

Forskjeller mellom ES moduler og CommonJS#

Nei require, exports eller module.exports#

I de fleste tilfeller, ES-modulen import kan brukes til å laste inn CommonJS moduler.

Hvis nødvendig, en require funksjon kan være konstruert innenfor en ES-modulen ved hjelp avmodule.createRequire().

Nei __filename eller __dirname#

Disse CommonJS variabler er ikke tilgjengelig i ES moduler.,

__filename og __dirname bruke tilfeller kan replikeres viaimport.meta.url.

Nei JSON-Modulen Laste#

JSON import er fortsatt eksperimentell og bare støttes via--experimental-json-modules flagg.

Lokale JSON-filer kan lastes inn i forhold til import.meta.url med fs direkte:

import { readFile } from 'fs/promises';const json = JSON.parse(await readFile(new URL('./dat.json', import.meta.url)));

Alterantively module.createRequire() kan bli brukt.

Nei Native-Modulen Laste#

Native-moduler er for øyeblikket ikke støttes med ES-modul import.,

The can instead be loaded with module.createRequire() orprocess.dlopen.

No require.resolve#

Relative resolution can be handled via new URL('./local', import.meta.url).

For a complete require.resolve replacement, there is a flagged experimentalimport.meta.resolve API.

Alternatively module.createRequire() can be used.

No NODE_PATH#

NODE_PATH is not part of resolving import specifiers. Please use symlinksif this behavior is desired.,

Nei require.extensions#

require.extensions brukes ikke av import. Forventningen er at loaderhooks kan gi denne arbeidsflyten i fremtiden.

Nei require.cache#

require.cache brukes ikke av import som ES module loader har sin ownseparate cache.

JSON moduler#

Stabilitet: 1 – Eksperimentelle

i Dag importerer JSON moduler er bare støttet i commonjs modeand er lagt inn ved hjelp av CJS loader., WHATWG JSON moduler spesifikasjon arestill være standardisert, og er eksperimentelt støttes av blant annet theadditional flagg --experimental-json-modules når du kjører Node.js.

Ved --experimental-json-modules flagget er inkludert, bådecommonjs og module modus, bruker den nye eksperimentelle JSONloader. De importerte JSON bare utsetter en default. Det er nosupport for navngitte eksport. En hurtigbuffer-oppføringen er opprettet i CommonJScache for å unngå duplisering., Det samme objektet er returnert inCommonJS hvis JSON-modulen har allerede blitt importert fra thesame banen.

Forutsatt en index.mjs med

import packageConfig from './package.json';

--experimental-json-modules flagget er nødvendig for moduleto arbeid.

node index.mjs # failsnode --experimental-json-modules index.mjs # works

Wasm moduler#

Stabilitet: 1 – Eksperimentelle

Import Web Montering moduler støttes under--experimental-wasm-modules flagg, slik at enhver .wasm filer til beimported som normalt moduler og samtidig støtte deres modul import.,

Denne integrasjonen er i tråd med theES Modul Integrasjon Forslag for Web Montering.

For eksempel, en index.mjs inneholder:

import * as M from './module.wasm';console.log(M);

henrettet under:

node --experimental-wasm-modules index.mjs

vil gi eksport grensesnitt for oppretting av module.wasm.

Topp-nivå venter#

Stabilitet: 1 – Eksperimentelle

await søkeord kan brukes på øverste nivå (utenfor asynkron funksjoner)i moduler som per ECMAScript Topp-Nivå await forslaget.,

Forutsatt en a.mjs med

export const five = await Promise.resolve(5);

Og b.mjs med

import { five } from './a.mjs';console.log(five); // Logs `5`
node b.mjs # works

Lastere#

Stabilitet: 1 – Eksperimentelle

Merk: Dette API-er for øyeblikket omgjort og vil fortsatt endre.

for Å tilpasse standard modul oppløsning, loader kroker kan eventuelt beprovided via en --experimental-loader ./loader-name.mjs argument for å Node.js.

Når kroker brukes de kun gjelder ES-modul settes inn og ikke til anyCommonJS moduler er lastet.,

Kroker#

resolve(specifier, context, defaultResolve)#

Merk: lastere API er blitt redesignet. Denne kroken kan forsvinne eller itssignature kan endres. Ikke stole på API som er beskrevet nedenfor.

resolve krok returnerer løst filen URL for en gitt modul specifierand overordnede URL., Modulen specifier er streng i en import uttalelse ellerimport() uttrykk, og den overordnede URL den URL-en modul som importedthis en, eller undefined hvis dette er den viktigste inngangspunkt for programmet.

conditions eiendom på context er en rekke forhold forConditional eksport som gjelder for denne løsningen forespørsel. De kan være usedfor ser opp betinget tilordninger til andre steder, eller hvis du vil endre listen når callingthe standard oppløsning logikk.,

Den aktuelle pakken eksport forhold er alltid inthe context.conditions array gått inn i kroken. For å garantere defaultNode.js-modul specifier oppløsning atferd når de ringer defaultResolve,context.conditions array gått til det må omfatte alle elementer avcontext.conditions array opprinnelig vedtatt i resolve krok.

getFormat(url, context, defaultGetFormat)#

Merk: lastere API er blitt redesignet. Denne kroken kan forsvinne eller itssignature kan endres., Ikke stole på API som er beskrevet nedenfor.,d5″> <string>

  • context <Object>
  • defaultGetFormat <Function>
  • Returns: <Object>
    • format <string>
  • The getFormat hook provides a way to define a custom method of determining howa URL should be interpreted., format returnert påvirker også hva theacceptable former for kilde verdier er for en modul når parsing. Dette kan være oneof følgende:

    format Beskrivelse Akseptabelt Typer For source Returneres av getSource eller transformSource
    'builtin' Legg en Node.,js builtin module Not applicable
    'commonjs' Load a Node.,ebf3″> Load a JSON file { string, ArrayBuffer, TypedArray }
    'module' Load an ES module { string, ArrayBuffer, TypedArray }
    'wasm' Load a WebAssembly module { ArrayBuffer, TypedArray }

    Note: These types all correspond to classes defined in ECMAScript.,

    • Den spesifikke ArrayBuffer objektet er en SharedArrayBuffer.
    • Den spesifikke TypedArray objektet er en Uint8Array.

    getSource(url, context, defaultGetSource)#

    Merk: lastere API er blitt redesignet. Denne kroken kan forsvinne eller itssignature kan endres. Ikke stole på API som er beskrevet nedenfor.

    getSource krok gir en måte å definere en tilpasset metode for retrievingthe kildekoden til en ES-modul specifier., Dette vil gi et loader topotentially unngå å lese filer fra harddisken.

    transformSource(source, context, defaultTransformSource)#

    Merk: lastere API er blitt redesignet. Denne kroken kan forsvinne eller itssignature kan endres. Ikke stole på API som er beskrevet nedenfor.

    transformSource krok gir en måte å modifisere kildekoden til en loadedES modul-fil etter kilde strengen har blitt lastet inn, men før Noden.js hasdone noe med det.

    Hvis denne kroken brukes til å konvertere ukjent-til-Node.,js-fil-typer i executableJavaScript, løs kroken er også nødvendig for å registrere anyunknown-til-Node.js-filen-utvidelser. Se transpiler loader eksempel nedenfor.

    getGlobalPreloadCode()#

    Merk: lastere API er blitt redesignet. Denne kroken kan forsvinne eller itssignature kan endres. Ikke stole på API som er beskrevet nedenfor.,

    • Returnerer: <string>

    noen Ganger kan det være nødvendig å kjøre noen kode på innsiden av den samme globale scopethat programmet kjører i. Denne kroken kan returnere en string som isrun som sloppy-modus skript ved oppstart.

    Ligner på hvordan CommonJS wrappers arbeid, koden kjøres i en implisitt functionscope. Det eneste argumentet er en require-lignende funksjon som kan brukes til å loadbuiltins som «fs»: getBuiltin(request: string).,

    Hvis koden er behov for mer avanserte require funksjoner, det har å constructits egne require med module.createRequire().

    Eksempler#

    De ulike loader kroker kan brukes sammen for å oppnå bredt rangingcustomizations av Noden.js’ kode lasting og evaluering atferd.

    HTTPS loader#

    I gjeldende Node.js, specifiers starter med støttes ikke. Theloader nedenfor registrerer kroker for å aktivere elementær støtte til slike specifiers.Mens dette kan synes som en betydelig forbedring til Noden.,js corefunctionality, er det betydelige ulemper med å faktisk bruke denne loader:ytelsen er mye tregere enn laste inn filer fra disk, det er ingen bufring,og det er ingen sikkerhet.

    // main.mjsimport { VERSION } from 'https://coffeescript.org/browser-compiler-modern/coffeescript.js';console.log(VERSION);

    Med den foregående loader, kjørernode --experimental-loader ./https-loader.mjs ./main.mjsskriver ut den gjeldende versjonen av CoffeeScript per modul på URL-adressen imain.mjs.

    Transpiler loader#

    Kilder som er i formater Node.js ikke forstår kan konverteres intoJavaScript bruke transformSource krok., Før kroken blir kalt,men andre kroker trenger å fortelle Node.js ikke å kaste en feil på ukjente filtyper, og for å fortelle Node.js hvordan å laste dette nye filtypen.

    Dette er mindre effektivt enn transpiling kilde filer før runningNode.js; en transpiler loader bør bare brukes for utvikling og testingpurposes.

    # scream.coffeeexport scream = (str) -> str.toUpperCase()

    Med den foregående loader, kjørernode --experimental-loader ./coffeescript-loader.mjs main.coffeeforårsaker main.coffee for å bli omgjort til etter JavaScript kildekoden isloaded fra harddisken, men før Noden.,js executes it; and so on for any .coffee,.litcoffee or .coffee.md files referenced via import statements of anyloaded file.,

    Oppløsning algoritme#

    Funksjoner#

    resolver har følgende egenskaper:

    • FileURL-basert oppløsning som brukes ved ES moduler
    • Støtte for innebygde modulen laste
    • Relative og absolutte URL-oppløsning
    • Ingen standard utvidelser
    • Ingen mappe strømnettet
    • Nakne specifier pakken oppløsning oppslag gjennom node_modules

    Resolver algoritme#

    Algoritmen for å laste inn en ES-modul specifier er gitt gjennom theESM_RESOLVE metode nedenfor. Det gir løst URL for amodule specifier i forhold til en parentURL.,

    algoritme for å avgjøre modul-format i et løst URL isprovided av ESM_FORMAT, som gir den unike moduleformat for en hvilken som helst fil. Den «modul» format er tilbake for en ECMAScriptModule, mens «commonjs» – formatet brukes til å indikere lasting gjennom thelegacy CommonJS loader. Flere formater som for eksempel «add-on» kan bli utvidet infuture oppdateringer.

    I det følgende algoritmer, alle delrutine feil er videreført som errorsof disse topp-nivå rutiner med mindre annet er angitt.

    defaultConditions er betinget miljø navnet utvalg,.,

    resolver kan kaste følgende feil:

    • Ugyldig Modul Specifier: Modul specifier er en ugyldig URL, pakke nameor pakken subpath specifier.
    • Ugyldig Pakken Konfigurasjon: – pakken.json-konfigurasjon er ugyldig orcontains en ugyldig konfigurasjon.
    • Ugyldig Pakken Mål: Pakke eksport eller import definere et mål modulefor den pakken som er en ugyldig eller-typen string mål.
    • Pakken Banen Ikke Eksporteres: Pakke eksport ikke definere eller tillate at en targetsubpath i pakken for en gitt modul.,
    • Importere Pakken Ikke er Definert: Pakke import ikke definere den specifier.
    • Modulen ble Ikke Funnet: pakken eller modul bedt om ikke eksisterer.
    • Ustøttet Directory-Import: Det løste vei tilsvarer en katalog,som støttes ikke mål for modulen import.

    Resolver Algoritme Spesifikasjon#

    ESM_RESOLVE(specifier, parentURL)

    1. La løst være udefinert.
    2. Hvis specifier er en gyldig URL-adresse, og deretter
      1. Angi løst til resultatet av analysering og reserializingspecifier som en URL.,
    3. Ellers, hvis specifier starter med «/», «./» eller «../», deretter
      1. Angi løst for å URL oppløsning av specifier relative toparentURL.
    4. Ellers, hvis specifier starter med «#», deretter
      1. Angi løst til destructured verdi over resultatet ofPACKAGE_IMPORTS_RESOLVE(specifier, parentURL,defaultConditions).
    5. Ellers,
      1. Merk: specifier er nå en bare specifier.
      2. Angi løst resultatet ofPACKAGE_RESOLVE(specifier, parentURL).,
    6. Hvis løst inneholder prosent kodinger av «/» eller «\» («%2f»og «%5C» henholdsvis), deretter
      1. Kaste en Ugyldig Modul Specifier feil.
    7. Hvis filen på løst er en katalog, deretter
      1. Kaste en Uegnet Directory-Import feil.
    8. Hvis filen på løst eksisterer ikke, da
      1. Kaste en Modul Ikke Funnet feil.
    9. Angi løst til den virkelige banen for løst.
    10. La format være et resultat av ESM_FORMAT(løst).
    11. Legg løst som modul-format format.
    12. Gå løst.,

    PACKAGE_RESOLVE(packageSpecifier, parentURL)

    1. La packageName være udefinert.
    2. Hvis packageSpecifier er en tom streng, så
      1. Kaste en Ugyldig Modul Specifier feil.
    3. Hvis packageSpecifier ikke starter med «@», deretter
      1. Angi packageName til delstreng av packageSpecifier til den første»/» separator eller slutten av strengen.
    4. Ellers,
      1. Hvis packageSpecifier ikke inneholder en «/» skilletegn, deretter
        1. Kaste en Ugyldig Modul Specifier feil.,
      2. Angi packageName til delstreng av packageSpecifieruntil den andre «/» separator eller slutten av strengen.
    5. Hvis packageName starter med «.»eller inneholder «\» eller «%», deretter
      1. Kaste en Ugyldig Modul Specifier feil.
    6. La packageSubpath være «.»slås sammen med delstreng ofpackageSpecifier fra posisjon på lengden av pakkenavn.
    7. La selfUrl være resultatet ofPACKAGE_SELF_RESOLVE(packageName, packageSubpath, parentURL).
    8. Hvis selfUrl er ikke definert, går du tilbake selfUrl.
    9. Hvis packageSubpath er «.,»og packageName er en Node.js builtinmodule, deretter
      1. Returnere strengen «node:» slås sammen med packageSpecifier.
    10. Mens parentURL er ikke filsystemet rot,
      1. La packageURL være den URL oppløsning av «node_modules/»slås sammen med packageSpecifier, i forhold til parentURL.
      2. Angi parentURL til den overordnede mappen URL av parentURL.
      3. Hvis mappen på packageURL ikke eksisterer, så
        1. Angi parentURL til den overordnede URL banen av parentURL.
        2. Fortsette på neste loop iterasjon.,
      4. La pjson være et resultat av READ_PACKAGE_JSON(packageURL).
      5. Hvis pjson ikke er null og pjson.eksport er ikke null orundefined, deretter
        1. La eksporten være pjson.Eksport.
        2. Gå løst destructured verdi over resultatet ofPACKAGE_EXPORTS_RESOLVE(packageURL, packageSubpath,pjson.eksport, defaultConditions).
      6. Ellers, hvis packageSubpath er lik «.», deretter
        1. Returnere resultatet som søker arven LOAD_AS_DIRECTORYCommonJS resolver til packageURL, kaster en Modul Ikke Founderror for ingen løsning.,
      7. Ellers,
        1. gå Tilbake URL oppløsning av packageSubpath i packageURL.
    11. Kaste en Modul Ikke Funnet feil.

    PACKAGE_SELF_RESOLVE(packageName, packageSubpath, parentURL)

    1. La packageURL være et resultat av READ_PACKAGE_SCOPE(parentURL).
    2. Hvis packageURL er null, så
      1. gå Tilbake udefinert.
    3. La pjson være et resultat av READ_PACKAGE_JSON(packageURL).
    4. Hvis pjson er null eller hvis pjson.,eksporten er null orundefined, deretter
      1. gå Tilbake udefinert.
    5. Hvis pjson.navnet er lik packageName, deretter
      1. Gå løst destructured verdi over resultatet ofPACKAGE_EXPORTS_RESOLVE(packageURL, subpath, pjson.eksport,defaultConditions).
    6. hvis ikke, gå tilbake udefinert.

    PACKAGE_EXPORTS_RESOLVE(packageURL, subpath, eksport, betingelser)

    1. Dersom eksporten er et Objekt med både a-tasten å starte med «.»og en nøkkel notstarting med «.», kaste en Ugyldig Pakken konfigurasjonsfeil.,
    2. Hvis subpath er lik «.», deretter
      1. La mainExport være udefinert.
      2. Dersom eksporten er en Streng eller en Matrise eller en Gjenstand som ikke inneholder keysstarting med «.», deretter
        1. Angi mainExport til eksport.
      3. Ellers hvis eksporten er et Objekt som inneholder en «.»eiendom, deretter
        1. Angi mainExport til eksport.
      4. Hvis mainExport er ikke udefinert, deretter
        1. La løst være et resultat av PACKAGE_TARGET_RESOLVE(packageURL, mainExport, «», false, false,betingelser).
        2. Hvis løses ikke er null eller udefinert, deretter
          1. Gå løst.,
    3. Ellers, hvis eksporten er et Objekt og alle nøkler av eksporten starter med».», deretter
      1. La matchKey være streng «./» slås sammen med subpath.
      2. La resolvedMatch være et resultat av PACKAGE_IMPORTS_EXPORTS_RESOLVE(matchKey, eksport, packageURL, false, betingelser).
      3. Hvis resolvedMatch.løser ikke er null eller udefinert, deretter
        1. gå Tilbake resolvedMatch.
    4. Kaste en Pakke Banen Eksporteres Ikke feil.,

    PACKAGE_IMPORTS_RESOLVE(specifier, parentURL, betingelser)

    1. Hevde: specifier begynner med «#».
    2. Hvis specifier er nøyaktig lik «#» eller starter med «#/», deretter
      1. Kaste en Ugyldig Modul Specifier feil.
    3. La packageURL være et resultat av READ_PACKAGE_SCOPE(parentURL).
    4. Hvis packageURL ikke er null, så
      1. La pjson være et resultat av READ_PACKAGE_JSON(packageURL).
      2. Hvis pjson.,import er en ikke-null-Objektet, og deretter
        1. La resolvedMatch være resultatet ofPACKAGE_IMPORTS_EXPORTS_RESOLVe(specifier, pjson.import,packageURL, sant, betingelser).
        2. Hvis resolvedMatch.løser ikke er null eller udefinert, deretter
          1. gå Tilbake resolvedMatch.
    5. Kaste en Pakke Import Ikke er Definert feil.,

    PACKAGE_IMPORTS_EXPORTS_RESOLVE(matchKey, matchObj, packageURL,isImports, betingelser)

    1. Hvis matchKey er en nøkkel av matchObj, og ikke slutter på «*», så
      1. La målet være verdien av matchObj.
      2. La løst være et resultat av PACKAGE_TARGET_RESOLVE(packageURL, target, «», false, isImports, betingelser).
      3. Returnere objektet { løst, eksakt: true }.
    2. La expansionKeys bli listen over nøklene til matchObj slutter i «/»eller «*», sortert etter lengde synkende.,
    3. For hver tast expansionKey i expansionKeys, gjør
      1. Hvis expansionKey ender i «*» og matchKey starter med, men isnot lik delstreng av expansionKey unntatt den siste «*»tegnet, og deretter
        1. La målet være verdien av matchObj.
        2. La subpath være del av matchKey starter på theindex av lengden på expansionKey minus en.
        3. La løst være et resultat av PACKAGE_TARGET_RESOLVE(packageURL, mål, subpath, sant, isImports,betingelser).
        4. Returnere objektet { løst, eksakt: true }.,
      2. Hvis matchKey starter med expansionKey, deretter
        1. La målet være verdien av matchObj.
        2. La subpath være del av matchKey starter på theindex av lengden på expansionKey.
        3. La løst være et resultat av PACKAGE_TARGET_RESOLVE(packageURL, mål, subpath, false, isImports,betingelser).
        4. Returnere objektet { løst, eksakt: false }.
    4. Returnere objektet { løst: null, eksakt: true }.,

    PACKAGE_TARGET_RESOLVE(packageURL, mål, subpath, mønster,interne forhold)

    1. Hvis målet er en Streng, så
      1. Hvis mønsteret er falske, subpath har ikke-null lengde og targetdoes ikke slutt med «/», kaste en Ugyldig Modul Specifier feil.
      2. Hvis målet ikke starter med «./», deretter
        1. Hvis internt er sann, og at målet ikke starter med «..,/» eller»/», og er ikke en gyldig URL-adresse, og deretter
          1. Hvis mønsteret er sant,
            1. gå Tilbake PACKAGE_RESOLVE(mål med hver forekomst av»*» erstattet av subpath, packageURL + «/»)_.
          2. gå Tilbake PACKAGE_RESOLVE(mål + subpath,packageURL + «/»)_.
        2. Ellers, kaste en Ugyldig Pakke Målet feil.
      3. Hvis målet delt på «/» eller «\» inneholder «.», «..»eller»node_modules» segmenter etter det første segmentet, kaste anInvalid Pakke Målet feil.
      4. La resolvedTarget være den URL oppløsning av den sammensetning ofpackageURL og mål.,
      5. Hevde: resolvedTarget er inneholdt i packageURL.
      6. Hvis subpath delt på «/» eller «\» inneholder «.», «..»eller»node_modules» segmenter, kaste en Ugyldig Modul Specifier feil.
      7. Hvis mønsteret er sant,
        1. gå Tilbake URL oppløsning av resolvedTarget med hver forekomst av»*» erstattet med subpath.
      8. Ellers,
        1. gå Tilbake URL oppløsning av den sammensetning av subpath andresolvedTarget.
    2. Ellers, hvis målet er en ikke-null-Objektet, og deretter
      1. Dersom eksporten inneholder noe indeks eiendom tastene, som definert i ECMA-2626.1.,7 Tabellen Index, kaste en Ugyldig Pakken konfigurasjonsfeil.
      2. For hver enkelt egenskap p av mål, i objekt-innsetting for as,
        1. Hvis s er lik «standard» eller betingelser som inneholder en oppføring for p,deretter
          1. La targetValue verdien av p eiendom i mål.
          2. La løst være et resultat av PACKAGE_TARGET_RESOLVE(packageURL, targetValue, subpath, mønster, interne forhold).
          3. Hvis løst er lik udefinert, fortsette loop.
          4. Gå løst.
      3. gå Tilbake udefinert.,
    3. Ellers, hvis målet er en Array, så
      1. Hvis _target.lengden er lik null, returnerer null.
      2. For hvert element targetValue i mål, gjøre
        1. La løst være et resultat av PACKAGE_TARGET_RESOLVE(packageURL, targetValue, subpath, mønster, interne forhold), fortsetter sløyfe på noen Ugyldig Pakken Targeterror.
        2. Hvis løst er udefinert, fortsette loop.
        3. Gå løst.
      3. gå Tilbake eller kaste den siste skifte oppløsning null avkastning eller feil.
    4. Ellers, hvis målet er null, returnerer null.,
    5. Ellers kaste en Ugyldig Pakke Målet feil.

    ESM_FORMAT(url)

    READ_PACKAGE_SCOPE(url)

    1. La scopeURL url.
    2. Mens scopeURL er ikke filsystemet rot,
      1. Angi scopeURL til den overordnede URL av scopeURL.
      2. Hvis scopeURL ender i en «node_modules» sti-segmentet, returnere null.
      3. La pjson være et resultat av READ_PACKAGE_JSON(scopeURL).
      4. Hvis pjson ikke er null, så
        1. gå Tilbake pjson.
    3. Returnere null.,

    READ_PACKAGE_JSON(packageURL)

    1. La pjsonURL være oppløsning av «pakken.json» innen packageURL.
    2. Hvis filen på pjsonURL ikke eksisterer, så
      1. Returnere null.
    3. Hvis filen på packageURL ikke analysere som gyldig JSON, da
      1. Kaste en Ugyldig Pakken konfigurasjonsfeil.
    4. Returnere analyseres JSON kilde filen på pjsonURL.,

    Tilpasse ESM specifier oppløsning algoritme#

    Stabilitet: 1 – Eksperimentelle

    Den nåværende specifier oppløsning støtter ikke alle standard oppførsel ofthe CommonJS loader. En av atferd forskjellene er automatisk resolutionof filtyper og evnen til å importere kataloger som har en indexfile.

    --experimental-specifier-resolution= flagget kan brukes til å customizethe extension oppløsning algoritme. Standard modus er explicit, whichrequires den fullstendige banen til en modul bli gitt til lasteren., For å aktivere theautomatic extension oppløsning og import fra kataloger som inkluderer anindex-fil bruk node modus.

    Written by 

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *