Nodejs下动态加载文件夹下的文件模块
个人博客
个人博客,求关注,如果有不够清晰的,麻烦指出来,如果有很不正确的,多谢批评。
文章概叙
本文应用的场景是读取指定文件夹下面的所有文件,然后做操作,用到的方法是fs模块的readdir,以及require作为加载文件的例子
应用场景
讲一个大概的例子,比如现在一个系统,作用是对输入的数据做处理,根据不同的来源,做不同的处理,但是现在的逻辑只有两种处理方式,我们可以直接用一个简单的if-else或者Map做处理。但考虑到项目的扩展性,我们决定使用模块化的处理方式,即将不同的处理分装为一个js文件,接着匹配不同的行为准则,而这样做的好处就是其他人不需要再去改入口文件的代码,只需要插入新的模块就可以了,其实这也就是很标准的一种模块化思想。
数据准备
首先,先看下文件的架构,index.js是入口文件,而a.js以及b.js则是模块文件。a.js以及b.js都只是打印出一句话而已。
代码实现
实现过程不复杂,大概地讲解下,做一个简单的demo,大家就会明白如何处理了。 第一步,先用fs.readdir获取到指定文件夹下的所有文件名字。
const fs = require("fs");
const currentDirPath=__dirname;
fs.readdir(currentDirPath, (err, files) => {
if (!err) {
console.log(files);
}
})
readdir的参数主要有两个,一个是文件夹的路径,这儿我用当前的文件夹的路径,也就是代码中的currentDirPath。 第二个参数是回调参数,也就是我们的callback function,其中callback的第一个参数是boolean类型的err,也就是否报错,第二个参数则是文件名称的列表。 当前的打印如下
第二步,我们需要排除现在所属的index.js文件,当然不会那么low bee到去写一个值为'index.js'的常量,我们可以用__filename来获取当前文件的路径。 首先,看下打印出来__filename的值是什么
因此,我们还需要将前面的文件的路径以及最后的""去掉,只留下最后的文件名字,让下面的文件列表做循环的时候,能完美的匹配到我们当前文件的名字,最后的代码如下。
const fs = require("fs");
const currentDirPath = __dirname;
const currentFilePath = __filename
// 获取当前文件的名字,包含扩展名。
const currentFileName = currentFilePath
.replace(currentDirPath, '')
.substring(1);
// 获取指定文件夹下面的所有文件
fs.readdir(currentDirPath, (err, files) => {
if (!err) {
// 遍历文件
for (let index = 0; index < files.length; index ) {
const element = files[index];
// 如果当前入口文件
if (element !== currentFileName) {
console.log(element);
}
}
}
})
打印效果如下
第三步是最重要的加载模块,使用ts的朋友都知道我们加载文件的时候用的是import。而不是require。但是很遗憾,我这儿还是需要用require来加载(新博客会讲解下如何按需、动态加载)。原因也很简单,使用require是最简单的,这样子别人很容易就能接受,但是我也会大概的写下如何用import加载。
const fs = require("fs");
const currentDirPath = __dirname;
const currentFilePath = __filename
// 获取当前文件的名字,包含扩展名。
const currentFileName = currentFilePath
.replace(currentDirPath, '')
.substring(1);
// 获取指定文件夹下面的所有文件
fs.readdir(currentDirPath, async (err, files) => {
if (!err) {
// 遍历文件
for (let index = 0; index < files.length; index ) {
const element = files[index];
// 如果当前入口文件
if (element !== currentFileName) {
console.log(element);
// require 加载
require(`./${element}`);
// import 动态加载, 需要注意使用await的作用。
// await import(`./${element}`);
}
}
}
})
大体就是这样,自己敲一遍,你会发现没什么,因为真的没什么难度。只要熟悉各类的api都没啥问题,顶多是吃在了不熟悉api的亏上。但也并非百试百灵,比如在用mocha做单元测试的时候,我就不建议使用这种方式。因为超纲,我就不写怎么在mocha里面使用了
注意点
应该有朋友注意到,我专门使用了for...而不是使用最简单的forEach。结合到后面的await,我想大家也能猜到是因为async/await在for中才能起作用的原因。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbaccg
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01