Node.js:模块 包

Node.js:模块 & 包

    • 模块
      • module对象
      • npm
        • 安装包
        • 配置文件
        • 镜像源
      • 分类


模块

模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。

简单来说,就是把一个大问题拆分成一系列小问题,然后逐个解决的过程。这就像是搭乐高积木,不是直接建造一个巨大的城堡,而是先建造城堡,花园等几个小部分,然后再把它们组合起来。

如果后续某些功能不需要了,或者某些功能需要更新,只需要操作对应的模块即可,不需要改动整个程序。

再比如说,可能两个程序需要一个相同的功能,那么就就可以把这个模块复制两份,给不同的程序使用。

所以模块可以提高代码的复用性,可维护性。

Node.js 中根据模块来源的不同,将模块分为了3 大类:

  • 内置模块:内置模块是由 Node.js 官方提供的,例如 fspathhttp
  • 自定义模块:用户创建的每个 js 文件,都是自定义模块
  • 第三方模块:由第三方开发出来的模块,使用前需要先下载

想要加载一个模块,可以使用require方法:

const obj = require('模块名')
const obj = require('模块路径')

对于内置模块和第三方模块,只需要传入模块名即可,如果是自定义模块,就需要填入模块的路径。

比如:

const test = requits('./test.js')

自定义模块一定是一个.js结尾的文件,所以也可以省略.js后缀:

const test = requits('./test')

模块被导入时,模块内部的代码会立刻执行一次

./test.js写入以下代码:

console.log('require test.js success')

在另一个文件中导入模块:

const test = require('./test.js')
console.log(test)

输出结果:

require test.js success
{}

./test.js中的代码,就立刻执行了一次,test变量拿到了一个空对象。


module对象

在模块中定义的变量、方法,都只能在模块内部被访问,这种模块级别的访问限制,称为模块作用域

那么外部导入模块后,又要如何访问模块的内容?这就需要通过module对象了。

在每一个.js模块中,都有一个module对象,这里面存储了当前模块的相关信息。

直接console.log输出这个对象:

{id: '.',path: 'D:\\code_web\\test\\Node\\02',exports: {},filename: 'D:\\code_web\\test\\Node\\02\\main.js',loaded: false,children: [],paths: ['D:\\code_web\\test\\Node\\02\\node_modules','D:\\code_web\\test\\Node\\node_modules','D:\\code_web\\test\\node_modules','D:\\code_web\\node_modules','D:\\node_modules'],[Symbol(kIsMainSymbol)]: true,[Symbol(kIsCachedByESMLoader)]: false,[Symbol(kIsExecuting)]: true
}

可以看到一些文件的相关信息,其中exports: {}是一个空对象,通过exports这个属性可以向外共享模块的内容,默认情况为空。当外界通过require导入模块时,拿到的就是这个对象。

示例:

test.js中,将成员与方法添加到module.exports中:

console.log('require test.js success')module.exports.username = "张三"
module.exports.sayHello = function(){console.log(this.username + " say hello")
}

main.js中导入模块,并调用函数:

const test = require('./test.js')
console.log(test)test.sayHello()

输出结果:

require test.js success
{ username: '张三', sayHello: [Function (anonymous)] }
张三 say hello

此时test变量,拿到的就是一个有内容的对象,并且可以正常调用模块内的属性与方法。

每次共享一个新的成员或方法,都要使用module.exports,这有点麻烦了。为此Node.js提供了exports对象,它与module.exports指向同一个对象,在编写代码时,可以使用简写。

exports.username = "张三"
exports.sayHello = function(){console.log(this.username + " say hello")
}

但是要注意,不要改变exports指向的对象

exports = {username: "李四",sayHello: function(){console.log(this.username + " say hello")}
}

如果在某个模块内部这样写,等到模块导入后,拿到的是一个空对象,而不是exports指向的对象。因为以上代码相当于把exports指向了一个新的对象,此时module.exportsexports指向不同,导入模块最终以module.exports为准,所以exports就失效了。


Node.js中,第三方模块又称为

Node.js的内置模块功能较少,基于内置模块开发效率很低,因此很多第三方封装了更加高级方便的模块,并公开给大家使用。

npm

如果包太多,那么每个不同的包都要去不同的地方下载,这样很麻烦。但是npm建立了一个包共享平台,很多程序员都会把自己封装的包提交到这个平台,因此我们就可以通过npm来快速下载所需的包。

官方网址:

https://www.npmjs.com/
安装包

下载包的命令:

npm install 包名
npm i 包名

iinstall的简写,两种格式都可以下载包。

删除包的命令:

npm uninstell 包名

下载一个moment包:

在这里插入图片描述

这个包是一个时间相关的包,使用时直接以普通模块的形式导入即可:

const moment = require('moment')const dt = moment().format('YYYY-MM-DD HH:mm:ss')
console.log(dt)

此处moment().format('YYYY-MM-DD HH:mm:ss'),用于格式化输出当前时间。

输出结果:

2024-10-30 20:40:36

配置文件

在第一次装包后,同级目录会出现以下文件:

在这里插入图片描述

node_modules存储了所有下载的包,比如刚下载的moment,而.package-lock,json是包的相关信息,内容如下:

{"name": "02","lockfileVersion": 3,"requires": true,"packages": {"": {"dependencies": {"moment": "^2.30.1"}},"node_modules/moment": {"version": "2.30.1","resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz","integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==","license": "MIT","engines": {"node": "*"}}}
}

这里面保存了下载的包的相关信息,比如下载版本,下载来源等等。

如果想要下载指定版本的包,语法如下:

npm install 包名@版本号
npm i 包名@版本号

例如安装moment:2.22.2版本:

在这里插入图片描述

显示修改了一个包,也就是之前的2.30.1版本被覆盖了。

除去node_modules.package-lock,json,还可以找到一个package,json文件:

在这里插入图片描述

这个文件与node_modules同级,内部包含dependencies属性:

{"dependencies": {"moment": "^2.30.1"}
}

比如再下载一个jQuery

在这里插入图片描述

此时package,json文件更新:

{"dependencies": {"jquery": "^3.7.1","moment": "^2.30.1"}
}

这里记录了所有下载过的包,当拿到一个项目时,往往不会提供node_modules目录,因为这个目录很大,不利于传输。因此会提供一个package,json文件,这个文件可以帮助快速下载所有依赖的包。

npm install
npm i

npm install不带任何包名,就会去下载package,json文件中指定的所有包,快速初始化项目。

package,json文件不在node_modules目录内部,而是与node_modules同级,就是因为多人协作时node_modules往往不会发送给同事,而是发送package,json来初始化项目。


镜像源

默认情况下,npm会去https://registry.npmjs.org/这个网址下载包,但是这是一个国外的网址,下载速度比较慢。

为此,淘宝在国内建立了一个镜像站https://registry.taobao.org/,这个网站会实时同步https://registry.npmjs.org/,所以国内用户可以修改镜像源为这个淘宝的镜像源,提升下载效率。

查看当前镜像源:

npm config get registry

安装nrm工具:

npm i nrm -g

在这里插入图片描述

查看可用的镜像源:

nrm ls

在这里插入图片描述

切换到淘宝镜像源:

nrm use taobao

在这里插入图片描述


分类

包分为项目包全局包

  • 项目包:只供一个项目使用的,安装到node_modules目录下的包
  • 全局包:主机上所有项目都可以使用的包

如果想要安装或卸载全局包,只需要加上-g参数即可:

npm i -g 包名
npm uninstall -g 包名

先前安装的nrm,就是按照全局安装的,这样后续所有项目下载包时,都会使用淘宝的镜像源。


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

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

相关文章

恋爱脑学Rust之dyn关键字的作用

在 Rust 语言中,dyn 关键字允许我们在使用特征时创建“动态派发”——即通过一个统一的接口操作多种类型的具体实现。可以把它理解成一种“浪漫的妥协”:当我们不知道未来会爱上谁,只知道对方一定具有某种特征时,dyn 就像一个协议…

vue3项目中实现el-table分批渲染表格

开篇 因最近工作中遇到了无分页情景下页面因大数据量卡顿的问题&#xff0c;在分别考虑并尝试了懒加载、虚拟滚动、分批渲染等各个方法后&#xff0c;最后决定使用分批渲染来解决该问题。 代码实现 表格代码 <el-table :data"currTableData"borderstyle"wi…

Qt自定义控件:汽车速度表

1、功能 制作一个汽车速度表 2、实现 从外到内进行绘制&#xff0c;初始化画布&#xff0c;画渐变色外圈&#xff0c;画刻度&#xff0c;写刻度文字&#xff0c;画指针&#xff0c;画扇形&#xff0c;画内圈渐变色&#xff0c;画黑色内圈&#xff0c;写当前值 3、效果 4、源…

语音识别:docker部署FunASR以及springboot集成funasr

内容摘选自: https://github.com/modelscope/FunASR/blob/main/runtime/docs/SDK_advanced_guide_offline_zh.md FunASR FunASR是一个基础语音识别工具包&#xff0c;提供多种功能&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语音端点检测&#xff08;VAD&#xf…

鸿蒙进阶篇-模态转场

hello大家好&#xff0c;这里是鸿蒙开天组&#xff0c;今天让我们来学习鸿蒙进阶篇-模态转场 模态转场 今天来学习模态转场&#xff0c;就是页面中弹出&#xff0c;全屏&半屏的弹框&#xff1a; 就像这样&#xff0c;模态转场主要分为半模态和全屏模态&#xff0c;上面的…

RGA DEMO 下部

#加载llm模型通过ollama最好别用ollama我是没经济条件 from langchain_community.llms import Ollama llm Ollama(model"qwen1_5-4b-chat-q2_k")#pip install langchain_ollama -i https://pypi.tuna.tsinghua.edu.cn/simple #OllamaEmbeddings 要写地址本地也要写&…

Faces in Things数据集: 由麻省理工学院、微软等联合发布,探索人类视觉错觉的新里程碑

2024-09-24&#xff0c;由麻省理工学院、微软、丰田研究院、NVIDIA联合发布的 Faces in Things&#xff0c;为我们打开了研究人类视觉错觉——尤其是面部错觉&#xff08;Pareidolia&#xff09;的新篇章。专注于人类视觉系统如何在各种随机刺激中检测到类似面孔的结构&#xf…

知识见闻 - Workday公司介绍

人力资源“一哥”Workday的前世今生 01 Duffield 既然要聊Workday&#xff0c;我们首先要认识一个人。David Duffield&#xff0c;又一位企业软件服务行业的绝对大神。 大卫杜菲尔德&#xff08;David Duffield&#xff09;出生于1941年。 40岁&#xff0c;很多职场人都已经认命…

宁德时代嵌入式面试题及参考答案(万字长文)

vector 和 list 的主要区别是什么&#xff1f; 向量&#xff08;vector&#xff09;和链表&#xff08;list&#xff09;是 C 中两种常用的容器。 从底层数据结构来讲&#xff0c;vector 是基于连续的内存存储的动态数组。这使得它可以通过索引快速访问元素&#xff0c;时间复杂…

设计模式08-行为型模式1(命令模式/迭代器模式/观察者模式/Java)

五、行为型模式 **行为模式的定义&#xff1a;**行为型模式是对不同的对象之间划分职责和算法的抽象化。行为型模式定义了系统中对象之间的交互与通信&#xff0c;研究系统在运行时对象之间的相互通信与协作&#xff0c;进一步明确对象的职责&#xff0c;包括对系统中较为复杂的…

【设计模式】结构型模式(二):代理模式

结构型模式&#xff08;二&#xff09;&#xff1a;代理模式 3.代理模式&#xff08;Proxy&#xff09;3.1 主要特点3.2 组成部分3.3 示例代码3.3.1 Subject 接口3.3.2 RealSubject 实际对象3.3.3 Proxy 代理对象3.3.4 客户端代码3.3.5 运行结果 3.4 总结 3.代理模式&#xff0…

第二十八章 Vue之自定义指令

目录 一、引言 二、自定义指令的注册和使用方式 2.1. 自定义指令-全局注册使用 2.2. 自定义指令-局部注册使用 三、自定义指令完整代码 3.1. 自定义指令全局注册/使用 3.1.1. main.js 3.1.2. App.vue 3.2. 自定义指令局部注册/使用 3.2.1. main.js 3.2.2. App.vue …

Charles简单压力测试

1.接口请求次数&#xff0c;并发量&#xff0c;请求延迟时间均可配置 1.1选中需要进行测试的接口&#xff0c;鼠标右键选中【repeat advance】 2.设置并发参数 下面的图中&#xff0c;选择了1个接口&#xff0c;每次迭代中1个接口同时请求&#xff0c;迭代1000次&#xff08;…

【uniapp3】分享一个自己写的h5日历组件

简言 分享一下自己基于uniapp写的日历组件。如果不太满足你的需求&#xff0c;可以自己改造。 日历 实现分析&#xff1a; 页面显示 - 分为顶部显示和日历显示&#xff0c;我这里做了多行和单行显示两种情况&#xff0c;主要是当时看着手机的日历做的&#xff0c;手机上的…

Java设计模式(代理模式整理中ing)

一、代理模式 1、代理模式定义&#xff1a; 代理模式&#xff1a;由于某些原因要给某对象提供一个代理以控制对该对象的访问&#xff0c;这时访问对象不适合或者不能够直接引用目标对象&#xff0c;代理对象作为访问对象与目标对象之间的中介进行连接调控调用。 2、代理模式的…

Thumb 汇编指令集,Thumb 指令编码方式,编译 Thumb 汇编代码

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ Thumb指令集 ARM 指令集&#xff1a;最早在 1985 年随第一代 ARM 处理器问世。ARM 指令集一开始是 32 位固定长度的指令&#xff0c;用于各种计算任务。 Thu…

Leetcode - 周赛421

目录 一&#xff0c;3334. 数组的最大因子得分 二&#xff0c;3335. 字符串转换后的长度 I 三&#xff0c;3336. 最大公约数相等的子序列数量 四&#xff0c;3337. 字符串转换后的长度 II 一&#xff0c;3334. 数组的最大因子得分 暴力方法就不演示&#xff0c;这里介绍一个…

文件管理工具的按路径名称归类功能大公开,将大量文件批量复制或移动到指定路径,办公软件达人的秘密武器

是否还在为成堆的文件归类而苦恼&#xff1f;想要一键就能将海量文件按路径名称轻松归类&#xff0c;无论是复制还是移动&#xff1f;别急&#xff0c;今天就让文件批量改名高手软件的按路径名称归类功能来拯救你的文件管理世界&#xff01;让我们一起告别繁琐&#xff0c;迎接…

建设NFS服务器并实现文件共享

关闭防火墙和s0 systemctl stop firewalld setenforce 0 安装NFS yum install nfs-utils -y 新建共享目录并设置权限 echo "hello" > /nfs/shared/test1 chmod -Rf 777 /nfs/shared/ 配置服务端的NFS配置文件 vim /etc/exports /nfs/shared *(ro) 启动…

曹操出行借助 ApsaraMQ for Kafka Serverless 提升效率,成本节省超 20%

本文整理于 2024 年云栖大会主题演讲《云消息队列 ApsaraMQ Serverless 演进》&#xff0c;杭州优行科技有限公司消息中间件负责人王智洋分享 ApsaraMQ for Kafka Serverless 助力曹操出行实现成本优化和效率提升的实践经验。 曹操出行&#xff1a;科技驱动共享出行未来 曹操…