Jak require () w node.js działa?
Próbowałem tego:
// 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?
Więc obraz, który wymaga () może być zaimplementowany w następujący sposób:
var require = function (file) {
var exports = {};
var run = function (file) {
// include "file" here and run
};
run.apply(exports, [file]);
return exports;
}
Czy to prawda? Proszę pomóż mi zrozumieć require (), lub Gdzie mogę znaleźć kod źródłowy. Dzięki! 4 answers
Kod źródłowy to tutaj . exports
/require
nie są słowami kluczowymi, lecz zmiennymi globalnymi. Twój skrypt główny jest owinięty przed start w funkcję, która ma wszystkie globale takie jak require
, process
etc w jego kontekście.
Zwróć uwagę, że moduł while.sam js używa require()
, to inna funkcja wymagająca, i jest zdefiniowana w pliku o nazwie "node.js "
Efekt uboczny powyższego: to jest całkowicie w porządku, aby mieć "return" oświadczenie w środku modułu (nie należący do żadnej funkcji), skutecznie "komentując" resztę kodu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-29 01:24:18
Andrey pokazał kod źródłowy, ale jeśli również zastanawiasz się, jak go użyć, proste i proste wyjaśnienie znajduje się tutaj ( http://nodejs.org/api/modules.html).
To były dla mnie dwa dobre przykłady.//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;
}
};
}
Mój ulubiony wzór to
(function (controller) {
controller.init = function (app) {
app.get("/", function (req, res) {
res.render("index", {});
});
};
})(module.exports);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:01:59
var mod = require('./mod.js');
Require jest funkcją, która przyjmuje jeden argument o nazwie path, w tym przypadku ścieżka to ./mod.js
Po wywołaniu require następuje sekwencja zadań:
-
Wywołanie
Module.prototype.require
funkcji zadeklarowanej w lib/module.js, które twierdzą, że ścieżka istnieje i jest ciągiem znaków Wywołanie
Module._load
, które jest funkcją w lib/module.js, które rozwiązują plik poprzezModule._resolveFilename(request, parent, isMain)
,- Funkcja
Module._resolveFilename
jest wywoływana i sprawdza, czy moduł jest natywny (Moduły natywne są zwracane przezNativeModule
funkcję zdefiniowaną w lib/internal/bootstrap_node.js ), jeśli tak, zwróci moduł, w przeciwnym razie sprawdza ilość znaków parh (musi mieć co najmniej 2 znaki) i kilka znaków (ścieżka musi być uruchomiona przez./
) poprzezModule._resolveLookupPaths
funkcję zdefiniowaną w lib / internal / bootstrap_node.js - sprawdź katalog zawierający plik
- jeśli ścieżka zawiera rozszerzenie (w naszym przykładzie tak: mod.js), funkcja basename zdefiniowana w lib/path.js sprawdza, czy rozszerzenie jest " js "
- następnie utworzy nowy moduł dla pliku podanego w argumencie
var module = new Module(filename, parent);
- zawartość zostanie skompilowana przez v8 za pomocą funkcji
NativeModule.prototype.compile
zdefiniowanej w lib/internal/bootstrap_node.js -
NativeModule.wrap
zdefiniowane w lib/internal/bootstrap_node.js pobiera zawartość javascript skompilowaną zmod.js
i zawija: zawija go w inny kod, który sprawia, że wszystko to działa. Więc kod, który napisałeś wmod.js
jest zawinięty w wyrażenie funkcji. oznacza to, że wszystko, co piszesz w node, jest uruchamiane w V8 - moduł.eksport jest tym, co zostało zwrócone
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 20:00:50
Źródło jest dostępne tutaj obok plików do pobrania: http://nodejs.org / exports / require to słowa kluczowe, nie wydaje mi się, aby były bezpośrednio zakodowane w javascript. Node jest zakodowany w C++, javascript jest tylko powłoką skryptową wokół rdzenia C++.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-27 02:00:40