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.mzph.cn/web/3462.shtml

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

相关文章

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024)

2024年大数据应用、智能控制与软件工程国际会议(BDAICSE2024) 会议简介 我们诚挚邀请您参加2024年大数据应用、智能控制和软件工程国际会议(BDAICSE2024)。这次会议将在美丽的长沙市举行。 本次大会旨在汇聚全球大数据应用、智能控制、软件工程等领…

【华为OD机试】生成哈夫曼树【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。 请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 …

云LIS系统概述JavaScript+前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS(云实验室信息管理系统)是一种结合了计算机网络化信息系统的技术,它无缝嵌入到云HIS(医院信息系统)中,用于连…

[iOS]CocoaPods安装和使用

1.了解brew、rvm、ruby、gem、cocaspods之间的关系 在 macOS 环境中,Brew、RVM、Ruby、Gem 和 CocoaPods 之间存在以下关系: Homebrew (Brew):Homebrew 是 macOS 上的包管理器,用于安装和管理各种开源软件包。它使您能够轻松地从…

信息系统项目管理师0069:数据运维(5信息系统工程—5.2数据工程—5.2.3数据运维)

点击查看专栏目录 文章目录 5.2.3数据运维1.数据存储2.数据备份3.数据容灾4.数据质量评价与控制记忆要点总结5.2.3数据运维 数据开发利用的前提是通过合适的方式将数据保存到存储介质上,并能保证有效的访问,还要通过数据备份和容灾手段,保证数据的高可用性。数据质量管理是在…

Pytorch实用教程:Pytorch的nn.LSTM中参数的含义

文章目录 基本组成关键特性使用`nn.LSTM`的基本步骤注意事项Pytorch的nn.LSTM中参数的含义示例课外分享PyTorch的nn.LSTM模块是一个用于构建长短期记忆(LSTM)网络的类,它是一种特殊类型的循环神经网络(RNN),能够学习序列数据中的长期依赖关系。 LSTM网络被广泛用于时间序…

频裂变加群推广强制分享引流源码

视频裂变加群推广强制分享引流源码,用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次数。 引导用户转发QV分享,达到快速裂变引流的效果! 视频裂变推广程序,强制分享链接,引导用户转发,…

场内股票期权和场外期权(附场内期权交易攻略)

期权是交易双方关于未来买卖权利达成的合约。 就股票期权来说,期权的买方(权利方)通过向卖方(义务方)支付一定的费用(即期权费或权利金),获得一种权利,即有权在约定的时间以约定的价格向期权卖方买入或卖出约定数量的标的股票或ETF。 买方(…

【SQL】SQL语句执行顺序

今天写一个相当基础的知识点,主要是之前对这块比较模糊,也没有细究,这次一并记录一下。 用一个例子说明SQL语句在逻辑执行计划时候的执行顺序,实际物理计划可能由于不同数据库优化策略的不同而略有差异。 例如,一个典型…

PyQt介绍——动画使用详解之QPropertyAnimation

一、继承关系 PyQt5的动画框架是QAbstractAnimation,它是一个抽象类,不能直接使用,需要使用它的子类。它的类结构如下: QAbstractAnimation:抽象动画,是所有动画的基类,不能直接使用。 QVariant…

Wi-Fi HaLow:重塑物联网的未来

Wi-Fi HaLow:引领物联网连接的革命 数字时代的蓬勃发展正在引发一场深刻的变革,物联网已经融入到我们的日常生活和工作中,成为不可或缺的一部分。随着新一代Wi-Fi技术一Wi-Fi HaLow的崭露头角,有望在2024年及未来,重新…

Mybatis 动态Sql标签使用总结

一、前言 常用的动态sql标签包括 if、choose(when、otherwise)、trim(where、set)、foreach。 二、标签介绍 2.1、if 标签 1、动态拼接查询条件 select DISTINCT ksid as id,ksdm as cd , ksmc as na ,id_org ,1 as fg_active,kspydm as py FROMV_CIS_RO_USERWHERE 11<…

数据结构 - 链表详解(二)—— 带头双向循环链表

链表的介绍 链表的结构一共有八种&#xff1a;带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。 今天我们来详解带头双向循环链表 带头双向循环链表是一种数据结…

Flutter开发好用插件url_launcher详解-启动 URL

文章目录 url_launcher介绍安装用法错误处理自定义行为其他功能 url_launcher介绍 url_launcher 是一个 Flutter 插件&#xff0c;用于启动 URL。它支持网络、电话、短信和电子邮件方案。您可以使用它从您的 Flutter 应用程序中打开网站、拨打号码、发送短信或撰写电子邮件。 …

javaSE (七):异常

目录 一、Java 异常概述 1.异常概念 2.异常的抛出机制 3.如何对待异常 二、 java异常体系结构 1.Throwable 2. Throwable分类 三、常见的异常 1.Error 2.异常--运行时异常 四、异常处理 1.try 2.catch 3.finally 4.throws 5.throw 五、运行期异常和编译期异常…

commvault学习(6):备份oracle(包括oracle的安装)

1.环境 CS、MA&#xff1a;一台windows server2012 客户端&#xff1a;2台安装了oracle11g的windows server2008 1.1 windows server2008安装oracle11g &#xff08;1&#xff09;右击安装包内的setup&#xff0c;以管理员方式运行 &#xff08;2&#xff09;取消勾选接收安…

仿真-Carla初识-安装

仿真方面研究,希望掌握仿真技术 目录 前言1. Carla基本架构2.Carla安装2.1 Pre-comiled版本2.1.1 安装要求2.1.2 安装前言 学习参考文档: 1.小飞自动驾驶系列分享 1. Carla基本架构 Client-Server的交互形式:Carla主要分为Server与Client两个模块,Server端用来建立这个仿…

echarts柱形图实现2.5D

思路&#xff1a;使用markpoint option {title: {text: Rainfall vs Evaporation,subtext: Fake Data},tooltip: {trigger: axis},legend: {data: [Rainfall, Evaporation]},toolbox: {show: true,feature: {dataView: { show: true, readOnly: false },magicType: { show: t…

51单片机入门_江协科技_27~28_OB记录的自学笔记_AT24C02数据存储秒表

27. AT24C02(I2C总线) 27.1. 存储器介绍 27.2. 存储器简化模型介绍&#xff0c;存储原理 27.3. AT24C02介绍 •AT24C02是一种可以实现掉电不丢失的存储器&#xff0c;可用于保存单片机运行时想要永久保存的数据信息 •存储介质&#xff1a;E2PROM •通讯接口&#xff1a;I2…

Python基础:【习题系列】判断题(三)

在Python中&#xff0c;列表推导可以用来创建新的列表。 答案&#xff1a;对 Python中使用!操作符来检查两个值是否不相等。 答案&#xff1a;对 Python中的类定义中必须包含至少一个方法。 答案&#xff1a;错 nonlocal关键字用于在函数或其他作用域内访问外部&#xff08;…