node.js如何在一个文件夹中引入所有文件?

11 浏览
0 Comments

node.js如何在一个文件夹中引入所有文件?

如何在node.js中要求文件夹中的所有文件?\n需要类似的东西:\n

files.forEach(function (v,k){
  // 要求路由
  require('./routes/'+v);
}};

0
0 Comments

问题的出现的原因是想要在Node.js中实现自动加载一个文件夹中的所有文件,并将其作为模块的一部分。在给定的代码中,通过遍历当前文件夹下的所有JavaScript文件,并将其作为exports的属性加载进来。

为了解决这个问题,需要创建一个名为`index.js`的文件,用于加载当前文件夹下的所有JavaScript文件,并将它们作为exports的属性。代码如下:

// 加载当前文件夹下的所有`*.js`文件,并将它们作为exports的属性
require('fs').readdirSync(__dirname + '/').forEach(function(file) {
  if (file.match(/\.js$/) !== null && file !== 'index.js') {
    var name = file.replace('.js', '');
    exports[name] = require('./' + file);
  }
});

通过这样的操作,可以在任何地方使用`require`来引入该文件夹。此外,还可以使用`/\.js(on)?$/`来匹配所有的JavaScript和JSON文件。另外,`!== null`判断是多余的。

总结起来,以上代码解决了在Node.js中自动加载文件夹中的所有文件的问题。通过创建一个`index.js`文件,并使用`readdirSync`遍历文件夹下的所有文件,并将其作为exports的属性加载进来,从而可以在其他地方使用`require`引入该文件夹。

0
0 Comments

Node.js中的require函数用于引入其他文件或模块,但是默认情况下无法一次性引入文件夹中的所有文件。一个用户在提问中询问如何使用Node.js引入文件夹中的所有文件,并且有其他用户提供了解决方法。

解决方法是使用npm包中的glob模块。glob模块可以根据文件路径模式匹配文件,并返回匹配的文件路径数组。用户可以安装和引入glob模块,并使用其提供的sync方法来返回匹配的文件路径数组。

下面是使用glob模块的解决方法示例代码:

var glob = require( 'glob' );
var path = require( 'path' );
glob.sync( './routes/**/*.js' ).forEach( function( file ) {
  require( path.resolve( file ) );
});

以上代码会匹配所有以.js结尾的文件,并将其路径传给require函数进行引入。

其他用户对这个解决方法进行了赞同和推荐,认为使用glob模块更加简单和方便,特别是对于需要递归地引入子文件夹中的文件的情况。

此外,还有用户提到了glob模块的强大之处,可以根据文件规则指定一组文件路径。

还有其他用户问到了一些关于变量和代码的问题,其中一个用户提到了变量x是什么,其实这里的x是引入的模块的变量名。

另外,还有用户提供了使用map()方法来保存文件路径的解决方案,并且指出可以直接使用require(file)来引入文件,而不需要使用path.resolve(file)。

最后,有用户提到了一个警告,指出在使用较新版本的Webpack时,可能会因为缺乏polyfill支持而导致问题。这是因为一些glob依赖的包在Webpack中不再提供(如path、assert、fs),即使配置了Webpack的resolve fallbacks也无法解决问题。

通过使用glob模块,可以解决Node.js中引入文件夹中所有文件的问题,并且可以根据文件规则指定一组文件路径。然而,在使用较新版本的Webpack时需要注意可能会出现的问题。

0
0 Comments

在node.js中,当使用require函数给出一个文件夹的路径时,它会在该文件夹中查找index.js文件,如果存在,就使用该文件,如果不存在,就会失败。

如果你对文件夹有控制权,最好的方法是创建一个index.js文件,然后将所有的“模块”赋值给它,然后只需require该文件即可。

在不知道文件名的情况下,你可以编写一些类似加载器的东西。

下面是一个工作示例的加载器:

var normalizedPath = require("path").join(__dirname, "routes");
require("fs").readdirSync(normalizedPath).forEach(function(file) {
  require("./routes/" + file);
});
// 继续应用逻辑

需要说明的是,当require给出一个文件夹的路径时,它会在该文件夹中查找index.js文件,如果存在,就使用该文件,如果不存在,就会失败。一个真实世界的例子是在github.com/christkv/node-mongodb-native中可以看到这一点:根目录中有一个index.js文件,它需要./lib/mongodb,一个文件夹;./lib/mongodb/index.js使该文件夹中的所有其他文件都可用。

require是一个同步函数,所以没有回调函数的好处。我会使用fs.readdirSync而不是回调函数。

谢谢,今天我遇到了同样的问题,想到了“为什么没有require('./routes/*')?”。

谢谢你!我觉得这应该添加到文档中。

`require('./routes/*')`的返回值是什么?

当你不需要对任何导出的东西进行处理时,它是有用的;例如,如果我只是想将一个Express应用实例传递给一组将绑定路由的文件。

我明白了。我指出的是通常`require`将返回`exports`对象。但是在需要多个文件时,返回值不明显是什么....

补充一下,一个目录的主文件(即index.js)可以通过该目录中的package.json文件进行更改。像这样:{main: './lib/my-custom-main-file.js'}

`require('./directory/*')`的返回值可以是一个对象,其中包含与该目录中的有效js文件一样多的属性,每个属性的名称是js文件的基本名称,每个属性的值是该单个文件的require。对我来说,这真的很明显。

“*”是什么?一个名为*.js的文件在目录中?我对你的回答表示困惑,Cory Gross。

你应该防止非JS文件,例如使用`if(path.extname(file)=== '。js')require("./routes/" + file)(app);`

我必须像这样要求所有的文件。我对node不太了解。我能做些什么以便在不必每次都要求新文件的情况下迭代这些对象?

请注意,上面的“工作示例加载器”是不正确的 - readdirSync('./routes')将读取当前工作目录中的routes目录,而实际上您希望在与源文件相同的文件夹中加载routes目录。如果您从与文件夹相同的文件夹中运行该文件,它似乎可以工作,但如果您尝试从任何其他文件夹运行它,它将失败。这应该是readdirSync(path.join(__dirname,“routes”))。

Jason,我相信`path.resolve`也可以工作。我暂时会使用你的修复方法,并在后续更新中尝试使用resolve。

0