Node.js module.exports의 목적은 무엇이며 어떻게 사용합니까?

Node.js의 목적은 무엇입니까?module.exports어떻게 사용하는가?

이에 대한 정보는 찾을 수 없지만 소스 코드에서 자주 볼 수 있는 Node.js의 중요한 부분인 것 같습니다.

Node.js 매뉴얼에 따르면:

모듈

전류에 대한 참조module특히module.exportsexport 객체와 동일합니다.src/node.js자세한 정보는.

하지만 이것은 별로 도움이 되지 않는다.

정확히 어떤 일입니까?module.exports그럼 간단한 예는 무엇일까요?



질문에 대한 답변



module.exports 실제로 반환되는 오브젝트입니다.require불러.

exports변수는 처음에 동일한 개체(즉, 줄임말”)로 설정되므로 모듈 코드에는 보통 다음과 같이 씁니다.

let myFunc1 = function() { ... }; let myFunc2 = function() { ... }; exports.myFunc1 = myFunc1; exports.myFunc2 = myFunc2; 

내부 범위 함수를 내보내다(또는 “실행”)myFunc1그리고.myFunc2.

그리고 발신자 코드에는 다음과 같은 것을 사용합니다.

const m = require('./mymodule'); m.myFunc1(); 

여기서 마지막 행은 결과가 어떻게 되는지를 보여준다.require는 (통상은) 속성에 액세스 할 수 있는 단순한 오브젝트입니다.

NB: 덮어쓸 경우exports그러면 더 이상 이 모든 것을 가리키지 않을 것이다.module.exports새로운 오브젝트(또는 함수 참조)를 할당하고 싶은 경우exports새로운 오브젝트도 할당해야 합니다.module.exports


주의할 필요가 있는 것은, 이 이름이exportsobject는 추가할 값의 모듈의 내부 범위 이름과 같을 필요는 없습니다.따라서 다음과 같은 작업을 수행할 수 있습니다.

let myVeryLongInternalName = function() { ... }; exports.shortName = myVeryLongInternalName; // add other objects, functions, as required 

그 다음:

const m = require('./mymodule'); m.shortName(); // invokes module.myVeryLongInternalName 



이것은 이미 회답이 되었습니다만, 몇 가지 설명을 덧붙이고 싶습니다만…

둘 다 사용할 수 있습니다.exports그리고.module.exports다음과 같이 코드를 응용 프로그램에 Import합니다.

var mycode = require('./path/to/mycode');

표시되는 기본 사용 사례(Express 등)JS 예제 코드)는 다음과 같이 속성을 설정하는 것입니다.exports.timeout 파일 내의 오브젝트를 Import합니다.require()

간단한 계산 예에서는 다음과 같이 할 수 있습니다.

(counter.filename):

var count = 1;
exports.increment = function() {
count++; };
exports.getCount = function() {
return count; }; 

응용 프로그램(web.dll 또는 기타 .dll 파일):

var counting = require('./counter.js');
console.log(counting.getCount()); // 1 counting.increment(); console.log(counting.getCount()); // 2 

간단히 말하면, 필요한 파일을 단일 객체를 반환하는 함수로 생각할 수 있습니다.또한 이러한 파일을 설정함으로써 반환되는 객체에 속성(스트링, 숫자, 배열, 함수 등)을 추가할 수 있습니다.exports.

경우에 따라서는 오브젝트를 반환하고 싶을 수 있습니다.require()call은 단순히 속성을 가진 객체가 아니라 호출할 수 있는 함수입니다.이 경우 다음 설정도 필요합니다.module.exports, 다음과 같이 합니다.

(안녕하세요) :

module.exports = exports = function() {
console.log("Hello World!"); }; 

(app.disples):

var sayHello = require('./sayhello.js'); sayHello(); // "Hello World!" 

exports와 module.exports의 차이는 이 답변에서 더 잘 설명됩니다.




주의:JS 모듈 메커니즘은 Common을 기반으로 합니다.RequireJs와 같은 다른 많은 구현에서 지원되는 JS 모듈뿐만 아니라 SprootCore, CouchDB, Wakanda, OrientDB, ArangoDB, RingoJs, TeaJs, SilkJs, curl.js 또는 Adobe Photoshop(PSLib 경유)도 지원합니다.여기에서는, 기존의 실장 전체의 리스트를 참조할 수 있습니다.

모듈이 노드 고유의 기능이나 모듈을 사용하지 않는 한exports대신module.exports 그것은 공통의 일부가 아니다.JS 표준이며, 다른 구현에서는 대부분 지원되지 않습니다.

다른 노드JS 고유의 기능은 새로운 오브젝트에 대한 참조를 할당하는 것입니다.exports이 스레드에서 Jed Watson이 제공한 마지막 예시와 같이 속성과 메서드를 추가하는 것만이 아니라나는 개인적으로 이 관행을 저지할 것이다. 왜냐하면 이것은 공통의 순환 참조 지원을 깨뜨리기 때문이다.JS 모듈메커니즘그 후 모든 구현에서 지원되는 것은 아니며 보다 범용적인 모듈을 제공하기 위해 Jed의 예를 다음과 같이 기술해야 합니다(또는 유사한 예).

(안녕하세요) :

exports.run = function() {
console.log("Hello World!"); } 

(app.disples):

var sayHello = require('./sayhello'); sayHello.run(); // "Hello World!" 

또는 ES6 기능 사용

(안녕하세요) :

Object.assign(exports, {
// Put all your public API here
sayhello() {
console.log("Hello World!");
} }); 

(app.disples):

const { sayHello } = require('./sayhello'); sayHello(); // "Hello World!" 

PS: Appcelerator도 Common을 실장하고 있는 것 같습니다.JS 모듈(단, 순환 참조 지원 없음) (AcceleratorCommon 참조)JS 모듈(캐싱순환 참조)




새 개체에 대한 참조를 할당할 때 주의해야 할 몇 가지 사항:exports및/또는modules.exports:

(1) 원고에 이미 첨부한 모든 성질 및 방법exports또는module.exports내보낸 개체가 다른 새 개체를 참조하기 때문에 당연히 손실됩니다.

이것은 명백하지만 기존 모듈의 선두에 내보내기된 메서드를 추가할 경우 내보낸 네이티브 객체가 마지막에 다른 객체를 참조하고 있지 않은지 확인하십시오.

exports.method1 = function () {}; // exposed to the original exported object exports.method2 = function () {}; // exposed to the original exported object
module.exports.method3 = function () {}; // exposed with method1 & method2
var otherAPI = {
// some properties and/or methods }
exports = otherAPI; // replace the original API (works also with module.exports) 

(2) 다음 중 하나에 해당하는 경우exports또는module.exports새로운 값을 참조합니다.더 이상 같은 오브젝트를 참조하지 않습니다.

exports = function AConstructor() {}; // override the original exported object exports.method2 = function () {}; // exposed to the new exported object
// method added to the original exports object which not exposed any more module.exports.method3 = function () {};

3. 까다로운 결과입니다.둘 다에 대한 참조를 변경하면exports그리고.module.exports어떤 API가 노출되어 있는지 알 수 없습니다.module.exports성공)

// override the original exported object module.exports = function AConstructor() {};
// try to override the original exported object // but module.exports will be exposed instead exports = function AnotherConstructor() {};



module.property 또는 exports 객체는 모듈이 애플리케이션과 공유할 항목을 선택할 수 있도록 합니다.

enter image description here

module_export에 관한 비디오는 이쪽에서 입수할 수 있습니다.