Node.js(四)——npm与包

一、包

1.什么是包

Node.js中的第三方模块又叫做包

2.包的来源

不同于node.js中的内置模块或自定义模块,包是第三方个人或团队开发出来的,免费供所有人使用。

3.为什么需要包

因为node.js的内置模块仅提供了一些底层的api,开发效率很低,而包是基于内置模块开发出来,提供了更高级方便的api,提高开发效率。

4.从哪里下载包

国外一家it公司叫npm,Inc,他旗下有一个全球最大的包共享平台https://www.npmjs.com/

他还提供了一个包管理工具叫Node Package Manager(npm 包管理工具),这个包管理工具随着用户安装node一起到了用户电脑上,npm -v可以查看包管理工具的版本号

(用了这么久的东西头一次去了解)

二、npm初体验

格式化时间的包 moment

安装包:npm install 包的完整名称(简写npm i 包的完整名称)

当我们初次下载包的时候会出现node_modules文件和package-lock.json配置文件

node_modules负责存放所有已安装到项目里的包,require()导入第三方包的时候就从这个目录中查找并加载包

package-lock.json用来记录node_modules里下载的包的信息(名字、版本、下载地址等等)

(dependencies节点)

程序员不要手动去修改这两个文件,npm会去管理的

安装指定版本的包在后面加@版本号就行

版本号第一位:大版本

第二位:功能版本

第三位:bug修复版本

三、包管理配置文件

npm规定,在项目根目录中,必须提供一个package.json 的包配置文件,用来记录项目相关的配置信息(项目名称、版本号、描述、项目用到了哪些包、哪些包在开发期间用到,哪些在开发和部署都会用到)

如果第三方包体积过大,当我们需要团队协作把整个包都传到github上的话体积过大 ,那我们就想到了只上传不包括node_modules这个文件夹的源码,并在根目录中创建一个叫package.json的文件记录用到了哪些包,方便各成员使用。

所以我们在开发过程中注意要把node_modules放进.gitignore忽略文件中

1.快速创建package.json文件

npm包管理工具提供了一个快捷命令在执行命令所处的目录中,快速创建package.json包配置文件

复制代码
npm init -y

注意:这个命令只能在英文目录下执行,也不能出现空格

使用npm i的时候,npm包管理工具会自动把包的名称和版本号记录到package.json文件里去

2.dependencies节点

上面那个命令初始化package.json的文件默认没有dependencies这个节点,在npm i之后就有了dependencies节点就是记录npm i命令安装了哪些包的。

当我们拉代码之后npm包管理工具就会读取package.json中的dependencies节点,然后把包一次性下载到项目里

3.卸载包

使用命令npm uninstall(没有简写形式)+包名称,卸载之后的包会自动从package.json中的dependencies节点去掉

4.devDependencies节点

如果某些包只在开发的时候用,上线不用就把这些包记录在devDependencies节点里,都需要用到的话记录在dependencies节点里

命令:npm i 包名称 -D(完整命令是 npm install 包名称 --save-dev)

问题:为什么不是去读取package-lock.json呢,之前不是说

答:项目最开始创建没有node_modules文件夹和package_lock.josn文件,然后只有package.json,当我npm i之后才有了node_modules文件夹和package_lock.josn文件(并且是按照package.json来下载的)

package_lock.josn文件就记录实际下载的信息和版本号之类的

5.解决包下载慢的问题

npm包下载默认使用国外的 https://registry.npmjs.org/ 服务器进行下载,所以下载速度特别慢

淘宝npm镜像服务器:淘宝在国内搭了一个服务器(每隔一段时间自动把外国包同步过来)专门把国外的包同步到国内的服务器

6.切换npm下包镜像源

下包的镜像源指的就是下包的服务器地址

复制代码
//查看当前下包的镜像源
npm config get registry

//将下包的镜像切换为淘宝镜像
npm config set registry=https://registry.npmmirror.com/

7.nrm

为了防止写错单词可以下载这个nrm小工具

复制代码
//安装
npm i nrm -g
//查看所有的镜像源
nrm ls
//将下包的镜像源改为淘宝的
nrm use taobao

四、包的分类和规范管理工具

1.包的分类

使用npm包管理工具下载的包分为两类:

  • 项目包
  • 全局包

(1)项目包

被安装到项目的node_modules文件夹里的包都是项目包,项目包又分为两种:开发依赖包(devDependencies只在开发用)和核心依赖包(dependencies开发和上线都用)

(2)全局包

使用npm的时候加了 -g参数,包就会成为全局包,全局包会被安装到这个目录:

安装npm i 包 -g

卸载npm uninstall 包 -g

只有工具性质的包才有全局安装的必要

2.i5ting_toc

这是一个可以把md文档转为html的小工具

复制代码
//安装
npm i i5ting_toc -g
//转换
i5ting_toc -f 要转换的md路径 -o

-f去指定转换哪个文件

-o表示转换完自动在浏览器打开(转换完的文件自动放在跟md文件同目录下)

3.规范的包的内部结构

规范的包需要满足:

  • 包必须以单独的目录而存在
  • 包的顶级目录下必须包含package.json包配置文件(不是包外层,而是里面)
  • 包里面的package.json包配置文件必须包含name名字、version版本号、main包的入口(被项目引入是加载入口)三个属性

五、发布包

1.开发属于自己的包

包的结构其实就是个文件夹,文件夹名字不是别人以后下载的名字(package.json里面的name才是)(注意包名称不能重复),里面新建仨文件package.json、index.js(入口文件)、README.md

复制代码
{
  "name": "heima",
  "version": "1.0.0",
  "main": "index.js",
  "description": "geeker-admin open source management system",
  "keywords": ["escape","itheima"],
  "license":"ISC"
}

version默认1.0.0

2.发布包步骤

步骤:先注册一个npm账号,然后打开终端,将下包服务器地址转换为官方地址,再npm login命令以此输入用户名和密码

登录之后将终端切换为包的根目录,然后npm publish即可发布到npm

删除已发布包的话npm unpublish 包名 --force

注意:npm unpublish 包名只能删除72小时内发布的包(搜了一下npm unpublish 包名 --force如果引用量低超过72h也能删除,一删就是删整个包,npm unpublish还能删除某个版本)

npm unpublish的包在24小时内不能重复发布

六、模块的加载机制

1.优先从缓存中去加载

模块在第一次加载后会被缓存,也就是说不是每次require()都重新去执行模块的代码。

注意:不管是内置模块、自定义模块、第三方模块都优先从缓存中加载,从而提高模块的加载效率。

2.内置模块的加载机制

内置模块是node.js官方提供的,他的加载优先级最高(如果内置和第三方/内置的重名了的话)

3.自定义模块的加载机制

自定义模块引入一定要以./或者../为开头,要不然会被认为是内置模块或者第三方模块。

而且如果引入的时候落了扩展名的话会这样去寻找:

(1)按照确切文件名进行加载

(2)补全.js扩展名进行加载

(3)补全.json扩展名进行加载

(4)补全.node扩展名进行加载

(5)加载失败,报错

4.第三方模块的加载机制

如果传递给require()的不是内置也不是./或者../开头的话,他就会去node.modules里找了,如果没有找到就移动到再上一层的父目录中去寻找,直到文件的根目录

都找不到就报错

5.目录作为模块

目录传给require()的时候,有三种加载方式

(1)找目录下的package.json里的main去找入口文件,作为require()加载的入口

(2)如果没有package.json或者没定义main或者main里的文件无法解析,则node.js就会加载目录下的index.js

(3)以上都失败的话就报错

相关推荐
雨落在了我的手上1 小时前
初识java(四):程序逻辑控制
java·开发语言·前端
UXbot1 小时前
Vibecoding 工具如何一次性生成 Web + iOS + Android 三端 APP?功能架构深度解读
android·前端·ui·ios·交互·软件构建·ai编程
小周技术驿站1 小时前
Linux 基础命令详解
linux·前端·chrome·ubuntu·centos
ZC跨境爬虫1 小时前
跟着 MDN 学 HTML day_42:(DOMTokenList 接口详解)
前端·javascript·ui·html·ecmascript·音视频
前端 贾公子1 小时前
响应式系统基础:基于依赖追踪的响应式系统的本质(下)
前端·javascript·vue.js
幽络源小助理1 小时前
团队个人科技主页HTML源码 黑客帝国风格个人简历网页模板
前端·科技·html
打工人小夏1 小时前
使用finalshell在新服务器上部署前端页面
linux·服务器·前端·vue.js
恋猫de小郭1 小时前
2026 Android I/O ,全新 AI 手机、 Android PC 和车载驾驶
android·前端·flutter
yqcoder1 小时前
JS 中的“空”之双雄:null vs undefined
开发语言·前端·javascript