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

标签 javascript node.js directory require

MyModule 文件夹中,我有这两个 JS 文件。

SayHello.js

module.exports.SayHello = function() {
    return('Hello !');
}

SayByeBye.js

module.exports.SayByeBye = function() {
    return('Bye Bye!');
}

在 Node.js 中,我想请求 MyModule 文件夹中的所有文件并调用函数 SayHello & SayByeBye 直接如下:

require(./MyModule) 
console.log(SayHello());
console.log(SayByeBye());

编辑:

回答@Yanick Rochon ,我这样做:

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

global.SayHello = require('./my-module/SayHello').SayHello;
global.SayByeBye = require('./my-module/SayByeBye').SayByeBye;

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

module.exports.SayHello = function() {
    return('Hello !');
};

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

module.exports.SayByeBye = function() {
    return('Bye Bye !');
};

> ./app/main.js

require('./my-module');
console.log(SayHello());
console.log(SayByeBye());

有一节关于global objects在 Node 文档中。

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

最佳答案

首先要...

我认为您将 Node.js 误认为是 PHP 或 .Net,因为您不会将在其他模块中导出的内容“导入”到当前模块中。除非您手动执行,否则不会。例如,当您调用

require('./my-module');

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

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

require('./my-module').someFunction();

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

myModule.someFunction();

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

回答

你有两种最流行的方法来完成这个:

解决方案一

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

> ./app/index.json

[
  "say-hello.js",
  "say-goodbye.js"
]

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

> ./app/say-hello.js

module.exports = function sayHello() {
  return 'Hello !';
};

> ./app/say-goodbye.js

module.exports.sayGoodbye = function () {
  return 'Goodbye !';
};

然后像这样加载并执行所有内容:

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

解决方案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();

注意module.exportsexports的区别

通常是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';  

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

关于javascript - Node.js,需要文件夹中的所有模块并直接使用加载的模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31657341/

相关文章:

javascript - 二进制连接

linux - Bash ~ 从目录的子目录中的脚本访问可能更改的目录

javascript - 检测 JavaScript 中的错误(代码中)并采取相应措施

node.js - Angular Js 意外 token 错误动态路由

javascript - d3.js 更改不同图像的节点并设置不同距离的链接

javascript - 云函数上传到github后隐藏了?

java - 如何使用 JFileChooser 直接打开目录(位置)?

r - 访问 R 包中的子目录

javascript - 如何检测浏览器 JavaScript 是否关闭并显示通知

javascript - Bing map 在加载其 javascript 文件后未定义