微软交流社区

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 74|回复: 0

Nodejs 3.NPM

[复制链接]

2

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-9-21 16:36:30 | 显示全部楼层 |阅读模式

  • 目录
  • 3.1 node.js软件包
  • 3.2 什么是NPM
  • 3.3 pacge.json
  • 3.4 下载node.js软件包
  • 3.5 使用node.js软件包
  • 3.6 软件包依赖问题
  • 3.7 语义版本控制
  • 3.8 查看软件包实际版本
  • 3.9 查看软件包元数据
  • 3.10 下载特定版本的软件包
  • 3.11 删除软件包
  • 3.12 更新软件包
  • 3.13 项目依赖V开发依赖
  • 3.14 本地安装与全局安装
  • 3.15  发布软件包
  • 3.16 更新版本号
  • 3.17 撤销已发布软件包
  • 3.18 更改npm镜像地址
  • 3.19 npx命令
  • 3.20 配置入口文件的作用
3.1   Nodejs 软件包


  • 这里第三方模块也叫包
  • 每一个机遇Node.js平台开发的应用程序都是Node.js软件包
  • 所有Node.js软件包都被托管在 http://npmjs.com/ 中
  • 前端工程化中的大部分工具,都以包的形式,存在与 http://npmjs.com 上
3.2  NPM: Node package Manager,Node.js 环境中的软件包管理器


  • npm(Node Package Manager)是包管理工具。npm 会跟随 Node.js 一起安装
  • 验证 npm 是否已经安装


本身没有用户界面,需要在命令行工具中通过命令方式使用,对应的命令就是 npm

  • npm 可以帮我们下载(安装)包和包的依赖
  • 包:就是一坨代码,就是 Node.js 的第三方模块
  • 包的依赖:是指包的辅助代码(例如:下载 Bootstrap 时,必须先下载 jQuery,因为 Bootstrap 是基于 jQuery 开发的,没有 jQuery,Bootstrap 就运行不起来。此时,我们说:Bootstrap 依赖 jQuery )
3.3 package.json

创建package.json 文件 :  npm init

快速创建package.json 文件 npm init  -y   

3.4下载Node.js软件包
在应用程序的根目录执行命令: npm install <pkg>  或者npm i <pkg>

栗如     ------ npm install lodash-----
软件包下载完成后会发生三件事:
1.软件包会被存储在node_modules文件夹中,如果应用中不存在此文件夹,npm会自动创建
2.软件包会被记录在packages.json文件中,包含软件包的名字以及版本号
3.npm文件会在应用中创建packge-lock.json文件,用于记录软件包以及软件包的依赖包的下载地址及版本。
3.5 使用Node.js 软件包

在引入第三方软件包时,在require方法中不需要加入路径信息,只需要使用软件包名字即可,require方法会自动去node_modules文件夹中去进行查找




3.6 软件包依赖问题说明

1.应用中要依赖mongoose软件包,于是下载了它,但是在node_modules文件夹中除了包含mongoose以外还多出了很多其他软件包,为什么会多出这么多软件包?

实际上它们又是mongoose依赖的软件包
2.为什么mongoose依赖的软件包不存放在mongoose文件夹中呢

早期npm版本中,某个软件依赖的其他软件包都会被放置在该软件包内部的node_modules中但是这样做存在两个问题,1是很多软件包都会有相同的依赖,导致开发者在一个项目中会下载很多重复的软件包,比如A依赖X B依赖X C依赖X 在这种情况下X会被重复下载三次,2是文件夹嵌套的层次太深,导致文件夹在windows系统中不能被直接删除,比如A依赖B B依赖C C依赖D,就会发生文件夹一次嵌套的情况
3.所有的软件包都放置在node-modules文件夹中会不会倒置软件包的版本冲突?

在目前npm版本中,所有的软件包都会被直接放置在应用根目录的node_modules文件夹中,这样虽然解决了文件夹嵌套层次过审和重复下载软件包的问题,但如果只这样肯定会导致版本冲突,如何解决:
比如A依赖X的1版本,B依赖X2版本,如果先下载的是A,那么A依赖的X会放置在根目录的node-modules文件夹中,当下载B时,由于在根目录已经存在X的版本不一致,那么B的X会被放置在B软件包中的node_modules文件夹中,通过此方法解决版本冲突问题
4.node_modules文件夹中的软件包需要提交到git仓库中吗?

在node_modules文件夹中的很多软件包,随着应用程序的增长,软件包也会越来越多,甚至会达到几百兆。
不需要提交到git仓库,但为了解决其他人拿到应用程序是依赖软件包没有的情况,采用解决方法:
实际上应用程序徐来的软件包在package.son文件中都会有记录,其他人可以通过 npm install 命令重新下载它们,为了保持版本一致,npm会根据package-lock.json文件中的记录地址进行下载。
将应用程序提交到版本库之前,将node_modules文件夹添加到 git忽略列表 .gitignorew文件中。
3.7 语义版本控制

1.版本号规范

Major Verison 主要版本:添加新功能(破坏现有 API) ->6.0.0
Minor Version 次要版本:添加新功能(不会破坏现有API 在现有API基础上进行添加)->5.13.0
Patch Version 补丁版本: 用于修复bug ->5.21.6
2.版本号更新规范
^5.12.5 主要版本不变,更新次要版本和补丁版本
~5.12.5 主要版本和次要版本不变,更新补丁版本
5.12.5 使用确切版本,即主要版本,次要版本,补丁版本固定
3.8 查看软件包实际版本

当过了一段时间后,其他人从版本库中下载了你的应用程序,并通过npm install命令恢复了应用程序的依赖软件包,但此时应用程序依赖软件包可能会发生变化,而应用程序的packge.json文件中记录的只是大致版本,如何查看依赖软件包的具体版本?
方式1:在node_modules文件夹中找到对应的依赖包,找到它的package.json文件,可以在这个文件中的vaersion字段中找到具体版本
方式2:通过npm list 命令查看所有依赖软件包的具体版本, --depth选项指定查看依赖包的层级
3.9 查看软件包元数据



3.10 下载特定版本的软件包





3.11删除软件包




3.12  更新软件包

通过 npm outdated 命令可以查看哪些软件包已经过期,对应的新版本是什么。
通过 npm update 更新已经过期的软件包,更新操作遵循予语义版本控制规则

3.13项目依赖 VS 开发依赖

项目依赖:无论在开发环境还是线上环境只要程序在运行的过程中需要使用的软件包就是项目依赖。比如lodash,mongoose。
开发依赖:在应用开发阶段使用,在生产环境中不需要使用的软件包。比如TyeScript中的类型声明文件。
package.json文件中,项目依赖和开发依赖要分别记录,项目依赖被记录在dependencies 对象中,开发依赖被记录在devDependencies中,使开发者在不同的环境中下载不同的依赖软件包。
在下载开发依赖时,要在命令的后面加上 --save-dev 现象或者 -D 选项。  npm i eslint -D
在开发环境中下载所有依赖软件包: npm install
在生产环境中只下载项目依赖软件包: npm install --prod

3.14 本地安装与全局安装 全局删除

1.本地安装与全局安装
本地安装:将软件包下载到应用根目录下的 node_modules文件夹中,为软件包只能在当前应用用使用
全局安装:将软件包下载到操作系统的指定目录中,可以在任何应用中使用
通过  -g 选项将软件包安装到全局: npm install <pkg> -g     :npm i nodemon - g  (一般都是开发依赖)
查看全局软件包安装位置: npm root -g
删除全局中的软件包:    npm um <pkg> -g



删除全局软件包nodemon

查看全局中安装了哪些软件包:  npm list -g --depth 0
查看全局中有哪些过期的软件包 : npm outdated -g

2.软件包 :nodemon
问题:在node环境中每次修改JavaScript文件后都需要重新执行文件才能看到效果
通过nodemon可以解决此烦恼,它是命令工具包,可以监控文件变化,自动重新执行文件。
npm install nodemon@2.0.7 -g
nodemon app.js

3.软件包:npm-check-updates 强制更新
作用:npm-cheack-updates 可以查看应用中有哪些软件包过期了,可以强制更新packages.json文件中软件包版本
1. npm-check-updates安装到全局:npm install npm-check-updates -g
4.查看过期软件包:npm-check-updates
3.更新package.json:  ncu - u
5. 安装软件包:npm i
6.检测:npm outdatednpm-check-updates

3.15 发布软件包

1.注册npm账号


注册→验证邮箱地址
2.创建软件包
创建文件夹 lagou-node-test   cd切换进入文件夹
mkdir lagou-node-test && cd"$_"3.创建文件 并创建package.json文件
npm init -y4.登录、发布、下载使用
npm login

使用 npm publish 发布

其他人通过 npm install  lagou-node-test 下载软件包 通过require方法引入
3.16 更新软件包版本号

在软件包的源代码发生更改后,是不能直接发布的,应该新更新软件包的版本号然后再进行发布
更新主要版本号:npm version major
更新次要版本号: npm version minor
更新补丁版本号 npm version patch
3.17 撤销已发布的软件包

1.只有再发布软件包的24小时内才允许撤销
2.软件包撤销后24小时以后才能重新发布
3.重新发布时需要修改包名称和版本号


npm unpublish <pkg> --force

3.18 更改 npm镜像地址

由于http://npmjs.com是国外的网站,大多数时候下载软件包的速度会比较慢
解决方式:
可以通过配置的方式更改npm工具的下载地址。
1.获取npm配置

npm config  list -I --json
-I 列表所有默认配置选项
--json以json格式显示配置选项
2.设置npm配置

获取npm下载地址:npm config get registry
获取npm用户配置文件: npm config get userconfig
3.更改npm镜像地址

1.npm congfig set registry https://registry.npm.taobao.org
2.npm config set registry https://registry.npmjs.org
3 cat.npmrc

3.19 npx命令
npx是npm软件包提供的命令,它是node.js平台下软件包执行器,主要用途有两个,第一个是临时安装软件包执行后删除它,第二个是执行本地安装的提供命令的软件包。
1.临时安装软件包执行后删除软件包
有些提供命令的软件包使用饿频率并不高,比如create-react-app 脚手架工具,我能不能临时下载使用,然后再删掉它。
npx create-react-app react-test2.执行本地安装包的软件包
现在有两个项目都依赖了某个命令工具软件包,但是项目A依赖的是它的1版本,项目B依赖的是它的2版本,我在全局到底应该安装什么版本呢
该软件包可以在本地进行安装,在A项目中安装它的1版本,在B项目中安装它的2版本,在应用中可以通过npx调用node_modules文件夹中安装的命令工具
将所有软件包安装到应用本地是现在最推荐的做法,一是可以防止软件包的版本冲突问题,而是其他开发者在恢复应用依赖时可以恢复全部依赖,因为软件包安装到本地后会被packge.json文件记录,其他开发者在运行项目时不会因为缺少依赖而报错。

3.20 配置入口文件的作用

应用程序入口文件就是应用程序执行的起点,就是启动应用程序时执行的文件。
场景一:其他开发者拿到你的软件包以后,通过该文件可以知道应用的入口文件是谁,通过入口文件启动应用。
场景二:通过 node 应用文件夹 命令启动应用 node 命令会执行 package.json文件中 main选项指定的入口文件如果没有指定入口文件则执行index.js


3.21 模块查找规则

查找路径2种情况
1.在指定了查找路径的情况下




  • 查找 server.js
  • 查找server.json
  • 查找server  文件夹,查看入口文件(package.json -> main)
  • 查找 server 文件夹中的index.js 文件
2.在没有指令查找路径的情况下




如果是系统模块 直接返回如果不是
则在node_modules中查找js文件 →json文件→文件夹中入口文件(package.json -> main)→查找sever文件夹中的index .js文件→上一层node_modules文件夹继续查找直到查找到根目录

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|微软交流社区

GMT+8, 2025-1-8 12:02 , Processed in 0.075819 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表