Ich habe es versucht:
// mod.js
var a = 1;
this.b = 2;
exports.c = 3;
// test.js
var mod = require('./mod.js');
console.log(mod.a); // undefined
console.log(mod.b); // 2
console.log(mod.c); // 3, so this === exports?
Ich kann mir also vorstellen, dass require () folgendermaßen implementiert werden kann:
var require = function (file) {
var exports = {};
var run = function (file) {
// include "file" here and run
};
run.apply(exports, [file]);
return exports;
}
Ist das richtig? Bitte helfen Sie mir, require () zu verstehen, oder wo finde ich den Quellcode? Vielen Dank!
require
während es auch definiertrequire
. Das ist ein Schritt, den ich nur angesichts des Quellcodes ein wenig schwer zu verstehen finde.require
als eines der Argumente an diese Funktion übergeben wirdAndrey zeigte den Quellcode, aber wenn Sie sich auch fragen, wie man ihn verwendet, finden Sie hier die einfache Erklärung ( http://nodejs.org/api/modules.html ).
Dies waren zwei gute Beispiele für mich.
//foo.js, multiple methods var circle = require('./circle.js'); console.log( 'The area of a circle of radius 4 is ' + circle.area(4)); //circle.js var PI = Math.PI; exports.area = function (r) { return PI * r * r; }; exports.circumference = function (r) { return 2 * PI * r; }; //bar.js var square = require('./square.js'); var mySquare = square(2); console.log('The area of my square is ' + mySquare.area()); //square.js, single method module.exports = function(width) { return { area: function() { return width * width; } }; }
Mein Lieblingsmuster ist
(function (controller) { controller.init = function (app) { app.get("/", function (req, res) { res.render("index", {}); }); }; })(module.exports);
quelle
var express = require('express')
, warum müssen sie danach eine andere Variable neu definieren alsvar app = express()
?require('express')
eine Funktion zurückgeben, die eine App zurückgibt . Es ist nur so, wie sie es gebaut haben. Hoffentlich haben Sie diese Frage bereits beantwortet, seit Sie sie vor 4 Jahren gestellt haben.var mod = require('./mod.js');
Die Anforderung ist eine Funktion, die ein Argument namens Pfad akzeptiert. In diesem Fall ist der Pfad
./mod.js
Wenn die Anforderung aufgerufen wird, werden eine Reihe von Aufgaben ausgeführt:
Anruffunktion
Module.prototype.require
deklariert in lib / module.js die behaupten , dass der Pfad vorhanden ist und war ein StringAufruf,
Module._load
der eine Funktion in lib / module.js ist , die die Datei durch auflöstModule._resolveFilename(request, parent, isMain)
,Module._resolveFilename
Funktion wird aufgerufen und prüft, ob das Modul nativ ist (die nativen Module werden vonNativeModule
der in lib / internal / bootstrap_node.js definierten Funktion zurückgegeben ). Wenn ja, wird das Modul zurückgegeben, andernfalls wird die Anzahl der Zeichen des Parh überprüft (Muss 2) Zeichen mindestens) und einige Zeichen (der Pfad muss von gestartet werden./
) überModule._resolveLookupPaths
die in lib / internal / bootstrap_node.js definierte Funktionvar module = new Module(filename, parent);
NativeModule.prototype.compile
in lib / internal / bootstrap_node.js definierte Funktion kompiliertNativeModule.wrap
in lib / internal / bootstrap_node.js definierte Element verwendet den kompilierten Javascript-Inhaltmod.js
und verpackt ihn: Es verpackt ihn in einen anderen Code, mit dem all dies funktioniert. Der Code, den Sie geschrieben haben,mod.js
wird also in einen Funktionsausdruck eingeschlossen. Das bedeutet, dass alles, was Sie in Node schreiben, in V8 ausgeführt wirdquelle
Ich grabe ein bisschen mehr von nodejs Quellcode / 2 / und mache ein Sequenzdiagramm / 1 /, hoffe, dies könnte Ihnen einen intuitiven Überblick geben. Es gibt einen weiteren Artikel http://fredkschott.com/post/2014/06/require-and-the-module-system/, in dem auch der require () -Mechanismus auf einfache Weise erläutert wird. Lesen Sie zuerst diesen Artikel, um Hilfe zu erhalten Verstehe das Diagramm schnell.
Ref:
/ 1 / Diagrammquellen-Repo: https://github.com/z1yuan/nodejs.git
/ 2 / https://github.com/nodejs/node-v0.x-archive.git
quelle
Die Quelle finden Sie hier neben den Downloads: http://nodejs.org/ export / require sind Schlüsselwörter, ich glaube nicht, dass sie direkt in Javascript codiert sind. Der Knoten ist in C ++ codiert, Javascript ist nur eine Skript-Shell um den C ++ - Kern.
quelle
require
,module
,__filename
, Etc. sind Funktionen und Variablen in das Modul nach der Kompilierung injizierten, und das Modul läuft im Rahmen v8 - Motors, aber das Modul selbst ist ein Verschluss, so Variablen und Funktionen nie in Konflikt gerieten werden (außer im Fall , dass Sie die globale Variable verwenden und Chaos.