竞价托管多少钱,西安seo站内优化,个人业务网站带后台,seo包年服务个人博客
Nodejs下动态加载文件夹下的文件模块
个人博客#xff0c;求关注#xff0c;如果有不够清晰的#xff0c;麻烦指出来#xff0c;如果有很不正确的#xff0c;多谢批评。
文章概叙
本文应用的场景是读取指定文件夹下面的所有文件#xff0c;然后做操作#…个人博客
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中才能起作用的原因。