Dette innlegget ble sist redigert av Summer 2019-2-13 kl. 14:04
I 2009 opprettet den amerikanske programmereren Ryan Dahl node.js prosjekt for å bruke JavaScript-språket til server-side programmering.
Dette markerer fødselen av «Javascript modulær programmering». Kompleksiteten i front-end er begrenset, og det er greit å ikke ha moduler, men på serversiden må det finnes moduler for å samhandle med operativsystemet og andre applikasjoner, ellers kan det ikke programmeres i det hele tatt.
En av de viktigste ideene innen nodeprogrammering er moduler, og det er denne ideen som gjør storskala JavaScript-utvikling mulig. Modulær programmering var populært i JS-verdenen, og det var basert på dette, og på nettlesersiden dukket det også opp verktøysett som requirejs og seajs, så å si, under tilsvarende spesifikasjon, krevde styring av all modulær programmering før ES6, selv nå, før ES6-modulen var fullt implementert.
I CommonJS bruker eksponeringsmodulen module.exports og exports, og mange forstår ikke hvorfor det er to eksponerte objekter, som vil bli introdusert senere
I CommonJS finnes det en global metode rescribre() som brukes for å laste moduler. Forutsatt at det finnes en matematikkmodul math.js, kan den lastes inn slik.
Du kan deretter kalle metodene som tilbys av modulen:
Det er nettopp på grunn av demand-metoden brukt av CommonJS at demand-metoden brukt av AMD og CMD senere også ble brukt for å referere til modulstilen
AMD-spesifikasjon
Med server-side moduler er det naturlig at alle ønsker klient-side moduler. Og det er best at de to er kompatible, og at en modul kan kjøre både på serveren og nettleseren uten endringer.
Det finnes imidlertid en stor begrensning som gjør at CommonJS-spesifikasjonen ikke er anvendelig i nettlesermiljøer. Likevel gjelder koden fra forrige seksjon, hvis den kjører i en nettleser, vil det oppstå et stort problem
Den andre linjen math.add(2, 3) kjøres etter den første linjen rekrere('math'), så den må vente til math.js lasten er ferdig. Det vil si, hvis lastetiden er lang, vil hele appen stoppe der og vente.
Dette er ikke et problem på serversiden, fordi alle moduler lagres på den lokale harddisken og kan lastes synkront, og ventetiden er lesetiden til harddisken. For nettlesere er dette imidlertid et stort problem, fordi modulene plasseres på serversiden, og ventetiden avhenger av hastigheten på Internett, noe som kan ta lang tid, og nettleseren er i en "suspendert død"-tilstand.
Derfor kan ikke moduler på nettlesersiden bruke «synkron», men kun «asynkron». Dette er bakgrunnen for fødselen av AMD-spesifikasjonen.
AMD er en forkortelse for "Asynchronous Module Definition", som betyr "Asynchronous Module Definition". Den laster modulen asynkront, og lastingen av modulen påvirker ikke driften av de påfølgende setningene. Alle setninger som er avhengige av denne modulen er definert i en callback-funksjon som ikke kjøres før lastingen er fullført.
Moduler må defineres med en spesifikk define()-funksjon.
•ID: streng, modulnavn (valgfritt) •avhengigheter: er den avhengige modulen vi ønsker å laste inn (valgfritt), ved å bruke den relative stien. , merk at det er et arrayformat •factory: factory-metoden, returnerer en modulfunksjon Hvis en modul ikke avhenger av andre moduler, kan den defineres direkte i define()-funksjonen.
Hvis modulen også avhenger av andre moduler, må det første argumentet i define()-funksjonen være et array som indikerer modulens avhengigheter.
Når require()-funksjonen laster inn modulen ovenfor, vil den laste Lib.js fil først.
AMD bruker også require()-setningen for å laste modulen, men i motsetning til CommonJS krever den to parametere:
Den første parameteren [modul] er et array, og medlemmene i det er modulene som skal lastes inn; Den andre parameter-callbacken er callback-funksjonen etter at lasten er vellykket. Hvis du skriver om forrige kode til AMD-form, ser det slik ut:
math.add() er ikke synkronisert med lasting av matematikkmodulen, og nettleseren suspenderer ikke animasjon. Så åpenbart er AMD mer egnet for nettlesermiljøet.
For øyeblikket finnes det to hovedbiblioteker for Javascript som implementerer AMD-spesifikasjonen :require.js og curl.js.
|