Node.js,需要文件夹中的所有模块并直接使用加载的模块

LeM*_*sel 1 javascript directory require node.js

MyModule文件夹中,我有两个JS文件.

SayHello.js

module.exports.SayHello = function() {
    return('Hello !');
}
Run Code Online (Sandbox Code Playgroud)

SayByeBye.js

module.exports.SayByeBye = function() {
    return('Bye Bye!');
}
Run Code Online (Sandbox Code Playgroud)

在Node.js中,我想要MyModule文件夹中的所有文件并调用函数SayHello&SayByeBye直接类似于:

require(./MyModule) 
console.log(SayHello());
console.log(SayByeBye());
Run Code Online (Sandbox Code Playgroud)

编辑:

回答@Yanick Rochon,我这样做:

> ./app/my-module/index.js

global.SayHello = require('./my-module/SayHello').SayHello;
global.SayByeBye = require('./my-module/SayByeBye').SayByeBye;
Run Code Online (Sandbox Code Playgroud)

> ./app/my-module/say-hello.js

module.exports.SayHello = function() {
    return('Hello !');
};
Run Code Online (Sandbox Code Playgroud)

> ./app/my-module/say-byebye.js

module.exports.SayByeBye = function() {
    return('Bye Bye !');
};
Run Code Online (Sandbox Code Playgroud)

> ./app/main.js

require('./my-module');
console.log(SayHello());
console.log(SayByeBye());
Run Code Online (Sandbox Code Playgroud)

节点文档中有关于全局对象的部分.

但是,应谨慎使用全局变量.通过向全局空间添加模块,我降低了可测试性和封装.但在这种情况下,我认为使用这种方法是可以接受的.

Yan*_*hon 5

首先是......

我相信你错误地将Node.js与PHP或.Net混淆,因为你没有"导入"当前模块中导出的其他模块.除非您手动执行此操作.例如,当你打电话时

require('./my-module');
Run Code Online (Sandbox Code Playgroud)

(请注意,我将您重MyModule命名为Node.js命名约定.)

您不会将内容加载到当前上下文中; 你只需加载脚本,不要将其分配给任何东西.要访问my-module公开的内容,您需要分配它,或直接使用它.例如 :

require('./my-module').someFunction();
Run Code Online (Sandbox Code Playgroud)

要么

var myModule = require('./my-module');

myModule.someFunction();
Run Code Online (Sandbox Code Playgroud)

模块不是名称空间,而是公共属性在其自己的上下文之外公开的JavaScript对象(即使用module.exports = ...)

回答

您有两种最常用的方法来实现此目的:

解决方案1

index.json文件夹中创建要加载所有脚本的文件.返回的JSON对象应该是要自动加载的所有模块:

> ./app/index.json

[
  "say-hello.js",
  "say-goodbye.js"
]
Run Code Online (Sandbox Code Playgroud)

您还应该考虑让所有文件API兼容:

> ./app/say-hello.js

module.exports = function sayHello() {
  return 'Hello !';
};
Run Code Online (Sandbox Code Playgroud)

> ./app/say-goodbye.js

module.exports.sayGoodbye = function () {
  return 'Goodbye !';
};
Run Code Online (Sandbox Code Playgroud)

然后加载并执行如下所示的一切:

var path = require('path');
var basePath = './app/';

var files = require(basePath);

var mods = files.forEach(function (loaded, file) {
  var mod = require(path.join(basePath, file));

  // mod is a function with a name, so use it!
  if (mod instanceof Function) {
    loaded[mod.name] = mod;
  } else {
    Object.keys(mod).forEach(function (property) {
      loaded[property] = mod.property;
    });
  }
}, {});

mods.sayHello();
mods.sayGoodbye();
Run Code Online (Sandbox Code Playgroud)

解决方案2

读取.js文件夹中的所有文件并导入它们.我强烈建议你使用glob它.

var glob = require("glob")
var path = require('path');
var basePath = './app/';

var mods = glob.sync(path.join(basePath, '*.js')).reduce(function (loaded, file) {
  var mod = require(file);

  // mod is a function with a name, so use it!
  if (mod instanceof Function) {
    loaded[mod.name] = mod;
  } else {
    Object.keys(mod).forEach(function (property) {
      loaded[property] = mod.property;
    });
  }

  return loaded;
}, {});

mods.sayHello();
mods.sayGoodbye();
Run Code Online (Sandbox Code Playgroud)

注意module.exports和之间的区别exports

通常module.exports === exports,但建议使用module.exports以下原因

exports = function Foo() { }         // will not do anything
module.exports = function Foo() { }  // but this will do what you expect

// however these two lines produce the same result
exports.foo = 'Bar';
module.exports.foo = 'Bar';  
Run Code Online (Sandbox Code Playgroud)

因此,module.exports建议在所有情况下使用.