[Node.js] 기본 핵심 모듈의 모듈

5474 단어 modulenode.js

소개


Node.js의 모듈 디자인은 모든 부품이 하나의 모듈로 되어 있다.모듈 순환 도입 문제는 Node에 있습니다.js는 어떻게 처리하는지, 모듈 불러오는 규칙은 또 어떤 것들이 있는지, 구체적인 상세한 내용은 아래를 보십시오.

모듈 정의


공용을 채택하다.js의 규칙, 키워드
exports.a = function () {};
//  
module.exports = {
    a: function () {}
};

모듈의 내부 변수


__dirname 현재 모듈의 폴더 주소
__filename 현재 모듈의 파일 주소
require.main 실행 메인 포털 파일
// node app.js
console.log(module.main); // app 

require.resolve 모듈에 대한 절대 경로 가져오기
// return /path/to/node_modules/express/lib/index.js
require.resolve('express'); 

exports 대상 모듈 내보내기 대상, 초기 대상과 module.exports 인용 주소 일치
모듈 대상은 모든 모듈에서,모듈의 자유 변수는 현재 모듈을 나타내는 대상을 가리키는 인용입니다.
module.children 현재 모듈은 다른 모듈의 집합을 도입합니다. 예는 다음과 같습니다.
const moduleA = reuqire('moduleA');
require.children = [moduleA];

module.parent 대상이 이 모듈의 대상을 가장 먼저 도입한다. 예는 다음과 같다.js
// node app.js 

const express = require('express');
console.log(module.parent); // undefined
module.exports = express();

main.js
const app = require('./app'); // moduleMain
app.listen(8080, function () {});

module.paths 모듈 검색 경로, 현재 모듈require 시 자동으로 불러오는 경로

모듈 설치


글로벌 설치


일반 모듈 전역 설치 모듈은 npm config get prefix +/lib/node_modules 디렉터리에서 모듈 내부는 자신의 node_에 의존합니다모듈 중.예: npm install -g express

/usr/local/lib/node_modules
                        |-- express
                            |-- package.json
                            |-- lib/ 
                            |-- node_modules
                                |-- qs
                                |-- cookie
                                |-- ...

실행 명령을 가진 모듈은 전역 설치npm install -g gulp, 모듈은 정의된 gulp 명령을 포함하고 있으며, npm config get prefix +/bin 디렉터리에 연결됩니다.
/usr/local/bin
           |-- gulp
/usr/local/lib/node_modules
                        |-- gulp
                            |-- package.json
                            |-- bin
                                |-- gulp.js
                            |-- node_modules
                                |-- gulp-util

로컬 설치


일반 모듈 부분 설치 모듈과 전체 모듈의 차이점process.cwd()+/node_모듈 디렉터리에 모듈과 의존 모듈을 동시에 설치하는 것은 일반적으로 같은 수준의 디렉터리에 있습니다.

./node_modules
            |-- express
                |-- package.json
                |-- lib/ 
            |-- qs
            |-- cookie
            |-- ...

실행 명령이 있는 모듈 부분 설치, bin 디렉터리가 node_modules/.bin 아래로 이동합니다

./node_modules
        |-- .bin
            |-- gulp
        |-- gulp
            |-- package.json
            |-- bin
                |-- gulp.js
        |-- gulp-util
        |-- ...

로드 모듈 메커니즘


상대 경로


// 1.   ./a.js
// 2.   ./a.json
// 3.   ./a.node
// 4.   ./a/index.js
// 5.   ./a/index.json
// 6.   ./a/index.node
const a = require('./a');

//  
const b = require('../b');

절대 경로

const path = require('path');
const c = require('/usr/local/lib/c');
const d = require(path.resolve(__dirname, './d'));

모듈 이름 일치


내장 모듈이 우선적으로 일치하고, 비내장 모듈은module를 사용합니다.paths 다중 경로 및 결합prefix+/lib/node_모듈을 불러옵니다.
  • 내장 모듈, 예를 들어 fs, http,net,path
  • 불러오기 시도
  • 로컬 모듈 로드./node_modules/express
  • NODE_ 로드PATH 디렉토리의 모듈 $NODE_PATH/express
  • 글로벌 디렉터리에 $HOME/.node_modules;$HOME/.node_libraries;$PREFIX/lib/node
  • 
    require.resolve('express');
    

    모듈 패키지


    모듈 코드를 실행하기 전에 Node.js는 다음과 같은 함수 패키지를 사용하여 패키지를 구성합니다.
    (function(exports, require, module, __filename, __dirname) {
    //  
    });

    이렇게 함으로써 Node.js는 다음과 같은 몇 가지를 실현했다.
  • 은 전역 대상이 아닌 모듈 범위 내에서 최상위 변수 (var,const 또는let 정의) 를 유지합니다.
  • 일반적으로 보이지만 실제로는 모듈별 변수(예:
  • 실현자는 모듈에서 값을 내보낼 수 있는 모듈과 exports 대상
  • 에 사용할 수 있다
  • 모듈 절대 파일 이름과 디렉토리 경로를 포함하는 단축 변수 __filename 및 __dirname


  • 모듈 순환 도입


    가령 a.jsb.js가 있다면 로드a.js 시 도입b.js, 동시b.js 도입a.js이 있다면 도입 순서는 어떻습니까?
    실제로
    a.js
    console.log('a  ');
    exports.done = false;
    const b = require('./b.js');
    console.log('  a  ,b.done = %j', b.done);
    exports.done = true;
    console.log('a  ');

    b.js
    console.log('b  ');
    exports.done = false;
    const a = require('./a.js');
    console.log('  b  ,a.done = %j', a.done);
    exports.done = true;
    console.log('b  ');

    main.js
    console.log('main  ');
    const a = require('./a.js');
    const b = require('./b.js');
    console.log('  main  ,a.done=%j,b.done=%j', a.done, b.done);

    실행 결과
    $ node main.js
    main  
    a  
    b  
      b  ,a.done = false
    b  
      a  ,b.done = true
    a  
      main  ,a.done=true,b.done=true

    메인js가 a.js를 불러올 때, a.js는 또 b.js를 불러옵니다.이 때, b.js는 a.js를 불러오려고 시도합니다.무한한 순환을 방지하기 위해 a.js의 exports 대상의 미완성 복사본을 b.js 모듈에 되돌려줍니다.그리고 b.js가 불러오기를 완료하고 exports 대상을 a.js 모듈에 제공합니다.

    참고 자료

  • module - 모듈
  • 좋은 웹페이지 즐겨찾기