Node.js module.exports vs. eksport

Hvad er de, hvordan man bruger dem, og hvordan man ikke bruger dem

(Bemærk, at denne artikel blev skrevet efter frigivelse af Node.js 6.1.0)

TL; DR

  • Tænk på module.exports som den variabel, der returneres fra kræver (). Det er som standard et tomt objekt, og det er fint at skifte til noget.
  • Eksport? Nå, "eksport" i sig selv returneres aldrig!Det er bare en henvisning til module.exports; en praktisk variabel, der hjælper modulforfattere med at skrive mindre kode. Arbejde med dets egenskaber er sikkert og anbefales.
exports.method = function() {…} 
vs.
module.exports.method = function() {…}

Et simpelt moduleksempel

For det første har vi brug for et eksempel på en kodebase. Lad os starte med en simpel lommeregner:

Anvendelse:

Modulindpakningen

Node.js indpakker internt alle krav () - ed moduler i en funktionsindpakning:

Modulobjektet

Variabelt “ modul ” er et objekt, der repræsenterer det aktuelle modul. Det er lokalt for hvert modul, og det er også privat (kun tilgængeligt fra modulkode):

Module.exports

  • Det er objektreferencen, der returneres fra de krævede () opkald.
  • Det oprettes automatisk af Node.js.
  • Det er kun en henvisning til et almindeligt JavaScript-objekt.
  • Den er også tom som standard (vores kode vedhæfter en "tilføj ()" -metode til den)

Der er to måder, vi kan bruge module.exports på:

  1. Vedhæftning af offentlige metoder til det (som vi gjorde i lommeregnereksemplet).
  2. Udskiftning det med vores brugerdefinerede objekt eller en funktion.

Hvorfor udskifte det? Når vi udskifter, kan vi returnere enhver vilkårlig forekomst af en anden klasse. Her er et eksempel skrevet i ES2015:

Ovenfor eksporterer "lommeregner-base" en klasse.

Lad os udvide klassen "Lommeregner" og eksportere en forekomst denne gang:

Anvendelse:

Eksportalias

  • "Eksport" er bare en komfortvariabel, så modulforfattere kan skrive mindre kode
  • Arbejde med dets egenskaber er sikkert og anbefales.

    (f.eks .: eksport.add = funktion ...)

  • Eksport returneres IKKE efter krav () (module.exports er!)

Her er nogle gode og nogle dårlige eksempler:

Bemærk: Det er almindelig praksis at erstatte module.exports med brugerdefinerede funktioner eller objekter. Hvis vi gør det, men stadig gerne vil fortsætte med at bruge "eksporten" stenografi; derefter skal "eksport" peges på vores nye brugerdefinerede objekt (også udført i kode ovenfor på linje 12):

exports = module.exports = {}
exports.method = function() {...}

Konklusion

En variabel med navnet eksport , der ikke eksporteres helt, er forvirrende, især for nybegyndere til Node.js. Selv den officielle dokumentation har også en lidt underlig indstilling:

Som en retningslinje, hvis forholdet mellem eksport og module.exports virker som en magi for dig, skal du ignorere eksport og kun bruge module.exports.

Min opfattelse er, at koden ikke er magisk. Udviklere bør altid søge dybere forståelse af de platforme og sprog, de bruger. Ved at gøre det; programmører får værdifuld tillid og viden, som igen påvirker kodekvalitet, systemarkitektur og produktivitet positivt.

Tak fordi du læste mit indlæg. Feedback og tanker er altid velkomne i kommentarfeltet.

lazlojuly

Relaterede artikler:

  • Er Node.js-moduler singletoner?

Kilder:

  • Node.js-dokumentation om moduler

Tjek min nye blogserie om test af enhedsenheder:

Hvordan kommer jeg i gang med Unit Testing? Del 1

Jeg antager, at mange af os kan forholde os til en situation, der er afbildet ovenfor.

Et sted hvor enhedstest betragtes som en opgave. medium.com