Como o require () no node.js funciona?

Eu tentei isso:

// 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? 

Então eu imagem que require () pode ser implementar assim:

 var require = function (file) { var exports = {}; var run = function (file) { // include "file" here and run }; run.apply(exports, [file]); return exports; } 

Isso esta certo? Por favor me ajude a entender require (), ou onde posso encontrar o código-fonte. Obrigado!

O código fonte está aqui . exports / require não são palavras-chave, mas variables ​​globais. Seu script principal é empacotado antes de iniciar em uma function que tenha todos os globals como require , process , etc em seu contexto.

Observe que, enquanto o module.js em si está usando require() , essa é uma function require diferente e é definida no arquivo chamado “node.js”

Efeito colateral de cima: está perfeitamente bem ter a instrução “return” no meio do seu módulo (não pertencendo a nenhuma function), efetivamente “comentando” o resto do código

Andrey mostrou o código fonte, mas se você também quer saber como usá-lo, a explicação fácil e simples está aqui ( http://nodejs.org/api/modules.html ).

Estes foram dois bons exemplos para mim.

 //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; } }; } 

Meu padrão favorito é

 (function (controller) { controller.init = function (app) { app.get("/", function (req, res) { res.render("index", {}); }); }; })(module.exports); 
 var mod = require('./mod.js'); 

O require é uma function que recebe um argumento chamado path, neste caso o caminho é ./mod.js

quando o require é invocado, ocorrem seqüências de tarefas:

  1. Module.prototype.require function Module.prototype.require declarada em lib / module.js, que afirma que o caminho existe e era uma string.

  2. chame Module._load que é uma function em lib / module.js que resolve o arquivo através de Module._resolveFilename(request, parent, isMain) ,

  3. a function Module._resolveFilename é chamada e verifica se o módulo é nativo (os módulos nativos são retornados pela function NativeModule definida em lib / internal / bootstrap_node.js ), se sim ele retornará o módulo caso contrário ele verifica o número de caracteres do parh (deve ter pelo menos 2 caracteres) e alguns caracteres (o caminho deve ser iniciado por ./ ) através da function Module._resolveLookupPaths definida em lib / internal / bootstrap_node.js
  4. verifique o diretório que contém o arquivo
  5. Se o caminho contiver uma extensão (no nosso exemplo sim: mod.js), a function basename definida em lib / path.js verifica se a extensão é ” js
  6. então ele irá criar um novo módulo para o arquivo dado no argumento var module = new Module(filename, parent);
  7. o conteúdo será compilado via v8 através da function NativeModule.prototype.compile definida em lib / internal / bootstrap_node.js
  8. o NativeModule.wrap definido em lib / internal / bootstrap_node.js pega o conteúdo javascript compilado de mod.js e o envolve: ele o envolve em algum outro código que faz todo esse trabalho funcionar. Então, o código que você escreveu em mod.js é empacotado em uma expressão de function. isso significa que tudo que você escreve no nó é executado no V8
  9. um module.exports é o que é retornado

A fonte está disponível aqui ao lado dos downloads: http://nodejs.org/ exports / require são palavras-chave, não acho que elas sejam codificadas diretamente no JavaScript. O nó é codificado em C ++, o javascript é apenas um shell de script em torno do núcleo C ++.

Intereting Posts