Как работает require() в node.js?
Я пробовал это:
// 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?
Итак, изображение, требующее(), может быть реализовано следующим образом:
var require = function (file) {
var exports = {};
var run = function (file) {
// include "file" here and run
};
run.apply(exports, [file]);
return exports;
}
Это правильно? Пожалуйста, помогите мне понять require() или где я могу найти исходный код. Спасибо!
Ответы
Ответ 1
Исходный код здесь. exports
/require
- это не ключевые слова, а глобальные переменные. Ваш основной сценарий упакован перед запуском в функцию, которая имеет все глобальные переменные, такие как require
, process
и т.д. В своем контексте.
Обратите внимание, что, хотя сам module.js использует require()
, это другая требуемая функция, и она определена в файле с именем "node.js"
Побочный эффект выше: прекрасно иметь оператор return в середине вашего модуля (не принадлежащий какой-либо функции), эффективно "закомментируя" остальную часть кода
Ответ 2
Andrey показал исходный код, но если вы также задаетесь вопросом, как его использовать, простое и простое объяснение здесь (http://nodejs.org/api/modules.html).
Это были два хороших примера для меня.
//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;
}
};
}
Мой любимый паттерн
(function (controller) {
controller.init = function (app) {
app.get("/", function (req, res) {
res.render("index", {});
});
};
})(module.exports);
Ответ 3
var mod = require('./mod.js');
Требование - это функция, которая принимает один аргумент, называемый путем, в данном случае путь - ./mod.js
когда вызывается требование, происходит последовательность задач:
вызовите функцию Module.prototype.require
, объявленную в lib/module.js, которая утверждает, что путь существует и является строкой
вызовите Module._load
, которая является функцией в lib/module.js, которая разрешает файл через Module._resolveFilename(request, parent, isMain)
,
- функция
Module._resolveFilename
вызывается и проверяет, является ли модуль собственным (собственные модули возвращаются функцией NativeModule
, определенной в lib/internal/bootstrap_node.js),
если да, он вернет модуль, иначе он проверяет количество символов в пархе (минимум 2 символа) и некоторые символы (путь должен начинаться с ./
)
с помощью функции Module._resolveLookupPaths
, определенной в lib/internal/bootstrap_node.js
- проверьте каталог, содержащий файл
- Если путь содержит расширение (в нашем примере yes: mod.js), функция базового имени, определенная в lib/path.js, проверяет, является ли расширение "js"
- затем он создаст новый модуль для файла, указанного в аргументе
var module = new Module(filename, parent);
- содержимое будет скомпилировано через v8 с помощью функции
NativeModule.prototype.compile
, определенной в lib/internal/bootstrap_node.js
NativeModule.wrap
, определенный в lib/internal/bootstrap_node.js, берет контент javascript, скомпилированный из mod.js
, и упаковывает его: он упаковывает его в какой-то другой код, который выполняет всю эту работу.
Таким образом, код, который вы написали в mod.js
, обернут в выражение функции. это означает, что все, что вы пишете в узле, запускается в V8
- module.exports - это то, что возвращается
Ответ 4
Я копаю немного больше исходного кода nodejs/2/и делаю диаграмму последовательности /1/, надеюсь, это даст вам интуитивно понятный обзор. Есть еще одна статья http://fredkschott.com/post/2014/06/require-and-the-module-system/, которая также объясняет механизм require() в простом виде. Сначала прочитайте эту статью, чтобы помочь вам быстрее понять диаграмму.
![enter image description here]()
Ref:
/1/репозиторий схемы: https://github.com/z1yuan/nodejs.git
/2/https://github.com/nodejs/node-v0.x-archive.git
Ответ 5
Источник доступен здесь рядом с загрузками: http://nodejs.org/ export/require - это ключевые слова, я не думаю, что они закодированы в javascript напрямую. Node закодирован в С++, javascript - это всего лишь оболочка скриптов вокруг ядра С++.