수색…


비고

Node.js의 모든 것은 일반적으로 비동기 적으로 완료되지만 require() 는 그러한 것들 중 하나가 아닙니다. 실제로 모듈은 한 번만로드하면되므로 블로킹 동작이므로 올바르게 사용해야합니다.

모듈은 처음로드 된 후에 캐시됩니다. 개발중인 모듈을 편집하는 경우 새 변경 사항을 사용하려면 모듈 캐시에서 해당 항목을 삭제해야합니다. 즉, 모듈 캐시에서 모듈을 지우더라도 모듈 자체는 가비지 수집되지 않으므로 프로덕션 환경에서 사용하기 위해서는주의를 기울여야합니다.

모듈로드 및 사용

모듈은 require() 함수에 의해 "import"될 수도 있고 require() 될 수도 있습니다. 예를 들어 Node.js와 함께 제공되는 http 모듈을로드하려면 다음을 사용할 수 있습니다.

const http = require('http');

런타임과 함께 제공되는 모듈 외에도 express와 같이 npm에서 설치 한 모듈을 요구할 수도 있습니다. npm install express 를 통해 이미 Express를 시스템에 설치했다면 다음과 같이 간단히 작성할 수 있습니다.

const express = require('express');

또한 응용 프로그램의 일부로 직접 작성한 모듈을 포함시킬 수도 있습니다. 이 경우 lib.js 라는 파일을 현재 파일과 같은 디렉토리에 포함 시키려면 다음을 수행하십시오.

const mylib = require('./lib');

확장자는 생략 할 수 있으며 .js 가 사용됩니다. 모듈을로드하면 변수는 필요한 파일에서 게시 된 메서드 및 속성이 들어있는 객체로 채워집니다. 전체 예제 :

const http = require('http');

// The `http` module has the property `STATUS_CODES`
console.log(http.STATUS_CODES[404]); // outputs 'Not Found'

// Also contains `createServer()`
http.createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('<html><body>Module Test</body></html>');
  res.end();
}).listen(80);

hello-world.js 모듈 만들기

Node는 module.exports 인터페이스를 제공하여 함수와 변수를 다른 파일에 표시합니다. 이렇게하는 가장 간단한 방법은 첫 번째 예에서와 같이 하나의 개체 (함수 또는 변수) 만 내보내는 것입니다.

hello-world.js

module.exports = function(subject) {
    console.log('Hello ' + subject);
};

전체 내보내기를 단일 객체로 만들고 싶지 않으면 함수 및 변수를 exports 객체의 속성으로 내보낼 수 있습니다. 다음 세 가지 예제는 모두이 방식을 약간 다르게 보여줍니다.

  • hello-venus.js : 함수 정의가 별도로 수행 된 다음 module.exports 의 속성으로 추가됩니다.
  • hello-jupiter.js : 함수 정의는 module.exports 의 속성 값으로 직접 module.exports
  • hello-mars.js : 함수 정의는 module.exports 의 짧은 버전 인 exports 속성으로 직접 선언됩니다.

hello-venus.js

function hello(subject) {
    console.log('Venus says Hello ' + subject);
}

module.exports = {
    hello: hello
};

hello-jupiter.js

module.exports = {
    hello: function(subject) {
      console.log('Jupiter says hello ' + subject);
    },

    bye: function(subject) {
      console.log('Jupiter says goodbye ' + subject);
    }
};

hello-mars.js

exports.hello = function(subject) {
    console.log('Mars says Hello ' + subject);
};

디렉토리 이름이있는 모듈로드 중

다음 파일을 포함하는 hello 라는 디렉토리가 있습니다.

index.js

// hello/index.js
module.exports = function(){
    console.log('Hej');
};

main.js

// hello/main.js
// We can include the other files we've defined by using the `require()` method
var hw = require('./hello-world.js'),
    hm = require('./hello-mars.js'),
    hv = require('./hello-venus.js'),
    hj = require('./hello-jupiter.js'),
    hu = require('./index.js');

// Because we assigned our function to the entire `module.exports` object, we
// can use it directly
hw('World!'); // outputs "Hello World!"

// In this case, we assigned our function to the `hello` property of exports, so we must
// use that here too
hm.hello('Solar System!'); // outputs "Mars says Hello Solar System!"

// The result of assigning module.exports at once is the same as in hello-world.js
hv.hello('Milky Way!'); // outputs "Venus says Hello Milky Way!"

hj.hello('Universe!'); //  outputs "Jupiter says hello Universe!"
hj.bye('Universe!'); // outputs "Jupiter says goodbye Universe!"

hu(); //output 'hej'

모듈 캐시 무효화

개발 과정에서 동일한 모듈에 대해 require() 를 여러 번 사용하면 해당 파일을 변경 했더라도 항상 동일한 모듈을 반환한다는 것을 알 수 있습니다. 이것은 모듈이 처음로드 될 때 캐시되고 이후 모듈로드는 캐시에서로드되기 때문입니다.

이 문제를 해결하려면 캐시에서 항목을 delete 해야합니다. 예를 들어, 모듈을로드 한 경우 :

var a = require('./a');

그런 다음 캐시 항목을 삭제할 수 있습니다.

var rpath = require.resolve('./a.js');
delete require.cache[rpath];

그런 다음 모듈을 다시 요구하십시오.

var a = require('./a');

delete 는로드 된 모듈 자체에 대한 참조 만 삭제하므로 프로덕션에서는 권장되지 않습니다. 모듈이 가비지 수집되지 않으므로이 기능을 부적절하게 사용하면 메모리 누수가 발생할 수 있습니다.

자신의 모듈 만들기

객체를 공개적으로 내보내고 계속 객체에 계속 추가 할 수 있습니다.

const auth = module.exports = {}
const config = require('../config')
const request = require('request')

auth.email = function (data, callback) {
  // Authenticate with an email address
}

auth.facebook = function (data, callback) {
  // Authenticate with a Facebook account
}

auth.twitter = function (data, callback) {
  // Authenticate with a Twitter account
}

auth.slack = function (data, callback) {
  // Authenticate with a Slack account
}

auth.stack_overflow = function (data, callback) {
  // Authenticate with a Stack Overflow account
}

이 중 하나를 사용하려면 일반적으로 모듈을 필요로합니다.

const auth = require('./auth')

module.exports = function (req, res, next) {
  auth.facebook(req.body, function (err, user) {
    if (err) return next(err)

    req.user = user
    next()
  })
}

모든 모듈은 한 번만 주입됩니다.

NodeJS는 처음 모듈을 요구할 때만 모듈을 실행합니다. 더 이상 필요한 함수는 동일한 Object를 다시 사용하므로 다른 시간에 모듈의 코드를 실행하지 않습니다. 또한 노드는 require를 사용하여 모듈을 처음로드 할 때 캐시합니다. 이렇게하면 파일 읽기 횟수가 줄어들고 응용 프로그램의 속도가 빨라집니다.

myModule.js

console.log(123) ; 
exports.var1 = 4 ; 

index.js

var a=require('./myModule') ; // Output 123
var b=require('./myModule') ; // No output
console.log(a.var1) ; // Output 4
console.log(b.var1) ; // Output 4
a.var2 = 5 ; 
console.log(b.var2) ; // Output 5

node_modules에서 모듈로드

모듈은 상대 경로를 사용하지 않고 node_modules 라는 특수 디렉토리에 배치하여 d를 require 수 있습니다.

예를 들어, index.js 파일에서 foo 라는 모듈을 require 하려면 다음 디렉토리 구조를 사용할 수 있습니다.

index.js
 \- node_modules
  \- foo
   |- foo.js
   \- package.json

모듈은 package.json 파일과 함께 디렉토리 안에 있어야합니다. package.json 파일의 main 필드는 모듈의 진입 점을 가리켜 야합니다. 이는 사용자가 require('your-module') 할 때 가져온 파일입니다 require('your-module') . main 제공되지 않은 경우 index.js 기본 설정됩니다. 또는 require 호출에 대한 상대 경로를 추가하여 모듈을 기준으로 파일을 참조 할 수 있습니다. require('your-module/path/to/file') .

모듈은 node_modules 디렉토리에서 파일 시스템 계층까지 d를 require 수도 있습니다. 우리가 다음 디렉토리 구조를 가지고 있다면 :

my-project
\- node_modules
 |- foo   // the foo module
  \- ...
 \- baz   // the baz module
  \- node_modules
   \- bar   // the bar module

require('foo') 사용하여 bar 내의 모든 파일에서 모듈 foorequire 수 있습니다.

노드는 (파일의 현재 디렉토리 / node_modules)부터 시작하여 파일 시스템 계층에서 파일에 가장 가까운 모듈과 만 일치합니다. 노드는이 방법으로 디렉토리를 파일 시스템 루트까지 일치시킵니다.

npm 레지스트리 또는 다른 npm 레지스트리에서 새 모듈을 설치하거나 직접 만들 수 있습니다.

모듈로서의 폴더

모듈은 동일한 폴더에있는 여러 .js 파일로 분할 될 수 있습니다. my_module 폴더의 예제 :

function_one.js

module.exports = function() {
  return 1;
}

function_two.js

module.exports = function() {
  return 2;
}

index.js

exports.f_one = require('./function_one.js');
exports.f_two = require('./function_two.js');

이 모듈은 폴더 이름으로 모듈을 참조하여 사용합니다.

var split_module = require('./my_module');

require 함수 인수에서 ./ 또는 폴더에 대한 경로 표시를 생략하여 필요하면 Node는 node_modules 폴더에서 모듈로드를 시도합니다.

또는 같은 폴더에 다음과 같은 내용으로 package.json 파일을 만들 수 있습니다.

{
    "name": "my_module",
    "main": "./your_main_entry_point.js"
}

이렇게하면 기본 모듈 파일 "index"의 이름을 지정할 필요가 없습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow