Node.js에서 여러 module.exports 선언


243

내가 달성하려는 것은 여러 기능을 포함하는 하나의 모듈을 만드는 것입니다.

module.js :

module.exports = function(firstParam) { console.log("You did it"); },
module.exports = function(secondParam) { console.log("Yes you did it"); }, 
// This may contain more functions

main.js:

var foo = require('module.js')(firstParam);
var bar = require('module.js')(secondParam);

내가 가진 문제 firstParam는 객체 유형이고 secondParamURL 문자열이라는 것입니다.하지만 가지고있을 때 항상 유형이 잘못되었다고 불평합니다.

이 경우 여러 module.exports를 어떻게 선언 할 수 있습니까?


2
이 패러다임의 핵심 부분을 분명히 놓치고 있습니다.
Joshua Pinter

답변:


540

당신은 다음과 같은 것을 할 수 있습니다 :

module.exports = {
    method: function() {},
    otherMethod: function() {},
};

아니면 그냥 :

exports.method = function() {};
exports.otherMethod = function() {};

그런 다음 호출 스크립트에서 :

const myModule = require('./myModule.js');
const method = myModule.method;
const otherMethod = myModule.otherMethod;
// OR:
const {method, otherMethod} = require('./myModule.js');

25
항상 사용 module.exports = {}하고 사용 하지 마십시오 module.method = .... stackoverflow.com/a/26451885/155740
Scotty

9
나는 module.method여기 어디에도 사용하지 않고 ... 만 exports.method참조합니다 module.exports.method. 이것은 동일한 방식으로 작동합니다. 유일한 차이점은 우리가 정의하지 않았기 module.exports때문에 {}실수하지 않는 한 기본값은 입니다.
매시

@mash는 다음을 사용하여 다른 파일에서 작동합니다 var otherMethod = require('module.js')(otherMethod);. 즉, 해당 행 otherMethod은 페이지의 유일한 기능인 것처럼 내보내기가 필요한 것처럼 기능이 필요 module.exports = secondMethod;합니까?
YPCrumble

3
@YPCrumble 할 수 있습니다 var otherMethod = require('module.js').otherMethod.
매쉬

다른 프로그램에서 일치하는 요구 사항을 보여줄 수 있습니까?
NealWalters

137

여러 함수를 내보내려면 다음과 같이 나열하면됩니다.

module.exports = {
   function1,
   function2,
   function3
}

그런 다음 다른 파일로 액세스하십시오.

var myFunctions = require("./lib/file.js")

그리고 다음을 호출하여 각 함수를 호출 할 수 있습니다.

myFunctions.function1
myFunctions.function2
myFunctions.function3

1
완벽한 답변,이 답변은 정답으로 표시해야합니다.
Vishnu Ranganathan

너희들은 어떻게 사용 require("./lib/file.js")했니? 사용해야 해요require("../../lib/file.js") . 그렇지 않으면 작동하지 않습니다.
Antonio Ooi

11
당신은 또한 그들을 액세스 할 때이 작업을 수행 할 수 있습니다 : const { function1, function2, function3 } = require("./lib/file.js")직접 호출 할 수 있습니다 (예 : function1대신 myFunctions.function1)
David Yeiser

이것은 가장 깨끗하고 간단한 접근법입니다!
Zeus

42

@mash 답변 외에도 항상 다음을 수행하는 것이 좋습니다.

const method = () => {
   // your method logic
}

const otherMethod = () => {
   // your method logic 
}

module.exports = {
    method, 
    otherMethod,
    // anotherMethod
};

여기에 참고하십시오 :

  • 당신은 전화 method를 할 수 otherMethod있고 당신은 이것을 많이 필요로 할 것입니다
  • 필요할 때 메소드를 비공개로 빠르게 숨길 수 있습니다
  • 이것은 대부분의 IDE가 코드를 이해하고 자동 완성하는 것이 더 쉽습니다.)
  • 가져 오기에 동일한 기술을 사용할 수도 있습니다.

    const {otherMethod} = require('./myModule.js');


참고이 바로 가기 초기화 ES6 개체를 사용하는 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
chrismarx

1
이 방법은 otherMethod에서 액세스하는 방법을 다루므로 더 나은 답변입니다. 지적 해 주셔서 감사합니다.
Jeff Beagley

15

이것은 내가 달성하려고했던 것이 이것에 의해 달성 될 수 있기 때문에 단지 참조 용입니다.

에서 module.js

우리는 이런 식으로 할 수 있습니다

    module.exports = function ( firstArg, secondArg ) {

    function firstFunction ( ) { ... }

    function secondFunction ( ) { ... }

    function thirdFunction ( ) { ... }

      return { firstFunction: firstFunction, secondFunction: secondFunction,
 thirdFunction: thirdFunction };

    }

에서 main.js

var name = require('module')(firstArg, secondArg);

10

module.js :

const foo = function(<params>) { ... }
const bar = function(<params>) { ... } 

//export modules
module.exports = {
    foo,
    bar 
}

main.js :

// import modules
var { foo, bar } = require('module');

// pass your parameters
var f1 = foo(<params>);
var f2 = bar(<params>);

8

파일이 ES6 내보내기를 사용하여 작성된 경우 다음을 작성할 수 있습니다.

module.exports = {
  ...require('./foo'),
  ...require('./bar'),
};

8

이를 수행 할 수있는 한 가지 방법은 모듈을 교체하는 대신 새 객체를 작성하는 것입니다.

예를 들면 다음과 같습니다.

var testone = function () {
    console.log('test one');
};
var testTwo = function () {
    console.log('test two');
};
module.exports.testOne = testOne;
module.exports.testTwo = testTwo;

그리고 전화

var test = require('path_to_file').testOne:
testOne();

이것은 다른 답변과 비교할 때 매우 간단한 접근 방식이었습니다. 정말 좋은
HN Singh

6

다른 함수간에 수동으로 위임하는 함수를 작성할 수 있습니다.

module.exports = function(arg) {
    if(arg instanceof String) {
         return doStringThing.apply(this, arguments);
    }else{
         return doObjectThing.apply(this, arguments);
    }
};

이것은 기능 과부하를 달성하는 방법이지만, 우아하지는 않습니다. Mash의 대답은 더 깨끗하고 더 나은 의도를 보인다고 생각합니다.
Nepoxx

5

이것을 사용하십시오

(function()
{
  var exports = module.exports = {};
  exports.yourMethod =  function (success)
  {

  }
  exports.yourMethod2 =  function (success)
  {

  }


})();

3

두 가지 유형의 모듈 가져 오기 및 내보내기

유형 1 (module.js) :

// module like a webpack config
const development = {
  // ...
};
const production = {
  // ...
};

// export multi
module.exports = [development, production];
// export single
// module.exports = development;

유형 1 (main.js) :

// import module like a webpack config
const { development, production } = require("./path/to/module");

유형 2 (module.js) :

// module function no param
const module1 = () => {
  // ...
};
// module function with param
const module2 = (param1, param2) => {
  // ...
};

// export module
module.exports = {
  module1,
  module2
}

유형 2 (main.js) :

// import module function
const { module1, module2 } = require("./path/to/module");

가져 오기 모듈을 사용하는 방법?

const importModule = {
  ...development,
  // ...production,
  // ...module1,
  ...module2("param1", "param2"),
};

3

또한 다음과 같이 내보낼 수 있습니다

const func1 = function (){some code here}
const func2 = function (){some code here}
exports.func1 = func1;
exports.func2 = func2;

또는 이와 같은 익명 기능의 경우

    const func1 = ()=>{some code here}
    const func2 = ()=>{some code here}
    exports.func1 = func1;
    exports.func2 = func2;

2

module1.js :

var myFunctions = { 
    myfunc1:function(){
    },
    myfunc2:function(){
    },
    myfunc3:function(){
    },
}
module.exports=myFunctions;

main.js

var myModule = require('./module1');
myModule.myfunc1(); //calling myfunc1 from module
myModule.myfunc2(); //calling myfunc2 from module
myModule.myfunc3(); //calling myfunc3 from module

2

이 작업을 수행하는 여러 가지 방법이 있으며 아래에 한 가지 방법이 있습니다. 이와 같은 .js 파일이 있다고 가정하십시오.

let add = function (a, b) {
   console.log(a + b);
};

let sub = function (a, b) {
   console.log(a - b);
};

다음 코드 스 니펫을 사용하여 이러한 기능을 내보낼 수 있습니다.

 module.exports.add = add;
 module.exports.sub = sub;

이 코드 스 니펫을 사용하여 내 보낸 함수를 사용할 수 있습니다.

var add = require('./counter').add;
var sub = require('./counter').sub;

add(1,2);
sub(1,2);

답변이 늦었다는 것을 알고 있지만 이것이 도움이되기를 바랍니다.


0
module.exports = (function () {
    'use strict';

    var foo = function () {
        return {
            public_method: function () {}
        };
    };

    var bar = function () {
        return {
            public_method: function () {}
        };
    };

    return {
        module_a: foo,
        module_b: bar
    };
}());

0

간단한 객체 대신 모듈 파일에 클래스를 선언하면

파일 : UserModule.js

//User Module    
class User {
  constructor(){
    //enter code here
  }
  create(params){
    //enter code here
  }
}
class UserInfo {
  constructor(){
    //enter code here
  }
  getUser(userId){
    //enter code here
    return user;
  }
}

// export multi
module.exports = [User, UserInfo];

메인 파일 : index.js

// import module like
const { User, UserInfo } = require("./path/to/UserModule");
User.create(params);
UserInfo.getUser(userId);

0

이 접근법도 사용할 수 있습니다

module.exports.func1 = ...
module.exports.func2 = ...

또는

exports.func1 = ...
exports.func2 = ...

0

도움을 줄 사람을 위해 여기에 추가 :

이 코드 블록은 cypress index.js 플러그인에 여러 플러그인을 추가하는 데 도움이됩니다.-> cypress-ntlm-authcypress env 파일 선택

const ntlmAuth = require('cypress-ntlm-auth/dist/plugin');
const fs = require('fs-extra');
const path = require('path');

const getConfigurationByFile = async (config) => {
  const file = config.env.configFile || 'dev';
  const pathToConfigFile = path.resolve(
    '../Cypress/cypress/',
    'config',
    `${file}.json`
  );
  console.log('pathToConfigFile' + pathToConfigFile);
  return fs.readJson(pathToConfigFile);
};

module.exports = async (on, config) => {
  config = await getConfigurationByFile(config);
  await ntlmAuth.initNtlmAuth(config);
  return config;
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.