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

news2024/12/23 16:21:43

个人博客

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/850855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【IMX6ULL驱动开发学习】01.编写第一个hello驱动+自动创建设备节点(不涉及硬件操作)

目录 一、驱动程序编写流程 二、代码编写 2.1 驱动程序hello_drv.c 2.2 测试程序 2.3 编写驱动程序的Makefile 三、上机实验 3.1 NFS 挂载 3.2 测试示例 一、驱动程序编写流程 构造file_operations结构体 在里面填充open/read/write/ioctl成员 注册file_operations结…

【计算机网络】TCP协议超详细讲解

文章目录 1. TCP简介2. TCP和UDP的区别3. TCP的报文格式4. 确认应答机制5. 超时重传6. 三次握手7. 为什么两次握手不行?8. 四次挥手9. 滑动窗口10. 流量控制11. 拥塞控制12. 延时应答13. 捎带应答14. 面向字节流15. TCP的连接异常处理 1. TCP简介 TCP协议广泛应用于可靠性要求…

P1398 [NOI2013] 书法家

题目描述 输入 #1 3 13 1 1 -1 -1 1 -1 1 1 1 -1 1 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 1 1 -1 1 1 1 输出 #1 24 输入 #2 3 13 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1…

线上电影购票选座H5小程序源码开发

搭建一个线上电影购票选座H5小程序源码需要一些基本的技术和步骤。以下是一个大致的搭建过程&#xff0c;可以参考&#xff1a; 1. 确定需求和功能&#xff1a;首先要明确你想要的电影购票选座H5小程序的需求和功能&#xff0c;例如用户登录注册、电影列表展示、选座购票、订单…

Nacos服务治理—负载均衡

引入负载均衡 在消费方引入负载均衡机制&#xff0c;同时简化获取服务提供者信息的流程 Spring Cloud引入组件LoadBalance实现负载均衡 添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web<…

代码随想录第42天 | 0-1背包问题、416. 分割等和子集

0-1背包问题 问题描述&#xff1a;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 二维数组解法 动态规划五部曲&#xff1a; 确定dp数…

微信小程序--原生

1&#xff1a;数据绑定 1&#xff1a;数据绑定的基本原则 2&#xff1a;在data中定义页面的数据 3&#xff1a;Mustache语法 4&#xff1a;Mustache的应用场景 1&#xff1a;常见的几种场景 2&#xff1a;动态绑定内容 3&#xff1a;动态绑定属性 4&#xff1a;三元运算 4&am…

计算机网络(8) --- IP与IP协议

计算机网络&#xff08;7&#xff09; --- UDP协议和TCP协议_哈里沃克的博客-CSDN博客UDP协议和TCP协议https://blog.csdn.net/m0_63488627/article/details/132125374?spm1001.2014.3001.5501 目录 1.IP与IP协议 IP作用 协议​编辑 2.网段划分 DHCP划分 CIDR划分 特殊…

什么是进程、线程、协程

什么是进程&#xff1f; 我们都知道计算机的核心是CPU&#xff0c;它承担了所有的计算任务&#xff1b;而操作系统是计算机的管理者&#xff0c;它负责任务的调度、资源的分配和管理&#xff0c;统领整个计算机硬件&#xff1b;应用程序则是具有某种功能的程序&#xff0c;程序…

拥抱AIGC浪潮,亚信科技将如何把握时代新增量?

去年底&#xff0c;由ChatGPT带起的AIGC浪潮以迅雷不及掩耳之势席卷全球。 当互联网技术的人口红利逐渐消退之际&#xff0c;AIGC就像打开通用人工智能大门的那把秘钥&#xff0c;加速开启数智化时代的到来。正如OpenAI CEO Sam Altman所言&#xff1a;一个全新的摩尔定律可能…

Elasticsearch:如何创建 Elasticsearch PEM 和/或 P12 证书?

你是否希望使用 SSL/TLS 证书来保护你的 Elasticsearch 部署&#xff1f; 在本文中&#xff0c;我们将指导你完成为 Elasticsearch 创建 PEM 和 P12 证书的过程。 这些证书在建立安全连接和确保 Elasticsearch 集群的完整性方面发挥着至关重要的作用。 友情提示&#xff1a;你可…

【毕业项目】自主设计HTTP

博客介绍&#xff1a;运用之前学过的各种知识 自己独立做出一个HTTP服务器 自主设计WEB服务器 背景目标描述技术特点项目定位开发环境WWW介绍 网络协议栈介绍网络协议栈整体网络协议栈细节与http相关的重要协议 HTTP背景知识补充特点uri & url & urn网址url HTTP请求和…

C#程序的启动显示方案(无窗口进程发送消息) - 开源研究系列文章

今天继续研究C#的WinForm的实例显示效果。 我们上次介绍了Winform窗体的唯一实例运行代码(见博文&#xff1a;基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章 )。这就有一个问题&#xff0c;程序已经打开了&#xff0c;这时候再次运行该应用程序&#xff0c;…

学习网络编程No.1【网络基础知识】

引言&#xff1a; 北京时间&#xff1a;2023/8/4/22:40&#xff0c;天苍苍野茫茫&#xff0c;风吹造地见牛羊&#xff0c;此时心潮澎湃&#xff0c;非常开心&#xff0c;啊哈哈哈&#xff01;因为就在刚刚我们终于把系统编程方面的知识给学完了&#xff0c;啊哈哈哈&#xff0…

科大讯飞分类算法挑战赛2023的一些经验总结

引言: ResNet是he kaiming大佬的早年神作&#xff0c;当年直接刷榜各大图像分类任务。ResNet是一种残差网络&#xff0c;咱们可以把它理解为一个子网络&#xff0c;这个子网络经过堆叠可以构成一个很深的网络&#xff0c;而ResNext在其基础上&#xff0c;进行了一定修改完善&am…

RabbitMQ在CentOS下的安装

RabbitMQ的版本是3.8.2 1.环境配置&#xff1a;CentOs 7.6以上版本&#xff0c;我的版本是7.9&#xff0c;不要对yum换源&#xff0c;否则可能会安装失败。 echo "export LC_ALLen_US.UTF-8" >> /etc/profile source /etc/profile 以上命令&#xff0c;是…

分立式BUCK电路原理与制作持续更新

一、分立式BUCK电路总体原理图 下面改图包含了电压环和电流环。 二、BUCK电路与LDO的区别 LDO不适合在压差大的环境下使用&#xff0c;因为三极管因为CE极承受了压差&#xff0c;压差越大损耗的功率就越大&#xff0c;将三极管换成MOS管&#xff0c;MOS管两端的压差很小所以效…

Linux安装配置nginx+php搭建以及在docker中配置

Linux安装配置nginxphp搭建以及在docker中配置 文章目录 Linux安装配置nginxphp搭建以及在docker中配置1.nginx源码包编译环境和安装相应的依赖1.1 安装编译环境1.2 安装pcre库、zlib库和openssl库 2.安装nginx2.1 在[nginx官网](https://nginx.org/en/download.html)上获取源码…

uni-app 封装api请求

前端封装api请求 前端封装 API 请求可以提高代码的可维护性和重用性&#xff0c;同时使得 API 调用更加简洁和易用。 下面是一种常见的前端封装 API 请求的方式&#xff1a; 创建一个 API 封装模块或类&#xff1a;可以使用 JavaScript 或 TypeScript 创建一个独立的模块或类来…

解决mysql常见错误,安装mysql提示Install/Remove of the service Denied!/显示无法启动/服务名无效

​​​​​1.概述问题 1.1 在安装mysql中提示Install/Remove of the service Denied! 1.2 MySQL 服务没有加载到电脑上时&#xff0c;有以下原因&#xff1a; 1.2.1 端口被占用&#xff0c;需要更改端口&#xff0c;也可以卸载重装mysql。 1.2.2 启动 MySQL 服务是就会提示 服务…