NPM 基础知识学习
- 1. NPM 简介
- 2. NPM 初始化与配置
- package.json字段详解
- name
- version
- description
- main
- scripts
- author
- contributors
- license
- dependencies
- devDependencies
- peerDependencies
- files / include / exclude
- repository
- bugs
- homepage
- 3. NPM 常用命令
- 4. 模块管理
- 4.1 依赖类型
- dependencies
- devDependencies
- peerDependencies
- optionalDependencies
- 4.2 模块安装路径
- 本地模块安装路径
- 全局模块安装路径
- --prefix 指定安装路径
- 5. NPM Scripts
- 6. NPM 包发布
- 7. NPM 配置
- 8. NPM 高阶使用
- 9. NPM 包更新与版本管理
- 10. NPM 故障排查
- 11. NPM 与前端构建工具
- 12. NPM 包管理策略
- 13. NPM 脚本进阶
- 14. NPM 安全性
- 15. NPM 包依赖关系
- 16. NPM 访问控制
- 17. NPM 包的下载和使用
- 18. NPM 配置文件 `.npmrc`
- `.npmrc`文件的常用配置项
- `.npmrc`文件的使用场景
- 注意事项
- 19. NPM 缓存管理
- 19.1 缓存清理
- 19.2 缓存机制
1. NPM 简介
NPM不只是Node.js的依赖管理工具,它还是一个巨大的JavaScript库集合。通过它,你可以共享代码、利用他人创造的代码,并快速构建应用。
- 理解NPM的核心价值:NPM不只是用来管理Node.js的依赖,它还提供了一个巨大的生态系统,让你能够利用社区的力量。
- NPM与包:学习包的概念,包括包的结构、版本控制、以及如何利用NPM寻找和使用这些包。
2. NPM 初始化与配置
当你开始一个新项目时,npm init
命令会帮助你创建一个package.json
文件,这就像是你项目的身份证。
# 初始化package.json
npm init -y # 使用 -y 自动采用默认配置
package.json字段详解
package.json
是Node.js项目的心脏,它包含了项目的元数据和构建、测试、发布等过程中所需的脚本定义。让我们深入了解一下package.json
中常用字段的含义:
name
- 作用:指定包的名称。当你将包发布到NPM时,
name
字段的值就是包的安装名。 - 要求:必须是唯一的,且符合某些命名规范(不能包含大写字母、空格、特殊字符等)。
- 示例:
"name": "my-awesome-package"
version
- 作用:指定包的版本号。遵循语义化版本控制(Semantic Versioning,简称SemVer)格式:主版本号.次版本号.补丁号(major.minor.patch)。
- 示例:
"version": "1.0.0"
description
- 作用:提供包的简短描述。
- 示例:
"description": "My awesome package for something"
main
- 作用:指定包的主入口文件。当别人安装你的包并用
require()
导入时,这就是默认被加载的文件。 - 示例:
"main": "index.js"
scripts
- 作用:定义了一系列的脚本命令,可以通过
npm run
来执行。非常适合定义测试、构建、发布等自动化任务。 - 示例:
"scripts": { "start": "node index.js", "test": "mocha tests/", "build": "webpack --config webpack.config.js" }
author
- 作用:记录包的作者信息,可以是个人或组织的名字、邮箱、网址。
- 示例:
"author": "John Doe <john.doe@example.com> (https://example.com)"
contributors
- 作用:列出对包做出贡献的人的信息。
- 示例:
"contributors": [ "Jane Doe <jane.doe@example.com>" ]
license
- 作用:指定包的许可证。这告诉用户他们可以在什么条件下使用和分发你的包。
- 示例:
"license": "MIT"
dependencies
- 作用:列出项目运行所需的依赖包。这些依赖会在
node_modules
目录下安装,并且会随项目一起发布。 - 示例:
"dependencies": { "express": "^4.17.1" }
devDependencies
- 作用:列出开发过程中所需的依赖包,如测试库或构建工具。这些依赖不会随项目一起发布。
- 示例:
"devDependencies": { "mocha": "^8.2.1" }
peerDependencies
- 作用:列出你的包需要与其协作的其他包的兼容版本。这主要用于当你的包被作为依赖项被安装时,确保依赖关系的正确性。
- 示例:
"peerDependencies": { "react": "^16.0.0" }
files / include / exclude
- 作用:
files
指定要包含在包中的文件,include
和exclude
可以添加额外的包含/排除规则。 - 示例:
"files": [ "dist", "src" ], "include": [ "CHANGELOG.md" ], "exclude": [ "tests" ]
repository
- 作用:指定存放包源代码的仓库信息,通常是Git仓库的URL。
- 示例:
"repository": { "type": "git", "url": "https://github.com/username/my-awesome-package.git" }
bugs
- 作用:指定用户报告包的bug时应该访问的URL或邮箱。
- 示例:
"bugs": { "url": "https://github.com/username/my-awesome-package/issues", "email": "support@example.com" }
homepage
- 作用:指定包的官方网页地址。
- 示例:
"homepage": "https://www.my-awesome-package.com"
这些字段共同构成了package.json
的核心,正确填写它们对于项目的可维护性、可发现性和可用性至关重要。
3. NPM 常用命令
NPM的命令行工具非常强大,以下是一些你会频繁使用的命令:
# 安装依赖
npm install <package>
# 安装并保存到package.json
npm install <package> --save
# 安装并保存开发依赖
npm install <package> --save-dev
# 全局安装,比如安装一个全局的CLI工具
npm install -g <package>
# 卸载包
npm uninstall <package>
# 更新包
npm update <package>
# 查找包
npm search <keyword>
4. 模块管理
理解不同依赖类型的区别至关重要:
# 安装运行时依赖
npm install express
# 安装开发时依赖,比如只在开发环境下使用的工具
npm install webpack --save-dev
好的,让我们更深入地了解npm中不同类型的依赖以及模块的安装路径。
4.1 依赖类型
dependencies
- 含义:这是运行项目所必需的依赖。如果你的代码在其他地方运行,这些依赖会被自动安装。
- 使用场景:任何在生产环境中运行你的项目时需要的包都应该列在这里。
- 示例:
"dependencies": { "express": "^4.17.1" }
devDependencies
- 含义:这些依赖只在开发过程中使用,比如在构建脚本、测试工具等。
- 使用场景:用于本地开发和测试,但不会在生产环境中运行。因此,它们不会随应用程序一起部署。
- 示例:
"devDependencies": { "jest": "^26.6.3" }
peerDependencies
- 含义:这个类型的依赖用于指定你的包与其他包的兼容性版本要求。它允许包之间声明它们需要彼此的特定版本。
- 使用场景:当你的包被作为另一个包的依赖项安装时,确保依赖关系的正确性。
- 示例:
"peerDependencies": { "react": "^16.0.0" }
optionalDependencies
- 含义:这些是可选的依赖。即使它们安装失败,也不会导致整个npm install命令失败。
- 使用场景:对于一些不常用或有替代品的依赖,或者可能在某些环境中不可用的情况。
- 示例:
"optionalDependencies": { "some-optional-package": "^1.0.0" }
4.2 模块安装路径
本地模块安装路径
- 含义:当你在项目目录下运行
npm install <package>
时,模块会被安装在项目目录下的node_modules
文件夹中。 - 路径示例:
your-project/ ├── node_modules/ │ ├── <package> │ └── ... ├── package.json └── ...
全局模块安装路径
- 含义:使用
npm install -g <package>
安装的模块会放在全局node_modules
目录下,这样它们可以在整个系统范围内使用。 - 路径示例:
/usr/local/lib/node_modules/ # 对于Unix系统 C:\Users\YourName\AppData\Roaming\npm\node_modules # 对于Windows系统
–prefix 指定安装路径
- 含义:通过
--prefix
选项,你可以指定安装模块的目录。 - 使用场景:当你需要在特定的目录安装依赖,而不是当前目录时。
- 示例:
npm install <package> --prefix ./some-directory
5. NPM Scripts
NPM Scripts让你可以运行定义在package.json
中的脚本命令,非常适合自动化你的开发流程。
"scripts": {
"start": "node index.js",
"test": "jest",
"build": "webpack"
}
6. NPM 包发布
当你准备好将你的代码分享给全世界时,可以通过NPM发布你的包。
# 登录NPM
npm login
# 发布包
npm publish
7. NPM 配置
NPM配置可以帮助你定制NPM的行为,比如设置默认的包安装位置或者使用淘宝的NPM镜像源来加速下载。
# 设置淘宝镜像
npm config set registry https://registry.npm.taobao.org
# 查看当前配置
npm config list
8. NPM 高阶使用
NPM的bin
字段允许你的包提供命令行工具。
"bin": {
"my-tool": "./cli.js"
}
当你全局安装这个包时,就可以直接在命令行中使用my-tool
命令。
9. NPM 包更新与版本管理
版本管理是软件发布周期中的一个重要部分。NPM支持语义化版本控制,帮助你管理包的版本。
# 改变版本号
npm version major # 主版本号升级
npm version minor # 次版本号升级
npm version patch # 补丁版本号升级
- 版本号规则: 深入理解语义化版本号的规则,以及如何使用npm version命令。
- 版本锁定: 学习如何使用package-lock.json锁定依赖版本,以及它与shrinkwrap的区别。
10. NPM 故障排查
遇到问题时,NPM提供了一些工具来帮助你。
# 检查NPM安装的包是否有更新
npm outdated
# 查看npm的调试日志
npm debug
11. NPM 与前端构建工具
NPM可以与前端构建工具如Webpack、Vue CLI等无缝配合,提高开发效率。
# 使用NPM Scripts运行Webpack
"scripts": {
"build": "webpack --config build/webpack.prod.js"
}
12. NPM 包管理策略
在企业级应用中,私有NPM仓库可以帮助你更好地管理团队的包。
# 指向私有NPM仓库
npm config set registry http://your-private-registry.com
13. NPM 脚本进阶
NPM Scripts支持复杂的Shell脚本,让你可以执行多步操作。
"scripts": {
"deploy": "npm run build && git push && npm publish"
}
14. NPM 安全性
NPM提供了一些工具和实践,帮助你保持依赖的安全性。
# 安装时忽略可选依赖
npm install --no-optional
# 安装时不锁版本,允许更新所有包
npm install --no-save
15. NPM 包依赖关系
理解你的项目的依赖关系对于维护和升级包非常重要。
# 查看依赖树
npm list
# 查看某个包的依赖
npm ls <package>
16. NPM 访问控制
NPM允许你对包的访问进行控制,这对于私有包非常有用。
# 设置包为私有
npm access public
# 设置包为私有
npm access restricted
17. NPM 包的下载和使用
除了使用npm install
命令外,你还可以下载包并直接引入到你的项目中。
# 下载包但不安装依赖
npm pack
18. NPM 配置文件 .npmrc
NPM配置文件.npmrc
可以包含多个配置项,覆盖默认的NPM行为。
.npmrc
文件是一个配置文件,用于覆盖NPM的默认行为。它可以在不同的位置存在,每个位置的配置文件会影响不同范围的NPM行为:
- 全局
.npmrc
:位于用户的主目录下(~/.npmrc
),全局.npmrc
影响该用户的所有NPM操作。 - 项目级
.npmrc
:位于项目目录下,允许为特定项目设置特定的NPM配置。 - 用户级和全局级
.npmrc
:NPM还会查找用户目录下的.npmrc
(~/.npmrc
)和全局目录下的.npmrc
(/usr/local/etc/npmrc
或由npm config get globalconfig
命令指定的位置)。 - 内置
.npmrc
:NPM自己会带一个内置的.npmrc
文件,位于NPM安装目录中。
项目级的.npmrc
文件通常用于设置项目的特定配置,比如指定包的入口点(main
)、指定要发布的文件列表(files
)等。而用户级和全局级的.npmrc
文件则更常用于配置NPM的行为,如设置默认的包安装位置、代理设置、自定义的registry等。
.npmrc
文件的常用配置项
以下是一些.npmrc
文件中可能包含的配置项:
-
registry: 设置NPM的默认仓库地址。如果你想使用淘宝的NPM镜像以加速下载,可以设置为
https://registry.npm.taobao.org
。registry = https://registry.npm.taobao.org
-
prefix: 设置全局包的安装路径。
prefix = /usr/local
-
cache: 设置缓存目录的位置。
cache = /path/to/cache
-
save: 控制
npm install <package>
是否自动将包添加到dependencies
。save = true
-
save-exact: 安装依赖时是否保存精确版本号。
save-exact = true
-
save-prefix: 设置
npm install
时保存版本号的前缀。save-prefix = "^"
-
bin-links: 控制是否在
node_modules
中为每个包的主文件创建bin链接。bin-links = true
-
umask: 用于设置文件的默认权限掩码。
umask = 0022
-
loglevel: 设置日志级别,如
silent
,error
,warn
,http
,info
,debug
或silly
。loglevel = info
-
progress: 控制是否显示安装包时的进度条。
progress = true
-
fetch-retries: 设置网络请求失败后的重试次数。
fetch-retries = 2
-
user-agent: 设置HTTP请求中的User-Agent头部。
user-agent = npm/6.9.0 node/v12.0.0 darwin x64
.npmrc
文件的使用场景
-
代理设置:在内网或需要通过代理访问NPM仓库的环境中,可以设置代理。
https-proxy = http://proxy.example.com:8080 http-proxy = http://proxy.example.com:8080
-
私有仓库:如果你在一个团队中,可能需要配置访问私有NPM仓库的认证信息。
//private-registry.com/:_authToken="abcdef"
-
自定义脚本运行:可以在
.npmrc
中配置运行自定义的NPM脚本。scripts = { "start": "node server.js" }
注意事项
.npmrc
文件的配置项可能会覆盖默认的NPM行为,因此在团队协作中要确保所有成员的配置一致。.npmrc
文件中的配置项可能会被命令行参数或环境变量覆盖。- 在使用
npm login
,npm logout
,npm whoami
等命令时,NPM会读取和写入用户的认证信息到用户目录下的.npmrc
文件。
19. NPM 缓存管理
19.1 缓存清理
-
为何要清理缓存:有时候,由于缓存中的数据损坏或过时,可能会导致安装失败或行为异常。清理缓存可以解决这些问题。
-
如何清理缓存:使用
npm cache clean
命令可以清除NPM缓存。npm cache clean --force
这个命令会删除NPM缓存目录中的所有内容。注意使用
--force
标志,因为默认情况下,一些缓存数据会被保留。 -
清理后的操作:清理缓存后,下一次安装包时,NPM会重新下载所需的内容,这可能会花费更多时间,但能确保你得到最新和完整的数据。
19.2 缓存机制
-
缓存的作用:NPM缓存是为了减少从远程仓库下载依赖的次数。当你安装一个包时,NPM会先检查缓存中是否存在该包,如果存在,就直接使用缓存中的版本,而不是从远程仓库下载。
-
缓存的位置:缓存数据默认存储在
~/.npm
目录下。可以通过npm config get cache
命令查看缓存的具体位置。 -
缓存的数据:缓存中不仅包含包本身,还包括包的元数据、tarball文件、以及某些类型的完整性校验数据。
-
利用缓存加速安装:由于缓存的存在,安装过的包再次安装时会非常快,因为可以直接从缓存中读取,无需从网络下载。
-
缓存大小管理:长时间不清理的缓存可能会变得很大,占用大量磁盘空间。定期清理不必要的缓存数据可以释放空间。
-
缓存的更新:NPM在某些情况下会自动更新缓存,比如当你使用
npm update
命令更新包时,或者当你安装一个新版本的包时。 -
缓存与离线模式:当你在离线模式下工作时,NPM会尽量使用缓存中的数据,而不是尝试从网络下载。
-
缓存的清理时机:
- 遇到安装错误,且怀疑是缓存问题时。
- 需要确保正在使用最新版本的包时。
- 缓存数据过大,需要清理磁盘空间时。
-
缓存清理的注意事项:
- 清理缓存会暂时减慢安装速度,因为NPM需要重新下载数据。
- 清理缓存前,确保你的网络连接正常,以便能够成功下载所需的数据。