Nodejs下动态加载文件夹下的文件模块

个人博客

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中才能起作用的原因。​​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Node.js中的fs模块来删除文件夹。根据你提供的引用,可以封装一个名为emptyDir的函数,该函数接收一个参数path,表示目标路径。首先需要引入fs模块,然后在函数体内调用fs模块的readdirSync方法来获取指定路径下的所有文件和子文件夹。然后使用forEach方法遍历文件和子文件夹,在循环体内判断当前路径是否为一个子文件夹,如果是,则继续递归调用emptyDir函数,如果不是,则使用fs.unlinkSync方法删除文件。这个函数可以删除指定目录下的所有子文件和子文件夹。,使用fs-extra模块的copySync方法可以实现文件文件夹的复制。你可以将源路径和目标路径作为参数传递给copySync方法,然后它就会将源路径下的文件文件夹复制到目标路径下。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [nodejs 清空目录或清空目录下文件夹](https://blog.csdn.net/weixin_57098738/article/details/128113114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [两行代码实现Nodejs复制文件文件夹](https://blog.csdn.net/weixin_43325228/article/details/127323418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值