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.mzph.cn/news/884413.shtml

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

相关文章

【Arduino】一分钟快速在vs code 编译开发Arduino

下载Arduino 对于一些开发者来说,Arduino开发较为不方便,不管从代码的阅读性、开发效率等等方面,vs code都要优于Arduino IDE开发,而且vs code开发可以使用插件,比如一些AI代码插件,可以加快开发速率&#…

WPF+MVVM案例实战(十九)- 自定义字体图标按钮的封装与实现(EF类)

文章目录 1、案例效果1、按钮分类2、E类按钮功能实现与封装1.文件创建与代码实现2、样式引用与封装 3、F类按钮功能实现与封装1、文件创建与代码实现2、样式引用与封装 3、按钮案例演示1、页面实现与文件创建2、运行效果如下 4、源代码获取 1、案例效果 1、按钮分类 在WPF开发…

Java基本语法和基础数据类型——针对实习面试

目录 Java基本语法和基础数据类型标识符和关键字有什么区别?Java关键字有哪些?Java基本数据类型有哪些?什么是自动装箱和拆箱?自动装箱(Autoboxing)自动拆箱(Unboxing) 自动装箱和拆…

c# 值类型

目录 1、c#类型2、值类型2.1 结构体2.2 枚举 1、c#类型 类型(Type)又叫数据类型(Data Type)。 A data type is a homogeneous collection of values,effectively prensented,equipped with a set of operations which manipulate…

【压力测试】如何确定系统最大并发用户数?

一、明确测试目的与了解需求 明确测试目的:首先需要明确测试的目的,即为什么要确定系统的最大并发用户数。这通常与业务需求、系统预期的最大用户负载以及系统的稳定性要求相关。 了解业务需求:深入了解系统的业务特性,包括用户行…

【玉米叶部病害识别】Python+深度学习+人工智能+图像识别+CNN卷积神经网络算法+TensorFlow

一、介绍 玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集(‘矮花叶病’, ‘健康’, ‘灰斑病一般’, ‘灰斑病严重’, ‘锈病一般’, ‘锈病严重’, ‘叶斑病一般’, ‘叶斑病严重’&#x…

PAT甲级-1048 Find Coins

题目 题目大意 给出硬币的个数n和要付费的钱m&#xff0c;接下来给出每个硬币的面值。要求从这些硬币中找到两个硬币v1, v2&#xff0c;使得v1 v2 m&#xff0c;且v1 < v2&#xff0c;输出v1 v2。如果不能找到这两个硬币&#xff0c;输出No Solution。 思路 刚开始用的…

算法练习:LCR 179. 查找总价格为目标值的两个商品

题目链接&#xff1a;LCR 179. 查找总价格为目标值的两个商品 利用双指针位于数值两端来进行控制&#xff0c;定义sum来记录两指针分别对应的值的和&#xff0c; 这里有个重要的点就是该数组是升序&#xff0c;所以&#xff1a; 当sum > target时&#xff0c;end--&#x…

构建数据湖仓的开源技术栈有哪些

湖仓一体架构是一种新兴的数据管理方式&#xff0c;它融合了数据湖和数据仓库的优势&#xff0c;提供了统一的数据存储、事务支持、数据治理、实时与批处理能力以及弹性和可扩展性。在开源领域&#xff0c;湖仓一体技术栈的选择非常关键&#xff0c;因为它直接影响到系统的灵活…

每日OJ题_牛客_排序子序列_模拟_C++_Java

目录 牛客_排序子序列_模拟 题目解析 C代码 Java代码 牛客_排序子序列_模拟 排序子序列_牛客笔试题_牛客网 (nowcoder.com) 描述&#xff1a; 牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数…

电脑软件:推荐一款免费且实用的电脑开关机小工具

目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown&#xff0c;有需要的朋友可以下载试一下&#xff01; 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具&#xff0c;对于…

网关如何传递信息给微服务

前情回顾 上篇我们已经完成了网关对所有微服务请求的拦截以及JWT的登录校验。 客户端和微服务之间的桥梁--网关&#xff08;身份校验&#xff09;https://mp.csdn.net/mp_blog/creation/editor/143425484 问题引入 现在的问题是在一些微服务业务中&#xff0c;需要用到用户…

BGP路由优选+EVPN

BGP 的路由优选规则是一套多步决策链&#xff0c;用来确定在多个可行路由中选择最优的路由。BGP 是一种路径向量协议&#xff0c;通过这些优选规则&#xff0c;网络管理员可以控制数据流量的流向&#xff0c;确保网络的稳定性和效率。下面以一个实例来详细说明 BGP 的优选规则及…

Vue3图片懒加载(vue3-lazyload)

Vue2图片懒加载 参考文档&#xff1a;vue3-lazyload 效果如下图&#xff1a;vue3-lazyload0.3.8 在线预览 安装 npm install vue3-lazyload # or yarn add vue3-lazyload # or pnpm add vue3-lazyload引入并注册 import { createApp } from vue import VueLazyLoad from v…

Hudi Upsert原理

1. 前言 如果要深入了解Apache Hudi技术的应用或是性能调优&#xff0c;那么明白源码中的原理对我们会有很大的帮助。Upsert是Apache Hudi的核心功能之一&#xff0c;主要完成增量数据在HDFS/对象存储上的修改&#xff0c;并可以支持事务。而在Hive中修改数据需要重新分区或重…

ctfshow web入门文件上传总结

1.web151 前端验证 前端验证&#xff0c;修改html代码&#xff0c;上传还有一句话木马的php文件,之后用蚁剑连接即可找到flag <?php eval($_POST[1])?>2.web152 后端验证&#xff0c;修改mime类型(content-type) burp抓包&#xff0c;修改content-type为image/png …

基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)

&#x1f388;系统亮点&#xff1a;协同过滤算法、节流算法、支付宝沙盒支付、图形化分析、实时聊天&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk1…

手把手写Linux第一个小程序 - 进度条(5种版本)

本专栏内容为&#xff1a;Linux学习专栏&#xff0c;分为系统和网络两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握Linux。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;linux &#x1f69a;代码仓库&#xff1a;小小unicorn的代…

dhcp池没有空闲ip导致手机无法获得ip

得到用户反馈&#xff0c;一个高速项目部的wifi无法接入&#xff0c;让排查原因。 反馈有的手机能接入&#xff0c;有的接入不了。查看ac界面发现有个终端获得的ip是169.254.xxx.xxx。 ip地址是169.254.96.17显然是手机打开wlan开关后&#xff0c;鉴权通过后dhcp过程&#xff0…

《高频电子线路》—— 振荡器稳定性问题

文章内容来源于【中国大学MOOC 华中科技大学通信&#xff08;高频&#xff09;电子线路精品公开课】&#xff0c;此篇文章仅作为笔记分享。 振荡器稳定性问题 频率准确度 & 频率稳定度 希望频率稳定度越小越好。 频率稳定度分类 影响振荡频率稳定度的参数 振荡频率是和电…