Как работает require () в node.js? - PullRequest
67 голосов
/ 28 февраля 2012

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

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

Ответы [ 4 ]

48 голосов
/ 28 февраля 2012

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

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

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

8 голосов
/ 24 декабря 2014

Андрей показал исходный код, но если вам интересно, как его использовать, простое и простое объяснение здесь (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);
6 голосов
/ 24 октября 2017
var mod = require('./mod.js');

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

, когда вызывается требование, выполняется последовательность задач:

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

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

  3. , вызывается функция Module._resolveFilename и проверяет, является ли модуль собственным(Собственные модули возвращаются функцией NativeModule, определенной в lib / internal / bootstrap_node.js ), если да, он возвращает модуль, в противном случае он проверяет количество символов в parh (необходимо 2 символа вминимум) и некоторые символы (путь должен начинаться с ./) с помощью функции Module._resolveLookupPaths, определенной в lib / internal / bootstrap_node.js
  4. проверьте каталог, содержащий файл
  5. Если путь содержитрасширение (в нашем примере yes: 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 - это то, что возвращается
0 голосов
/ 28 февраля 2012

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

...