Node.js:模块 包
Node.js:模块 & 包
- 模块
- module对象
- 包
- npm
- 安装包
- 配置文件
- 镜像源
- 分类
模块
模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。
简单来说,就是把一个大问题拆分成一系列小问题,然后逐个解决的过程。这就像是搭乐高积木,不是直接建造一个巨大的城堡,而是先建造城堡,花园等几个小部分,然后再把它们组合起来。
如果后续某些功能不需要了,或者某些功能需要更新,只需要操作对应的模块即可,不需要改动整个程序。
再比如说,可能两个程序需要一个相同的功能,那么就就可以把这个模块复制两份,给不同的程序使用。
所以模块可以提高代码的复用性,可维护性。
Node.js
中根据模块来源的不同,将模块分为了3 大类:
- 内置模块:内置模块是由
Node.js
官方提供的,例如fs
、path
、http
等 - 自定义模块:用户创建的每个
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.exports
和exports
指向不同,导入模块最终以module.exports
为准,所以exports
就失效了。
包
在Node.js
中,第三方模块又称为包
。
Node.js
的内置模块功能较少,基于内置模块开发效率很低,因此很多第三方封装了更加高级方便的模块,并公开给大家使用。
npm
如果包太多,那么每个不同的包都要去不同的地方下载,这样很麻烦。但是npm
建立了一个包共享平台,很多程序员都会把自己封装的包提交到这个平台,因此我们就可以通过npm
来快速下载所需的包。
官方网址:
https://www.npmjs.com/
安装包
下载包的命令:
npm install 包名
npm i 包名
i
是install
的简写,两种格式都可以下载包。
删除包的命令:
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
,就是按照全局安装的,这样后续所有项目下载包时,都会使用淘宝的镜像源。
相关文章:

Node.js:模块 包
Node.js:模块 & 包 模块module对象 包npm安装包配置文件镜像源 分类 模块 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说,模块是可组合、分解和更换的单元。 简单来说,就是把一个…...

油动无人机动力测试台-60公斤级-Flight Stand 60 ICE
产品简介 通过Flight Stand 60 ICE测试台对内燃机和螺旋桨的拉力,扭矩,转速,燃油流量,温度,功率和螺旋桨效率的测量,帮助用户精准地描述和评估其性能参数,以不断地优化和提升燃油动力系统性能。…...

给grasshopper中的python脚本电池加个标签
ghenv.Component.Message test使用python脚本创建的电池,也可以保存起来。 File – Create User Object...
别被忽悠了 Lua 数组真的也可以从 0 开始索引?
先前我说 Lua 数组从 1 开始不太爽,很多人来纠正我说也可以从 0 开始,比如: local m { [0] 100, 101, 102, 103 }然后访问时 m[0] 也可以正常访问到第 0 个元素,所以 “Lua 给你充分自由度,让你可以从任意下标索引数…...

docker占用磁盘过多问题
我在windows系统上用docker,安装在C盘环境下,我发现C盘占用了大量的空间,查找后发现是docker的映像文件占用的,于是开始清理,中间还踩个坑,记录一下,下次需要的时候方便找。 踩坑 我本想移动映…...
[实时计算flink]使用Python依赖
您可以在Flink Python作业中使用自定义的Python虚拟环境、第三方Python包、JAR包和数据文件等,本文为您介绍如何在Python作业中使用这些依赖。 使用自定义的Python虚拟环境 说明 VVR 4.x仅支持3.7版本的Python虚拟环境,VVR 6.x及以上的版本无此限制&a…...
MySql如何实现分布式锁
本篇我们使用mysql实现一个分布式锁。 环境:mysql8,navicat,maven,springboot2.3.11,mybatis-plus 分布式锁的功能 1,分布式锁使用者位于不同的机器中,锁获取成功之后,才可以对共享资源进行操作 2,锁具有重入的功能:即一个使用…...

「行内揭秘」 SQLynx数据库界的“小众宝藏”?
数据库界的“小众宝藏”?Navicat老大哥地位稳如泰山,但这位“SQLynx”小弟也不容小觑!👀 别看它小众,SQLynx在处理数据库事务上那可是丝毫不含糊,无论你是Windows Linux和Mac,甚至银河麒麟统信都…...

【已解决】【MySQL】IDEA配置数据库 报错 未配置SQL方言 无法使用SQL提示
IDEA配置数据库的步骤 下载插件 添加数据源 新建--->选择数据源MySQL 页面展示: 主机名:一般都是localhost不用改端口:填写自己的端口号用户:填写自己的用户名密码:填写自己设置的密码数据库:填写需要…...

Android 开发 调节声音 SeekBar自定义样式
效果图 xml布局 mipmap/seekbar图片随意一张图都可以,这里我的图就不贴出来了 <SeekBarandroid:id"id/seekBar"android:layout_marginLeft"8dp"android:layout_width"377dp"android:layout_height"8dp"android:layou…...

UART-通用异步收发器
1. UART的基本工作原理 UART通信主要有两个部分构成:发送器和接收器,也就是我们常见的(RX接收,TX发送)两个独立的线路来实现数据的双向传输,由于是异步的,UART并不需要时钟信号,而是…...

Linux——— 信号
文章目录 前言:引入信号生活中的例子信号概念见一见Linux中的信号 浅度理解信号信号处理(浅谈):如何自定义捕捉 信号保存(浅谈) 信号产生系统调用产生异常产生:浅谈除0异常浅谈解引用野指针异常Core &&…...
安全见闻-web安全
web安全 一、web程序简介 1. Web程序的基本构成 2. 工作流程 3. 安全性 二、JavaScript代码库 1. 代码库的概念和用途 2. 常见的代码库 三、框架 1. 常见的前端框架 2. 常见的后端框架 四、数据库 1. 数据库的分类 2. 数据库的潜在漏洞 3. 学习数据库的重要性 五、…...

华为手机卸载系统应用的方法
摘要: 1.手机环境:手机需要开启开发者模式并使用usb连接电脑,并选择文件传输模式 2.电脑环境:使用鸿蒙工具箱进行傻瓜操作或安装adb工具进行命令卸载 3.鸿蒙工具箱和adb工具本质都是使用adb shell pm uninstall -k --user 0 xx…...
力扣算法笔记——生成随机数组
题目信息: 给两个随机数和N,生成M到N的随机不重复数组,且M<N。 示例:输入M 2, N5, 输出 [4,3,2,5]. 思路:洗牌算法,先遍历M到N之间所有的数字,将得到的结果存入一个集合中,将集合从后往前遍历…...

Anaconda和Pycharm超详细安装教程(2024版本+Win11)
详细安装:https://download.csdn.net/download/qq_40379132/89924782 一、安装Anaconda 1.1 下载Anaconda 在官方网站(Free Download | Anaconda)上下载适用于你的操作系统的 Anaconda 安装包。(这里以windows为例)…...
代码随想录:从中后/中前遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 用分治思想,后序遍历是左右中,中序遍历是左中右,后序遍历的最后一个元素就是根节点, 在中序遍历中找到它的位置,它前面的为左子树,后面的为右子树,并能计…...

2-134 基于matlab的图像边缘检测
基于matlab的图像边缘检测,采用六种算子(分别是gabor、拉普拉斯、priwitt、robert、sobel、wallis微分算子),对图象进行边缘检测比较,输出边缘检测结果。可对比效果优劣。程序已调通,可直接运行。 下载源程序请点链接…...

【Java并发编程】线程池详解
一、简介 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池:ThreadPoolExecutor 类,帮助开发人员管理线程并方便地执行并行任务。了…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...