Node.js -- 模块化

文章目录

  • 1. 模块化介绍
  • 2. 模块化初体验
  • 3. 模块暴露数据
  • 4. 导入文件(夹)模块
  • 5. 导入模块的基本流程
  • 6. CommonJS 规范

这里是引用

1. 模块化介绍

之前我们所编写的文件都是单个文件,这就会出现一些问题:

  1. 变量不能重复命名;
  2. 代码复用性差;
  3. 代码可维护性差

怎么解决这些问题呢?
就是使用Node.js 模块化!

将一个复杂的程序文件依据一定规侧(规范)折分成多个文件的过程称之为模块化
其中拆分出的每个文件就是一个模块,模块的内部数据是私有的,不过模块可以暴露内部数据以便其他模块使用(模块可以理解为功能,只能自己调用自己的功能,但是可以把功能展示给其他人,引导其他人来调用

模块化项目:编码时是按照模块一个一个编码的,整个项目就是一个模块化的项目

下面是模块化的一些好处:

  • 防止命名冲突
  • 高复用性
  • 高维护性

2. 模块化初体验

me.js

// 声明一个函数
function tiemo() {
    console.log('tiemo');
}

// 暴露数据
module.exports = tiemo;

index.js

// 导入模块
const tiemo = require('./me.js')

// 调用函数
tiemo()

3. 模块暴露数据

  1. module.exports 属性
    module.exports = tiemo; // 暴露单个数据;
    module.exports = {tiemo,chifan}; //暴露多个数据
  2. exports变量
    exports.tiemo = tiemo;
    exports.chifan = chifan;

使用时有几点注意:

  • module.exports可以暴露任意数据
  • 不能使用exports=value的形式暴露数据,模块内部module与exports的隐式关系exports module.exports ={}

因为存在module与exports的隐式关系exports
module.exports ={};所以exports.tiemo = tiemo 就像是在给对象设置属性,所以在调用时是可以执行的。

4. 导入文件(夹)模块

在模块中使用require 传入文件路径即可引入文件

const test = require('./me.js')

require 使用的一些注意事项:

  1. 对于自己创建的模块,导入路径时建议写相对路径,且不能省略./../;
  2. jsjson文件在导入时可以不用写后缀,c / c++ 编写的node 扩展文件也可以不写后缀,但是一般用不到;
    当出现两个文件名称一样,但是一个是js文件,一个是 json文件,那么会先导入js 文件内容
  3. 如果导入其他类型的文件,会以 js 文件处理;
  4. 如果导入的路径是个文件夹,则会首先检测该文件夹下package.json文件中main属性对应的文件,如果存在则导入,反之如果文件不存在会报错;
    如果main 属性不存在或者package.json 不存在,则会尝试导入文件夹下的index.js 和index.json ,如果还是没找到,就会报错
  5. 导入node.js 内置模块时,直接require 模块的名字即可,无需添加./../,例如:fs, http, path等

5. 导入模块的基本流程

这里我们将学习导入自定义模块的基本流程!

  1. 将相对路径转换为绝对路径,定位目标文件;
  2. 缓存检测;
  3. 读取目标文件代码;
  4. 包裹为一个函数并执行(自执行函数)。通过arguments.callee.toString()查看自执行函数;
  5. 缓存模块的值;
  6. 返回module.exports 的值
// 这部分代码都是伪代码 不能执行 只能帮助理解
function require (file) {
    // 1. 将绝对路径转换为相对路径 ,定位目标文件
    let absolutePath = path.resolve(__dirname, file)
    // 2. 缓存检测 如果之前执行过这个模块 那么直接会输出模块值 不会再进行下面的操作
    if (cashes[absolutePath]) {
        return caches[absolutePath];
    }
    // 3. 读取文件的代码
    let code = fs.readFileSync(absolutePath).toString();
    // 4. 包裹为一个函数 然后执行
    let module = {}
    let exports = module.exports = {}
    (function(exports,require,module,__filename,__dirname) {
        const test = {
            name: '大富翁'
        }

        module.exports = test;

        // 输出
        console.log(arguments.callee.toString());
    })(exports, require, module, __filename, __dirname)
    // 缓存结果
    caches[absolutePath] = module.exports
    // 返回module.exports 的值
    return module.exports
}

注:

  1. arguments.callee 指向函数arguments.callee.toString() 可以啊看到函数的代码体;
  2. 被包括起来的函数执行形式:
    (被包裹的函数)(函数实参)

6. CommonJS 规范

module.exportsexports以及require这些都是CommonJS模块化规范中的内容。
而Node,js是实现了CommonJS模块化规范,二者关系有点像JavaScript与ECMAScript

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RAG 论文】Chain-of-Note:为 RAG 引入 CoT 让模型生成阅读笔记来提高面对噪音文档和未知场景的鲁棒性

论文:Chain-of-Note: Enhancing Robustness in Retrieval-Augmented Language Models ⭐⭐⭐ Tencent AI Lab, arXiv:2311.09210 文章目录 一、论文速读二、实现的细节2.1 Note Design2.2 Data Collection2.3 Model Training 三、实验结果3.1 QA Performance3.2 对 …

使用新版ESLint,搭配Prettier使用的配置方式

概述 ESLint重大更新(9.0.0版本)后,将不再支持非扁平化配置文件,并且移除了与Prettier冲突的规则,也就是说与Prettier搭配使用,不再需要使用插件“eslint-config-prettier”来处理冲突问题。 注:使用新版的前提条件是Node.js版本必须是18.18.0、20.9.0,或者是>=21.1…

014、Python+fastapi,第一个后台管理项目走向第14步:建立python+fastapi项目,创建common通用模块

一、说明 通用模块主要是完成文件的上传下载,抄吧,要不然怎么叫通用模块呢? 我把RuoYi-Vue3-FastAPI中的验证码模块放在这里了,我觉得验证也比较通用吧, 二、添加common通用模块 1、通用模块没有数据表&#xff0c…

涨跌失据了?现货白银市场的波动如何捕捉

现货白银市场近期出现了强劲的上涨,但近两个交易日,却出现了令人感觉诧异的大跌。很多刚入场打算买入做多的朋友,面对这两天这么强的跌势都感觉无所适从。到底现货白银市场的波动如何才能捕捉呢?下面我们就来讨论一下这个问题。 用…

阿里云物联网平台 | 透传与ICA标准数据格式(Alink JSON)| 定值SDK非动态注册与动态注册 | SOC+4G模组移植方案

文章目录 一、透传与ICA标准数据格式(Alink JSON)二、定值SDK选非动态注册还是动态注册三、SOC4G模组移植方案 一、透传与ICA标准数据格式(Alink JSON) 透传和ICA标准数据格式(Alink JSON)是物联网设备与阿…

DevOps(十二)Jenkins实战之Web发布到远程服务器

前面两篇博文介绍了怎么将django开发的web应用推送到gitlab源码仓库,然后jenkins服务器从gitlab仓库拉下来,布署到jenkins服务器上,并用supervisor进行进程管理,保证web应用一直能正常运行,今天我们继续优化&#xff0…

数据结构:初识集合框架

目录 1. 什么是集合框架2. 集合框架的重要性3. 背后所涉及的数据结构以及算法3.1 什么是数据结构3.2 容器背后对应的数据结构3.3 相关java知识3.4 什么是算法 1. 什么是集合框架 官方教程 Java 集合框架Java Collection Framework ,又被称为容器和其实现类classes …

记一次JSON.toJSONString()转换时非属性方法空指针异常排查及toJSONString保留null值属性

记一次JSON.toJSONString()转换时非属性方法空指针异常排查及toJSONString保留null值属性 异常详情 有一个类,里面有两个属性和一个类似工具的getRealName()方法如下: getRealName()方法就是获取这个人的真实名字,如果获取不到就以name返回…

janus模块介绍-SIP Gateway

模块启动 默认的SIP GateWay也是https协议,端口为8088或者8089 如果需要在自己搭建的测试服务上测试SIP GateWay模块,则也需要修改为wss 具体改动如下: 找到/opt/janus/share/janus/demos/siptest.js var server "wss://" window.location…

Python与数据库连接

新建表boss create table 创建表 Code import pymysqlcon pymysql.connect(hostlocalhost,\userroot,\password,\port3306,\dbbusiness) cursorcon.cursor() cursor.execute(create table if not exists boss(id int auto_increment primary key,name varchar(20)not null…

打包的意义 作用等前端概念集合 webpack基础配置等

基础网页是什么? 在学校最基础的三剑客 原生JS CSS H5就可以开发静态网页了 对于浏览器而言也能识别这些基础的文件和语法,真正的所见即所得,非常直接。 为什么要使用框架库? 对于常用的前端框架而言,无论是Vue Rea…

什么样的内外网文档摆渡,可以实现安全高效传输?

内外网文档摆渡通常指的是在内网(公司或组织的内部网络)和外网(如互联网)之间安全地传输文件的过程。这个过程需要特别注意安全性,因为内网往往包含敏感数据,直接连接内网和外网可能会带来安全风险。因此会…

为什么深度学习模型在 GPU 上运行得更快:CUDA 编程简介

如今,当我们谈论深度学习时,通常会将其实现与利用 GPU 来提高性能联系起来。 GPU(图形处理单元)最初设计用于加速图像、2D 和 3D 图形的渲染。然而,由于它们能够执行许多并行操作,因此它们的实用性超出了深度学习等应用程序。 GPU 在深度学习模型中的使用始于 2000 年代…

保姆级银河麒麟V10高级服务器离线安装mysql5.7数据库

离线在银河麒麟高级操作系统v10安装mysql5.7 下载mysql5.7 MySQL :: Download MySQL Community Server (Archived Versions) 2、把下载好的包上传到服务器 3、解压 [root1-0001 ~]# cd /data/mysql[root1-0001 mysql]# tar -zxvf mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz…

Beego框架学习:深入指南

文章目录 Beego框架学习:深入指南安装与设置创建控制器自定义路由使用中间件使用模板引擎使用ORM Beego框架学习:深入指南 Beego是一个快速开发Go语言应用的开源框架,它基于MVC模式设计,提供了一系列的工具和库,使得开…

C++ 之 string类的模拟实现

这学习我有三不学 昨天不学,因为昨天是个过去 明天不学,因为明天还是个未知数 今天不学,因为我们要活在当下,我就是玩嘿嘿~ –❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀-正文开始-❀–❀–…

Docker基础学习(3.Docker架构)

⭐ 作者简介:码上言 ⭐ 代表教程:Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容:个人博客系统 ⭐我的文档网站:http://xyhwh-nav.cn/ ⭐微信公众号:码上言 文章目录 Docker基本概念1、镜像&…

JavaWeb-自学JSP组件报告

自学JSP组件报告 一、组件资源及作用 1. commons-fileupload-1.2.2.jar 组件作用:用于处理HTTP文件上传请求,提供了文件上传的解析和存储功能。它允许开发者在Web应用中轻松实现文件上传功能。 2. commons-io-2.4.jar 组件作用:提供了一…

springboot+vue新疆肉牛智慧牧场养殖系统

系统涉及的对象是奶牛。 系统使用员工有管理员和普通员工。 管理员有修改的权限,普通员工没有。 系统需要包含奶牛的编号,种类,体重,健康情况、生长情况、牛奶产量,以及上次更新数据时间等信息,管理员可以对…

Perfect Clear WorkBench 智能修图黑科技,你尽管拍剩下的交给我(v4.6.0.2653)

01 Perfect Clear Perfect Clear WorkBench是EyeQlmaging推出的先进图片处理工具,旨在自动优化和简化图像校正。它通过智能技术提高图片的清晰度、颜色保真度,并增强视觉效果,确保高品质输出。 它的核心优势是利用高级算法和AI技术&#xff…
最新文章