javascript - модули - require()




Как работает require() в node.js? (3)

Источник доступен здесь рядом с загрузками: http://nodejs.org/ export / require - это ключевые слова, я не думаю, что они закодированы в javascript напрямую. Узел закодирован в C ++, javascript - это всего лишь оболочка скриптов вокруг ядра C ++.

Я попробовал это:

// 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 () или где я могу найти исходный код. Спасибо!


Исходный код here . exports / require - это не ключевые слова, а глобальные переменные. Ваш основной скрипт wrapped перед start в функции, которая имеет все глобальные переменные, такие как require , process т. Д. В своем контексте.

Обратите внимание, что хотя сам module.js использует require() , это другая требуемая функция, и она defined в файле с именем node.js,

Побочный эффект выше: отлично, чтобы иметь «возврат» в середине вашего модуля (не принадлежащий какой-либо функции), эффективно «комментируя» остальную часть кода


var mod = require('./mod.js');

Требование - это функция, которая принимает один аргумент, называемый path, в этом случае путь равен ./mod.js

при вызове require происходит последовательность задач:

  1. вызовите функцию Module.prototype.require объявленную в lib/module.js которые утверждают, что путь существует и был строкой

  2. вызовите Module._load который является функцией в lib/module.js которая разрешает файл через Module._resolveFilename(request, parent, isMain) ,

  3. Module._resolveFilename функция Module._resolveFilename и проверяется, является ли модуль родным (родные модули возвращаются функцией NativeModule определенной в lib/internal/bootstrap_node.js ), если да, он вернет модуль еще, он проверяет количество символов в parh (должно быть не менее 2 символов) и некоторые символы (путь должен начинаться с ./ ) с помощью функции Module._resolveLookupPaths определенной в lib/internal/bootstrap_node.js
  4. проверьте каталог, содержащий файл
  5. Если путь содержит расширение (в нашем примере да: mod.js), функция basename, определенная в lib/path.js проверяет, что расширение является « js »,
  6. то он создаст новый модуль для файла, заданного в аргументе var module = new Module(filename, parent);
  7. содержимое будет скомпилировано через v8 через функцию NativeModule.prototype.compile определенную в lib/internal/bootstrap_node.js
  8. NativeModule.wrap определенный в lib/internal/bootstrap_node.js принимает содержимое javascript, составленное из mod.js и обертывает его: он переносит его в другой код, который заставляет все это работать. Таким образом, код, который вы написали в mod.js , завернут в выражение функции. это означает, что все, что вы пишете в узле, запускается в V8
  9. то возвращается module.exports




apply