etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2022. 2. 19. 05:48
반응형

질문자 :mrwooster


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

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

Node.js 문서 에 따르면 :

기준 치수

module 대한 참조입니다. 특히 module.exports 는 내보내기 객체와 동일합니다. 자세한 내용은 src/node.js 를 참조하세요.

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

module.exports 는 정확히 무엇을 하며 간단한 예는 무엇입니까?



module.exports require 호출의 결과로 실제로 반환되는 객체입니다.

exports 변수는 처음에 동일한 객체로 설정됩니다(즉, 약칭 "별칭"). 따라서 모듈 코드에서 일반적으로 다음과 같이 작성합니다.

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

myFunc1myFunc2 를 내보내거나 "노출"합니다.

그리고 호출 코드에서 다음을 사용합니다.

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

여기서 마지막 줄은 require 의 결과가 (일반적으로) 속성에 액세스할 수 있는 일반 객체임을 보여줍니다.

주의: exports module.exports 참조하지 않습니다. exports 새 객체(또는 함수 참조)를 할당하려면 해당 새 객체를 module.exports


exports 개체에 추가된 이름은 추가하는 값에 대한 모듈의 내부 범위 이름과 같을 필요가 없으므로 다음을 수행할 수 있습니다.

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

다음에:

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

Alnitak

이것은 이미 답변되었지만 몇 가지 설명을 추가하고 싶었습니다 ...

exportsmodule.exports 를 모두 사용하여 다음과 같이 애플리케이션으로 코드를 가져올 수 있습니다.

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

기본 사용 사례(예: ExpressJS 예제 코드에서)는 exports require() 사용하여 가져오는 것입니다.

따라서 간단한 계산 예에서 다음을 가질 수 있습니다.

(counter.js):

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

... 그런 다음 애플리케이션(web.js 또는 다른 .js 파일)에서 다음을 수행합니다.

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

exports 에 설정하여 반환되는 객체에 속성(문자열, 숫자, 배열, 함수 등)을 추가할 수 있습니다.

require() 호출에서 반환된 객체가 속성이 있는 객체가 아니라 호출할 수 있는 함수가 되기를 원할 것입니다. 이 경우 다음과 같이 module.exports 도 설정해야 합니다.

(sayhello.js):

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

(app.js):

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

export 와 module.exports 의 차이점은 여기 이 답변에서 더 잘 설명되어 있습니다.


Jed Watson

NodeJS 모듈 메커니즘은 RequireJS 뿐만 아니라 SproutCore , CouchDB , Wakanda , OrientDB , ArangoDB , RingoJS , TeaJS , SilkJS , curl.js 또는 Adobe Photoshop (PSLib 를 통해)과 같은 다른 많은 구현에서 지원되는 CommonJS 모듈을 기반으로 합니다. ).여기 에서 알려진 구현의 전체 목록을 찾을 수 있습니다.

모듈이 노드 특정 기능이나 모듈을 사용 하지 않는 한, CommonJS 표준의 일부가 아닌 module.exports 대신 exports 를 사용하고 대부분 다른 구현에서 지원하지 않는 것이 좋습니다.

당신이에 새로운 객체에 대한 참조를 할당 할 때 또 다른 NodeJS의 특정 기능입니다 exports 대신이 스레드에서 제드 왓슨에 의해 제공되는 마지막 예제처럼 그것에 속성과 메서드를 추가합니다. CommonJS 모듈 메커니즘 의 순환 참조 지원 이 중단되므로 개인적으로 이 관행을 권장하지 않습니다. 그런 다음 모든 구현에서 지원되지 않으며 Jed 예제는 더 보편적인 모듈을 제공하기 위해 다음과 같은 방식으로(또는 유사한 방식으로) 작성되어야 합니다.

(sayhello.js):

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

(app.js):

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

또는 ES6 기능 사용

(sayhello.js):

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

(app.js):

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

추신: Appcelerator도 CommonJS 모듈을 구현하지만 순환 참조 지원이 없는 것처럼 보입니다( Appcelerator 및 CommonJS 모듈(캐싱 및 순환 참조) 참조 ).


Alexandre Morgaut

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)

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. 까다로운 결과. exportsmodule.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() {};

Alexandre Morgaut

module.exports 속성 또는 내보내기 개체를 사용하면 모듈이 애플리케이션과 공유할 항목을 선택할 수 있습니다.

여기에 이미지 설명 입력

여기 에 module_export에 대한 비디오가 있습니다.


anish

프로그램 코드를 여러 파일로 나눌 때 module.exports 는 변수와 함수를 모듈 소비자에게 게시하는 데 사용됩니다. 소스 파일의 require() 호출은 모듈에서 로드된 module.exports 로 대체됩니다.

모듈을 작성할 때 기억하십시오

  • 모듈 로드는 캐시되며 초기 호출만 JavaScript를 평가합니다.
  • 모든 것을 내보낼 필요는 없지만 모듈 내에서 지역 변수와 함수를 사용할 수 있습니다.
  • module.exports exports 약어로도 사용할 수 있습니다. 그러나 유일한 함수를 반환할 때는 항상 module.exports 사용하십시오.

모듈 내보내기 다이어그램

"모듈 파트 2 - 모듈 작성" 에 따르면 .


pspi

참조 링크는 다음과 같습니다.

 exports = module.exports = function(){ //.... }

함수 또는 변수와 같은 exports 또는 module.exports 의 속성은 외부에 노출됩니다.

더 주의해야 할 것이 override . export를 무시하지 마십시오.

왜요 ?

module.exports의 참조만 내보내기 때문에 내보내기에 속성을 추가할 수 있지만 내보내기를 재정의하면 참조 링크가 끊어집니다.

좋은 예:

 exports.name = 'william'; exports.getName = function(){ console.log(this.name); }

나쁜 예:

 exports = 'william'; exports = function(){ //... }

다음과 같이 하나의 함수 또는 변수만 노출하려는 경우:

 // test.js var name = 'william'; module.exports = function(){ console.log(name); } // index.js var test = require('./test'); test();

이 모듈은 하나의 기능만 노출했으며 name의 속성은 외부에 대해 private입니다.


qianjiahao

http, sys 등과 같은 node.js를 다운로드하여 설치할 때 node.js에 일부 기본 또는 기존 모듈이 있습니다.

그것들은 이미 node.js에 있기 때문에 이러한 모듈을 사용하고 싶을 때 기본적으로 import modules 을 선호하지만 그 이유는 무엇입니까? 왜냐하면 그것들은 이미 node.js에 존재하기 때문입니다. 가져오기는 node.js에서 가져와서 프로그램에 넣는 것과 같습니다. 그리고 그것들을 사용합니다.

Exports 가 정확히 반대인 반면, 원하는 모듈을 생성하는 것입니다. 모듈 추가를 가정해 봅시다. 그리고 해당 모듈을 node.js에 넣으면 내보내기를 통해 수행합니다.

내가 여기에 아무것도를 작성하기 전에, module.exports.additionTwo가 exports.additionTwo으로 동일 기억


Community Wiki

모듈은 관련 코드를 단일 코드 단위로 캡슐화합니다. 모듈을 생성할 때 관련된 모든 기능을 파일로 옮기는 것으로 해석할 수 있습니다.

두 가지 기능을 포함하는 Hello.js 파일이 있다고 가정합니다.

 sayHelloInEnglish = function() { return "Hello"; }; sayHelloInSpanish = function() { return "Hola"; };

코드의 유용성이 둘 이상의 호출일 때만 함수를 작성합니다.

World.js와 같은 다른 파일로 함수의 유용성을 높이고 싶다고 가정합니다. 이 경우 파일 내보내기가 module.exports로 얻을 수 있는 그림으로 나타납니다.

아래에 주어진 코드로 두 함수를 모두 내보낼 수 있습니다.

 var anyVariable={ sayHelloInEnglish = function() { return "Hello"; }; sayHelloInSpanish = function() { return "Hola"; }; } module.export=anyVariable;

이제 이러한 기능을 사용하려면 World.js에 파일 이름을 입력해야 합니다.

 var world= require("./hello.js");

Shantanu Madane

의도는 다음과 같습니다.

모듈식 프로그래밍은 프로그램의 기능을 독립적이고 상호 교환 가능한 모듈로 분리하는 것을 강조하는 소프트웨어 설계 기술입니다. 각 모듈에는 원하는 기능의 한 측면만 실행하는 데 필요한 모든 것이 포함됩니다.

위키피디아

모듈식/재사용 가능한 코드 없이 큰 프로그램을 작성하는 것이 어려워진다고 생각합니다. nodejs에서 우리가 사용하는 모듈 형 프로그램을 만들 수 있습니다 module.exports 우리는 노출과 우리의 프로그램을 구성하는 것을 정의하는 require .

다음 예를 시도해 보세요.

파일로그.js

 function log(string) { require('fs').appendFileSync('log.txt',string); } module.exports = log;

stdoutLog.js

 function log(string) { console.log(string); } module.exports = log;

프로그램.js

 const log = require('./stdoutLog.js') log('hello world!');

실행하다

$ 노드 프로그램.js

안녕 세계!

이제 ./stdoutLog.js./fileLog.js 로 바꿔보십시오.


Moriarty

모듈 시스템의 목적은 무엇입니까?

다음과 같은 작업을 수행합니다.

  1. 파일이 정말 큰 크기로 팽창하지 않도록 합니다. 예를 들어 5000줄의 코드가 포함된 파일을 갖는 것은 일반적으로 개발 중에 처리하기가 정말 어렵습니다.
  2. 우려의 분리를 시행합니다. 코드를 여러 파일로 분할하면 모든 파일에 적절한 파일 이름을 가질 수 있습니다. 이렇게 하면 모든 모듈이 무엇을 하고 어디서 찾을 수 있는지 쉽게 식별할 수 있습니다(여전히 사용자 책임인 논리적 디렉토리 구조를 만들었다고 가정).

모듈을 사용하면 코드의 특정 부분을 더 쉽게 찾을 수 있어 코드를 유지 관리할 수 있습니다.

어떻게 작동합니까?

NodejS 는 다음과 같은 방식으로 작동하는 CommomJS 모듈 시스템을 사용합니다.

  1. 파일이 무언가를 내보내 module.export 구문을 사용하여 선언해야 합니다.
  2. 파일이 무언가를 가져오려면 require('file') 구문을 사용하여 선언해야 합니다.

예시:

테스트1.js

 const test2 = require('./test2'); // returns the module.exports object of a file test2.Func1(); // logs func1 test2.Func2(); // logs func2

테스트2.js

 module.exports.Func1 = () => {console.log('func1')}; exports.Func2 = () => {console.log('func2')};

기타 유용한 정보:

  1. 모듈이 캐시되고 있습니다. 동일한 모듈을 2개의 다른 파일에 로드할 때 모듈은 한 번만 로드하면 됩니다. 동일한 모듈에서 두 번째로 require() 가 호출되면 캐시에서 가져옵니다.
  2. 모듈은 동기식으로 로드됩니다 . 이 동작이 필요합니다. 비동기식이라면 require() 즉시 검색된 객체에 액세스할 수 없습니다.

Willem van der Veen

let test = function() { return "Hello world" }; exports.test = test;

Gtm

출처 : http:www.stackoverflow.com/questions/5311334/what-is-the-purpose-of-node-js-module-exports-and-how-do-you-use-it

반응형