ประกาศหลาย module.exports ใน Node.js


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มันเป็นประเภทวัตถุและsecondParamเป็นสตริง URL แต่เมื่อฉันมีมันมักจะบ่นว่าประเภทนั้นผิด

ฉันจะประกาศหลายโมดูลเอ็กซ์พอร์ตได้อย่างไรในกรณีนี้


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 = {} stackoverflow.com/a/26451885/155740module.method = ...
Scotty

9
ฉันไม่ได้ใช้module.methodที่นี่เลย ... เท่านั้นexports.methodซึ่งเป็นเพียงการอ้างอิงmodule.exports.methodเท่านั้นดังนั้นจึงมีพฤติกรรมแบบเดียวกัน ความแตกต่างเพียงอย่างเดียวคือเราไม่ได้กำหนดmodule.exportsดังนั้นจึงเป็นค่าเริ่มต้น{}เว้นแต่ฉันจะเข้าใจผิด
บด

@ บดนี้จะทำงานในไฟล์อื่นโดยใช้: var otherMethod = require('module.js')(otherMethod);? คือเส้นที่จะต้องมีotherMethodฟังก์ชั่นเช่นเดียวกับถ้ามันเป็นฟังก์ชั่นเฉพาะในหน้าและการส่งออกที่ได้รับ: module.exports = secondMethod;?
YPCrumble

3
@YPCrumble var otherMethod = require('module.js').otherMethodที่คุณสามารถทำได้
mash

คุณสามารถแสดงการจับคู่ที่ต้องการในโปรแกรมอื่นที่จะไปด้วยได้หรือไม่?
NealWalters

137

ในการส่งออกหลายฟังก์ชั่นคุณสามารถทำรายการแบบนี้ได้:

module.exports = {
   function1,
   function2,
   function3
}

จากนั้นเพื่อเข้าถึงไฟล์เหล่านั้น:

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

จากนั้นคุณสามารถเรียกแต่ละฟังก์ชั่นได้โดยโทร:

myFunctions.function1
myFunctions.function2
myFunctions.function3

1
คำตอบที่สมบูรณ์แบบคำตอบนี้ฉันควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
พระนารายณ์ Ranganathan

พวกคุณใช้ยังrequire("./lib/file.js")ไง? ฉันต้องการใช้require("../../lib/file.js")มิฉะนั้นจะใช้ไม่ได้
Antonio Ooi

11
นอกจากนี้คุณยังสามารถทำเช่นนี้เมื่อมีการเข้าถึงพวกเขาconst { function1, function2, function3 } = require("./lib/file.js")ซึ่งจะช่วยให้คุณสามารถเรียกพวกเขาโดยตรง (เช่นfunction1แทนmyFunctions.function1)
เดวิด Yeiser

นี่เป็นวิธีที่สะอาดและง่ายที่สุด!
ซุส

42

นอกเหนือจาก @mash answer ฉันขอแนะนำให้คุณทำสิ่งต่อไปนี้เสมอ:

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
นี่คือคำตอบที่ดีกว่าเพราะมันอยู่วิธีการเข้าถึงแบบอื่น ๆ วิธี ขอบคุณสำหรับการชี้ให้เห็นว่า
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 ซิงห์

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-authและcypress 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.