Nice programing

node.js의 require ()는 어떻게 작동합니까?

nicepro 2020. 11. 2. 19:36
반응형

node.js의 require ()는 어떻게 작동합니까?


나는 이것을 시도했다 :

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

따라서 require () 이미지는 다음과 같이 구현 될 수 있습니다.

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

맞습니까? require () 또는 소스 코드를 어디서 찾을 수 있는지 이해하도록 도와주세요. 감사!


소스 코드는 여기에 있습니다 . exports/ require는 키워드가 아니라 전역 변수입니다. 메인 스크립트가됩니다 포장 하기 전에 시작 같은 모든 전역이 함수에서 require, process그 맥락에서 등.

module.js 자체가를 사용하는 동안 이는 require()다른 require 함수이며 "node.js"라는 파일에 정의 되어 있습니다.

위의 부작용 : 모듈 중간에 "return"문을 두어 (어떤 함수에도 속하지 않음) 코드의 나머지 부분을 효과적으로 "주석 처리"하는 것이 좋습니다.


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);

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

require는 경로라는 하나의 인수를 사용하는 함수입니다.이 경우 경로는 ./mod.js

require가 호출되면 일련의 작업이 발생합니다.

  1. 경로가 존재하고 문자열이라고 주장하는 lib / module.js에Module.prototype.require 선언 된 함수 호출

  2. 통해 파일을 해결하는 lib / module.jsModule._load 의 함수 인 호출 ,Module._resolveFilename(request, parent, isMain)

  3. Module._resolveFilename모듈 (네이티브 모듈에 의해 반환되는 네이티브의 경우 기능 검사라고하고 NativeModule정의 기능 lib 디렉토리 / 내부 / bootstrap_node.js 이는 parh의 문자 수 (에서 꼭 2를 확인 다른 모듈 돌아갑니다 예 경우) 문자 이상) 및 lib / internal / bootstrap_node.js 에 정의 된에 정의 된 함수 ./를 통해 일부 문자 (경로가로 시작되어야 함 )Module._resolveLookupPaths
  4. 파일이 포함 된 디렉토리를 확인하십시오.
  5. 경로에 확장자가 포함 된 경우 (예 : 예 : mod.js) lib / path.js에 정의 된 basename 함수 는 확장자가 " js " 인지 확인합니다.
  6. 그런 다음 인수에 지정된 파일에 대한 새 모듈을 생성합니다. var module = new Module(filename, parent);
  7. 내용은 lib / internal / bootstrap_node.js에NativeModule.prototype.compile 정의 된 함수를 통해 v8을 통해 컴파일됩니다.
  8. NativeModule.wrap에 정의 된 lib 디렉토리 / 내부 / bootstrap_node.js은 의 컴파일 된 자바 스크립트의 내용을 소요 mod.js하고 랩 : 그것은이 모든 일을 만드는 다른 코드에 랩합니다. 따라서 작성한 코드 mod.js는 함수 표현식으로 래핑됩니다. 즉, node에 작성한 모든 것이 V8에서 실행됩니다.
  9. module.exports가 반환됩니다.

나는 nodejs 소스 코드 / 2 /를 조금 더 파고 시퀀스 다이어그램 / 1 /을 만듭니다. 이것이 직관적 인 개요를 제공 할 수 있기를 바랍니다. require () 메커니즘을 쉽게 설명하는 또 다른 기사 http://fredkschott.com/post/2014/06/require-and-the-module-system/ 이 있습니다.이 기사를 먼저 살펴보면 도움이 될 수 있습니다. 다이어그램을 빨리 이해하십시오.여기에 이미지 설명 입력

참고 :

/ 1 / 다이어그램 소스 저장소 : https://github.com/z1yuan/nodejs.git

/ 2 / https://github.com/nodejs/node-v0.x-archive.git


소스는 여기에서 다운로드 할 수 있습니다. http://nodejs.org/ exports / require는 키워드이며, 자바 스크립트로 직접 코딩 된 것 같지는 않습니다. Node는 C ++로 코딩되고 javascript는 C ++ 코어를 둘러싼 스크립팅 쉘일뿐입니다.

참고 URL : https://stackoverflow.com/questions/9475792/how-does-require-in-node-js-work

반응형