Node.jsで複数のmodule.exportsを宣言する


243

私が達成しようとしているのは、複数の関数を含む1つのモジュールを作成することです。

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は、がオブジェクトタイプであり、secondParamがURL文字列であるということです。

この場合、どのように複数のmodule.exportsを宣言できますか?


2
これが機能するために必要なものを吹き飛ばしてしまうので、このパラダイムのいくつかの重要な部分が明らかに欠けています。
Joshua Pinter 2016

回答:


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
スコッティ

9
私はmodule.methodここでどこも使用していません...のみexports.methodへの参照であるだけなmodule.exports.methodので、同じように動作します。唯一の違いは、を定義しなかったことです。module.exportsそのため{}、私が誤っていない限り、デフォルトでになります。
マッシュ

@マッシュはこれを使用して別のファイルで動作します:var otherMethod = require('module.js')(otherMethod);?つまり、その行にはotherMethod、ページ上の唯一の関数であるかのように関数が必要であり、エクスポートは次のようになりmodule.exports = secondMethod;ます。
YPCrumble 2015年

3
@YPCrumbleできますvar otherMethod = require('module.js').otherMethod
マッシュ

それに必要なマッチングを他のプログラムで示すことができますか?
NealWalters 2017

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、あなたは、このAの多くが必要になります
  • 必要なときにメソッドをプライベートとしてすばやく非表示にすることができます
  • これは、ほとんどのIDEがコードを理解してオートコンプリートする方が簡単です;)
  • インポートにも同じ手法を使用できます。

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


このショートカットイニシャライザES6オブジェクトを使用することに注意してください- developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
chrismarx

1
これは、otherMethodからのメソッドへのアクセスに対応しているため、imhoの方が適切です。ご指摘いただきありがとうございます。
ジェフビーグリー

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

あなたがそれを行うことができる1つの方法は、それを置き換えるのではなく、モジュールで新しいオブジェクトを作成することです。

例えば:

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();

これは、他の回答に比べて非常にシンプルなアプローチに見えました。Really NIce
HN

6

他の関数の間で手動で委任する関数を書くことができます:

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

これは関数のオーバーロードを実現する方法ですが、あまりエレガントではありません。マッシュの答えはより明確で、意図をよりよく示していると思います。
Nepoxx 2014

5

これを使って

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

  }
  exports.yourMethod2 =  function (success)
  {

  }


})();

3

2つのタイプのモジュールのインポートとエクスポート。

タイプ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

これには複数の方法があります。1つの方法を以下に示します。このような.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-authおよびcypress env file selection

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.