【Node.js】深度解析node的包和强大的包管理工具

简介: 【Node.js】深度解析node的包和强大的包管理工具

什么是包


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

就像电脑和计算机指的是相同的东西,第三方模块和包指的是同一个概念,只不过叫法不同。


包从哪里来的?


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

在这里记笔记:免费的!!!


为什么我们要用包?


由于 Node.js 的内置模块仅提供了一些底层的 API,导致在基于内置模块进行项目开发的时,效率很低。

包是基于内置模块封装出来的,提供了更高级、更方便的 API,极大的提高了开发效率。 包和内置模块之间的关系,类似于 jQuery 和 浏览器内置 API 之间的关系。(jq是将浏览器内置的api进行了封装)


包从哪里下载?


国外有一家 IT 公司,叫做npm, Inc. 这家公司旗下有一个超级牛的网站: https://www.npmjs.com ,它是全球最大的包共享平台,你可以从这个网站上搜索到任何你需要的包!


怎么下载包


npm, Inc. 公司提供了一个包管理工具,我们可以使用这个包管理工具,从 https://registry.npmjs.org 服务器把需要的包下载到本地使用。

这个包管理工具的名字叫做 Node Package Manager(简称 npm 包管理工具),这个包管理工具随着 Node.js 的安装,包一起被安装到了用户的电脑上。


我们可以在终端中输入npm -v来查看npm包管理工具的版本号


1.png


注意 : 我们的npm版本可能不一样,大家不要恐慌


npm初体验


格式化时间moment


使用 npm 包管理工具,在项目中安装格式化时间的包 moment


代码示例:



const moment = require('moment')
const dt = moment().format('YYYY-MM-DD')
console.log(dt);  // 2022-09-18


注意:这里的YYYY-MM-DD是年月日的符号标识,在网站https://momentjs.com/docs中可以详细的了解.


安装包命令


如果你想安装自己需要的包,可以使用以下命令:

npm install xxx 或者 npm i xxx(这个是简写形式,更加的方便快捷)


安装包后出现的文件


初次装包完成后,在项目文件夹下多一个叫做 node_modules 的文件夹和 package-lock.json 的配置文件。


其中:


  1. node_modules 文件夹用来存放所有已安装到项目中的包。require() 导入第三方包时,就是从这个目录中查找并加载包。


  1. package-lock.json 配置文件用来记录 node_modules 目录下的每一个包的下载信息,例如包的名字、版本号、下载地址等。


注意:我们不要手动修改 node_modules 或 package-lock.json 文件中的任何代码,npm 包管理工具会自动维护它们。


安装指定版本的包


默认情况下,使用 npm install 命令安装包的时候,会自动安装最新版本的包。如果需要安装指定版本的包,可以在包名之后,通过 @ 符号指定具体的版本


代码示例:


2.png


解析包版本的含义(语义化版本规范)


在这里将会解决大家一直困惑的问题,这个版本号那一串数字到底是啥子意思,在这里黑马哥良心的教学让我直呼好家伙!真心详细!!!(好好看,好好学)


包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如 2.24.0

其中每一位数字所代表的的含义如下:


  1. 第1位数字:大版本(比如:我们所玩的王者荣耀每过几个月都会有大版本更新,那么的化第一位数字就会发生变化,大家下次观察一波)
  2. 第2位数字:功能版本(比如:王者荣耀的某个版本添加了新的功能,又叫小更新)
  3. 第3位数字:Bug修复版本(比如:修复了闪退的bug,修复了人物模型的失真bug…)


版本号提升的规则:只要前面的版本号增长了,则后面的版本号归零


包管理配置文件


npm 规定,在项目根目录中,必须提供一个叫做 package.json 的包管理配置文件。用来记录与项目有关的一些配置信息。例如:


  1. 项目的名称、版本号、描述等
  2. 项目中都用到了哪些包
  3. 哪些包只在开发期间会用到
  4. 那些包在开发和部署时都需要用到


1. 多人协作问题


在这里先给大家举一个例子:我们在进行多人项目开发时候,我们把自己写的代码交到码云上,我们总不能把node_modules安装的依赖也提交上去啊,所以我们不把node_modules提交上去,因为第三方模块的所占的体积过大,经常会出现我们的代码总共才1M,第三方包都占30M,所以我们进行剔除.


剔除方法:


在.gitignore文件中输入node_modules即可!


2. 如何记录项目中安装了哪些包


在项目根目录中,创建一个叫做 package.json 的配置文件,即可用来记录项目中安装了哪些包。从而方便剔除node_modules 目录之后,在团队成员之间共享项目的源代码。


注意:今后在项目开发中,一定要把 node_modules 文件夹,添加到 .gitignore 忽略文件中。


3. 快速创建 package.json


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


注意:


上述命令只能在英文的目录下成功运行!所以,项目文件夹的名称一定要使用英文命名,不要使用中文,不能出现空格。

运行 npm install 命令安装包的时候,npm 包管理工具会自动把包的名称和版本号,记录到 package.json 中。



{
  "name": "3",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "art-template": "^4.13.2",
    "jquery": "^3.6.1",
    "moment": "^2.22.2"
  }
}


4. dependencies 节点


package.json 文件中,有一个 dependencies 节点,专门用来记录您使用 npm install 命令安装了哪些包。例如:我们上面的代码中的"art-template": "^4.13.2","jquery": "^3.6.1","moment": "^2.22.2",说明了我们安装了art-template、jquery、moment这三个包!


5. 一次性安装所有的包


当我们从gitee上拉下来一个项目代码,里面是没有node_modules,这就需要我们自己去安装依赖,需要先把所有的包下载到项目中,才能将项目运行起来。否则项目就不会跑起来!


那我们怎么做才能让项目跑起来呢?别着急,我们只需在终端中运行npm install(npm i)就行了!这里运行这个代码的目的是一次性安装我们需要的所有依赖!


6. 卸载包


可以运行 npm uninstall 命令,来卸载指定的包,比如,我们需要卸载moment包,我们可以执行代码:npm uninstall moment

注意:

npm uninstall 命令执行成功后,会把卸载的包,自动从 package.json 的 dependencies 中移除掉


7. devDependencies 节点


如果某些包只在项目开发阶段会用到,在项目上线之后不会用到,则建议把这些包记录到 devDependencies 节点中。

与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies 节点中


你可以使用如下的命令,将包记录到 devDependencies 节点中:



//安装指定的包,并且记录到 devDependencies 节点中
npm i 包名 -D
// 上部代码是简写形式,下部的代码是完整写法:
npm install 包名 --save-dev


到这里,你就想问一个问题,那我怎么知道我安装的这个包需不需要放在devDependencies呢?


一般情况下我们去npm网站中搜索你需要的包,它会提示你该包是否需要记录到devDependencies中!


解决下包速度慢的问题


1. 为什么包下载速度慢


不难发现,我们在安装包的时候它的速度也太慢了吧?为什么会发生这种情况呢?


因为:在使用 npm 下包的时候,默认从国外的 https://registry.npmjs.org/ 服务器进行下载,此时,网络数据的传输需要经过漫长的海底光缆,因此下包速度会很慢。

如果你想要了解海底光缆,这里直接直通车👉海底光缆


2. 淘宝npm镜像服务器


为了解决下载速度慢的问题,淘宝在国内搭建了一个服务器,专门把国外官方服务器上的包同步到国内的服务器,然后在国内提供下包的服务。从而极大的提高了下包的速度。


镜像(Mirroring)是一种文件存储形式,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。

3.png

0c8b226151594b0993add6485964bc73.png



3. 切换npm的下包镜像源


我们已经知道了淘宝镜像可以帮助我们快速的下载包,那么怎么才能切换到淘宝镜像源呢?

在终端中执行以下三步:


  1. 首先查看我们当前的镜像源:npm config get registry
  2. 将下包的镜像源切换为淘宝镜像源:npm config set registry=https://registry.npmmirror.com/
  3. 查看镜像源是否下载成功 : npm config get registry


4. nrm


我们如果采取常规的切换镜像源的方法,未免有点繁琐,为了更方便的切换下包的镜像源,我们可以安装 nrm 这个小工具,利用 nrm 提供的终端命令,可以快速查看和切换下包的镜像源。


  1. 将nrm安装为全局可用的工具 : npm i nrm -g


  1. 查看所有的镜像源 : nrm ls


4.png


  1. 将下载包的镜像源切换为 taobao 镜像 : nrm use taobao


5.png


显示这样的话,就说明我们切换成功啦!


包的分类


使用 npm 包管理工具下载的包,共分为两大类,分别是:1. 项目包 2. 全局包


1.项目包


那些被安装到项目的 node_modules 目录中的包,都是项目包。


项目包又分为两类,分别是:


开发依赖包(被记录到 devDependencies 节点中的包,只在开发期间会用到)


核心依赖包(被记录到 dependencies 节点中的包,在开发期间和项目上线之后都会用到)


2.全局包


在执行 npm install 命令时,如果提供了 -g 参数,则会把包安装为全局包。


全局包会被安装到 C:\Users\用户目录\AppData\Roaming\npm\node_modules 目录下。


6.png


注意:


只有工具性质的包,才有全局安装的必要性。因为它们提供了好用的终端命令。

判断某个包是否需要全局安装后才能使用,可以参考官方提供的使用说明即可。


3.将md文件转为html


i5ting_toc 是一个可以把 md 文档转为 html 页面的小工具(这个真的是嘎嘎好用,比如,如果我们在网上找学习资源的时候,部分会把笔记记为md文档,我们使用浏览器打开md文档布局特别的难以接受~),使用步骤如下:



# 将 i5ting_toc 安装为全局包
npm i -g i5ting_toc
# 调用 i5ting_toc ,轻松实现 md 转 html 的功能
i5ting_toc -f 要转的md文件路径 -o


上述代码中-o的意思是,我们将在默认的浏览器中打开这个转化后的md文件


规范的包结构


在清楚了包的概念、以及如何下载和使用包之后,接下来,我们深入了解一下包的内部结构。


一个规范的包,它的组成结构,必须符合以下 3 点要求:


  1. 包必须以单独的目录而存在
  2. 包的顶级目录下要必须包含 package.json 这个包管理配置文件
  3. package.json 中必须包含 name,version,main 这三个属性,分别代表包的名字、版本号、包的入口


举例:


7.png


小结


😼本篇文章,详细的解析了node中包的概念和npm,npm在日常开发中根本离不开,在框架中,也要使用npm去安装架构,所以npm的学习必须是要透彻的,不要糊弄过去,下篇文章我们将进入express的学习,大家继续加油!努力卷,搞高薪!😼


相关文章
|
3月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
142 19
|
4月前
|
JSON 前端开发 Serverless
Mock.js 语法结构全解析
Mock.js 的语法规范介绍,从数据模板定义规范和数据占位符定义规范俩部分介绍, 让你更好的使用 Mock.js 来模拟数据并提高开发效率。
|
6月前
|
机器学习/深度学习 人工智能 JSON
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
Resume Matcher 是一款开源AI简历优化工具,通过解析简历和职位描述,提取关键词并计算文本相似性,帮助求职者优化简历内容,提升通过自动化筛选系统(ATS)的概率,增加面试机会。
598 18
Resume Matcher:增加面试机会!开源AI简历优化工具,一键解析简历和职位描述并优化
|
5月前
|
存储 人工智能 API
离线VS强制登录?Apipost与Apifox的API工具理念差异深度解析
在代码开发中,工具是助手还是枷锁?本文通过对比Apipost和Apifox在断网环境下的表现,探讨API工具的选择对开发自由度的影响。Apifox强制登录限制了离线使用,而Apipost支持游客模式与本地存储,尊重开发者数据主权。文章从登录策略、离线能力、协作模式等方面深入分析,揭示工具背后的设计理念与行业趋势,帮助开发者明智选择,掌握数据控制权并提升工作效率。
|
6月前
|
数据采集 前端开发 JavaScript
金融数据分析:解析JavaScript渲染的隐藏表格
本文详解了如何使用Python与Selenium结合代理IP技术,从金融网站(如东方财富网)抓取由JavaScript渲染的隐藏表格数据。内容涵盖环境搭建、代理配置、模拟用户行为、数据解析与分析等关键步骤。通过设置Cookie和User-Agent,突破反爬机制;借助Selenium等待页面渲染,精准定位动态数据。同时,提供了常见错误解决方案及延伸练习,帮助读者掌握金融数据采集的核心技能,为投资决策提供支持。注意规避动态加载、代理验证及元素定位等潜在陷阱,确保数据抓取高效稳定。
164 17
|
6月前
|
数据可视化 测试技术 API
前后端分离开发:如何高效调试API?有工具 vs 无工具全解析
在前后端分离开发中,API调试至关重要。本文探讨有无调试工具时如何高效调试API,重点分析Postman、Swagger等工具优势及无工具代码调试方法。通过实际场景如用户登录接口,对比两者特性。同时介绍Apipost-Hepler(IDEA插件),将可视化与代码调试结合,提供全局请求头配置、历史记录保存等功能,优化团队协作与开发效率,助力API调试进入全新阶段。
|
7月前
|
数据采集 存储 调度
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
在Python网页抓取领域,BeautifulSoup和Scrapy是两款备受推崇的工具。BeautifulSoup易于上手、灵活性高,适合初学者和简单任务;Scrapy则是一个高效的爬虫框架,内置请求调度、数据存储等功能,适合大规模数据抓取和复杂逻辑处理。两者结合使用可以发挥各自优势,例如用Scrapy进行请求调度,用BeautifulSoup解析HTML。示例代码展示了如何在Scrapy中设置代理IP、User-Agent和Cookies,并使用BeautifulSoup解析响应内容。选择工具应根据项目需求,简单任务选BeautifulSoup,复杂任务选Scrapy。
142 1
BeautifulSoup VS Scrapy:如何选择适合的HTML解析工具?
|
6月前
|
JSON 监控 物联网
WebSocket 调试全攻略:核心解析、工具选择与对比!
WebSocket 是一种全双工、实时交互的网络通信协议,适用于即时通信、实时数据流、多人协作、IoT 等场景。调试 WebSocket 时,工具应具备握手管理、实时消息收发、自定义 Header、消息大小告警、分组管理、多连接支持和断线重现等功能。主流调试工具如 Postman、ApiPost 和 ApiFox 各有优劣:Postman 界面友好适合基础调试;ApiPost 支持高级功能如消息分组和自动重连;ApiFox 则强化了多连接支持。选择工具时需根据具体需求和团队熟悉度决定。
|
7月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
222 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
6月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS