Node.js
모듈 내보내기 및 사용
수색…
비고
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
내의 모든 파일에서 모듈 foo
를 require
수 있습니다.
노드는 (파일의 현재 디렉토리 / 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"의 이름을 지정할 필요가 없습니다.