Подтвердить что ты не робот

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

4b9b3361

Ответ 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

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

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

Ответ 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 - это всего лишь оболочка скриптов вокруг ядра С++.