Node.js - 模块化与包管理工具

news2025/1/13 6:00:33

1. 前言

模块化是代码组织的方式,而包管理工具是管理模块的工具。在现代项目开发中,模块化和包管理工具几乎是不可分割的一部分,它们一起构成了高效的开发工作流。

包代表了一组特定功能的源码集合,包管理工具可以对包进行下载安装,更新删除,上传等操作

常用的包管理工具有npm,yarn,cnpm,本文讲解Node.js中模块化与包的管理,使用。

2. 代码的模块化

2.1 代码模块化的声明与导入

//index.js
function showName(){
    console.log("Ricardo")
}

module.exports = showName;

使用module.exports声明需要导出的模块

//main.js
const s  =require('./index.js')
s()

在主代码文件中导入所需要的模块,导入完毕后即可使用。

2.2 包的导入

当使用 require('./folder')import './folder' 导入一个文件夹时,Node.js 会按照以下规则寻找模块:

第一步:在文件夹中寻找 package.json 文件。

  • 如果找到 package.json 文件,Node.js 会读取其中的 main 字段(或 exports 字段)。
  • main 字段指定了该模块的入口文件
{
  "name": "example",
  "version": "1.0.0",
  "main": "lib/index.js"
}

上述例子中,Node.js 会尝试加载 ./folder/lib/index.js ,若存在则导入成功

第二步:如果 package.json 文件不存在或 main 字段缺失

  • 如果找不到 package.json 文件,或文件中没有 main 字段,Node.js 会尝试导入文件夹下的默认文件:

    • 检查 index.js 文件

      • Node.js 会寻找文件夹下的 index.js 文件作为模块的入口。

      • 如果 index.js 存在,则导入成功。

    • 检查 index.json 文件

      • 如果 index.js 不存在,Node.js 会继续寻找 index.json 文件作为模块的入口。

      • 如果 index.json 存在且格式正确,则导入成功。

示例:

package.json指定main文件:

project/
├── folder/
│   ├── package.json
│   ├── lib/
│   │   └── main.js

package.json文件内容:

{
  "main": "lib/main.js"
}

 导入时:

const module = require('./folder'); // 导入 ./folder/lib/main.js

 

3. npm

npm全称为Node package manager,意思为node的包管理工具,如果成功安装了node.js,则可以直接使用npm。

打开cmd,输入

npm -v

查看是否安装npm与版本号

4. 创建包项目

npm init

创建npm的配置文件,会让用户回答一系列问题,生成对应的json配置文件

包的名称不能为中文与大写,默认值为文件夹名称

也可以使用

npm init -y

快速创建对应的包文件,生成的 package.json 文件是项目管理、依赖安装、脚本定义的重要工具,是每个 Node.js 项目不可或缺的一部分。

5. npm搜索包

在终端中运行如下命令,node.js会返回对应的相关信息

npm s 关键词

或者在下述网址中搜索所需要的包信息

www.npmjs.com

6. npm包的安装

npm install 包的名字
npm i packageName

下载完成后所有的包会统一存放在node_modules文件夹中,并存放有相应包的版本信息

6.1 全局安装

使用-g进行全局安装

npm i -g nodemon

全局安装之后的包,独立的命令在命令行中使用,例如上述命令全局安装nodemon包,在命令行的任何位置运行nodemon命令,该命令的作用是自动重启node应用程序。

需要注意的是,不是所有的包都适合全局安装,只有全局类的工具才适合

npm root -g

使用上述命令查看全局安装的文件安装位置

6.2 安装依赖包

npm i

安装所有的依赖包,读取package.json文档,安装至当前文件夹下的node_modules文件,安装所有的依赖包

6.3 安装指定版本包

npm i packageName@版本号

在常规安装后使用@符并声明响应版本号 

7. 包的使用

//example
const uniq = require("uniq");

require是导入node_modules文件夹下uniq这个文件夹,访问包的信息,找到main参数所对应的代码文件;若当前文件夹下找不到对应包信息,则会返回上一级继续寻找,直到找到。

包的依赖:若创建了一个包为A,A中安装了包B,则称之为B为A的依赖包,也会说A依赖于B

类型命令补充
生产依赖npm -S packageName

-S等效于--save,为包的默认引入模式。

包信息保存在package.json中dependencies属性中

开发依赖npm -D packageName

等效于--save-dev.

包信息保存在package.json中的devDependencies属性中

开发依赖是在开发阶段中使用的依赖包,生产依赖是开发阶段和最终上线运行阶段都用到的依赖包

8. 配置别名

进入到package.json文件中,找到script对象,在内部声明对应的别名与命令

"script":{"server":"node ./test.js"}

在终端中运行,使用run命令,有自动向上级目录查找的特性

node run server

start别名比较特殊,运行时可以忽略run命令

npm start

9. 删除包

npm r packageName //删除文件夹中的包 
npm r -g packageName //删除全局包


10. 管理Node版本

nvm全称为Node Version Manager,方便切换不同版本的node,

首先下载nvm,选择nvm-setup.exe下载安装即可。

常用命令:

命令说明
nvm list avaliable显示所有可以下载的Node.js版本
nvm list显示已安装的版本
nvm install 18.2.1安装18.2.1的版本
nvm install latest安装最新版Node.js
nvm uninstall 18.2.1删除18.2.1版本的Node.js
nvm use 18.2.1切换18.2.1的Node.js

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

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

相关文章

贪心算法汇总

1.贪心算法 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 如何能看出局部最优是否能推出整体最优 靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。 如何验证可不可以…

leetcode-最长递增子序列

300. 最长递增子序列 - 力扣(LeetCode) 动态规划的题目我真的不想看题解,题解都是直接推出来动态转移方程,我就很纳闷,到底是怎么推出来的呢?什么样的智慧,上来分析问题就是那么的清晰有条理。我…

Qt 5.14.2 学习记录 —— 십일 QLCDNumber、ProgressBar、QCalendarWidget

文章目录 1、QLCDNumber2、ProgressBar3、QCalendarWidget 1、QLCDNumber 写一个倒计时程序。拖一个LCD Number到界面: 定时器用Qt的QTimer类,这个类的对象会产生一个timeout信号,通过start方法来开启定时器,并且参数中设定触发ti…

VDN 微服务架构搭建篇(二)服务注册与配置中心Nacos

VDN 微服务架构搭建篇(二):服务注册与配置中心 Nacos 本文将介绍如何使用 Spring Cloud Alibaba 和 Nacos 搭建服务注册与配置中心,重点讲解如何实现微服务架构中的服务发现、自动注册、配置管理以及动态配置刷新等功能。通过整合…

高等数学学习笔记 ☞ 单调性、凸凹性、极值、最值、曲率

1. 单调性 1. 单调性定义:设函数在区间上有定义,对于区间上任意两点,若: ①:当时,恒有,则称函数在区间上单调递增。 ②:当时,恒有,则称函数在区间上单调递减…

38家医药股回购,9家注销,丽珠集团公告犯低级错误

作者 庄泽 编辑 雨菲 2025年以来至1月10日,申万医药生物板块共有38家公司发布股票回购公告,其中包括介绍公司2024年股票回购情况,以及新发起股票回购事项等。 从回购股票用途来看,38家公司中,有26家回购股票用于股权激…

最近在盘gitlab.0.先review了一下docker

# 正文 本猿所在产品的代码是保存到了一个本地gitlab实例上,实例是别的同事搭建的。最近又又又想了解一下,而且已经盘了一些了,所以写写记录一下。因为这个事儿没太多的进度压力,索性写到哪儿算哪儿,只要是新了解到的…

GitLab本地服务器配置ssh和克隆项目

1. 本地安装好git git链接:https://git-scm.com/downloads/win 无脑点击下一步安装即可,打开Git Bash命令终端如下: 2. 配置本地用户名和邮箱 git config --global user.name "你的名字" git config --global user.email "你的邮箱&quo…

【2024年华为OD机试】 (A卷,100分)- 二元组个数(Java JS PythonC/C++)

一、问题描述 以下是题目描述的 Markdown 格式: 题目描述 给定两个数组 a 和 b,若 a[i] b[j],则称 [i, j] 为一个二元组。求在给定的两个数组中,二元组的个数。 输入描述 第一行输入 m,表示第一个数组的长度。第二…

中学综合素质笔记2

第一章职业理念 第二节学生观 考情提示: 单选题材料分析题 学习要求: 理解、 识记、 一、以人为本的学生观 (一)学生是发展的人——动态变化 学生的身心发展是有规律的(单选) 顺序性、阶段性、不平衡…

Spring AMQP-保证消费者消息的可靠性

为什么要保证消息的可靠性? 当MQ向消费者发送一个消息之后需要得到消费者的状态,因为消息并不一定就真的被消费者给消费了,可能在消费的过程中出现了一些意外,比如 1. 网络问题 2. 消息转换有问题 3. 消费者本身的业务处理有问题 …

AI刷题-数位长度筛选问题、数值生成与运算问题

目录 一、数位长度筛选问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 关键点 最终代码: 运行结果: 二、数值生成与运算问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤…

算法学习(24)—— BFS解决拓扑排序

关于拓扑排序 ①有向无环图(DAG图) 就跟它的名字一样,有方向但是没有环的图,如下图:我们了解下入度和出度,二者都是针对一个点来说的,就以上图为例入度:表示有多少条边指向一个点&am…

【深度学习入门_基础篇】概率论

开坑本部分主要为基础知识复习,新开坑中,学习记录自用。 学习目标: 随机事件与概率、随机变量及其分布、多维随机变量及其分布、大数定律与中心极限定理。 强烈推荐此视频: 概率论_麻省理工公开课 废话不多说,直接…

Gitlab-Runner配置

原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务,如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信,接收作业并提交到执行队列,Gitlab-Runner从队列中获取作业,并允许在不同环境下进行作…

多并发发短信处理(头条项目-07)

1 pipeline操作 Redis数据库 Redis 的 C/S 架构: 基于客户端-服务端模型以及请求/响应协议的 TCP服务。客户端向服务端发送⼀个查询请求,并监听Socket返回。通常是以 阻塞模式,等待服务端响应。服务端处理命令,并将结果返回给客…

OSPF - 1类LSA(Router-LSA)

前篇博客有对常用LSA的总结 1类LSA是OSPF计算最原始的材料,他会泛洪发给所有的路由器 LSA是包含在LSU中的,一条LSU能够携带多条LSA options位所有LSA都会有,用于标记起源于什么类型的区域,具体查看文章【邻居建立】 flags位是一…

pdf提取文本,表格以及转图片:spire.pdf

文章目录 🐒个人主页:信计2102罗铠威🏅JavaEE系列专栏📖前言:🎀 1. pdfbox1.1导入pdfbox 的maven依赖1.1 提取文本1.2 提取文本表格(可自行加入逻辑处理)1.3 pdf转换成图片代码&…

_STM32关于CPU超频的参考_HAL

MCU: STM32F407VET6 官方最高稳定频率:168MHz 工具:STM32CubeMX 本篇仅仅只是提供超频(默认指的是主频)的简单方法,并未涉及STM32超频极限等问题。原理很简单,通过设置锁相环的倍频系数达到不同的频率&am…

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构: {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…