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!
Author: Trantor Liu, 2012-02-28

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

 45
Author: Andrey Sidorov,
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);
 8
Author: Andy,
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ń:

  1. Wywołanie Module.prototype.require funkcji zadeklarowanej w lib/module.js, które twierdzą, że ścieżka istnieje i jest ciągiem znaków

  2. Wywołanie Module._load, które jest funkcją w lib/module.js, które rozwiązują plik poprzez Module._resolveFilename(request, parent, isMain),

  3. Funkcja Module._resolveFilename jest wywoływana i sprawdza, czy moduł jest natywny (Moduły natywne są zwracane przez NativeModule 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 ./) poprzez Module._resolveLookupPaths funkcję zdefiniowaną w lib / internal / bootstrap_node.js
  4. sprawdź katalog zawierający plik
  5. 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 "
  6. następnie utworzy nowy moduł dla pliku podanego w argumencie var module = new Module(filename, parent);
  7. zawartość zostanie skompilowana przez v8 za pomocą funkcji NativeModule.prototype.compile zdefiniowanej w lib/internal/bootstrap_node.js
  8. NativeModule.wrap zdefiniowane w lib/internal/bootstrap_node.js pobiera zawartość javascript skompilowaną z mod.js i zawija: zawija go w inny kod, który sprawia, że wszystko to działa. Więc kod, który napisałeś w mod.js jest zawinięty w wyrażenie funkcji. oznacza to, że wszystko, co piszesz w node, jest uruchamiane w V8
  9. moduł.eksport jest tym, co zostało zwrócone
 4
Author: Mohamed Ben HEnda,
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++.

 -8
Author: mpm,
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