NPM 基础知识学习

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指定要包含在包中的文件,includeexclude可以添加额外的包含/排除规则。
  • 示例
    "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行为:

  1. 全局.npmrc:位于用户的主目录下(~/.npmrc),全局.npmrc影响该用户的所有NPM操作。
  2. 项目级.npmrc:位于项目目录下,允许为特定项目设置特定的NPM配置。
  3. 用户级和全局级.npmrc:NPM还会查找用户目录下的.npmrc~/.npmrc)和全局目录下的.npmrc/usr/local/etc/npmrc或由npm config get globalconfig命令指定的位置)。
  4. 内置.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, debugsilly

    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 缓存清理

  1. 为何要清理缓存:有时候,由于缓存中的数据损坏或过时,可能会导致安装失败或行为异常。清理缓存可以解决这些问题。

  2. 如何清理缓存:使用npm cache clean命令可以清除NPM缓存。

    npm cache clean --force
    

    这个命令会删除NPM缓存目录中的所有内容。注意使用--force标志,因为默认情况下,一些缓存数据会被保留。

  3. 清理后的操作:清理缓存后,下一次安装包时,NPM会重新下载所需的内容,这可能会花费更多时间,但能确保你得到最新和完整的数据。

19.2 缓存机制

  1. 缓存的作用:NPM缓存是为了减少从远程仓库下载依赖的次数。当你安装一个包时,NPM会先检查缓存中是否存在该包,如果存在,就直接使用缓存中的版本,而不是从远程仓库下载。

  2. 缓存的位置:缓存数据默认存储在~/.npm目录下。可以通过npm config get cache命令查看缓存的具体位置。

  3. 缓存的数据:缓存中不仅包含包本身,还包括包的元数据、tarball文件、以及某些类型的完整性校验数据。

  4. 利用缓存加速安装:由于缓存的存在,安装过的包再次安装时会非常快,因为可以直接从缓存中读取,无需从网络下载。

  5. 缓存大小管理:长时间不清理的缓存可能会变得很大,占用大量磁盘空间。定期清理不必要的缓存数据可以释放空间。

  6. 缓存的更新:NPM在某些情况下会自动更新缓存,比如当你使用npm update命令更新包时,或者当你安装一个新版本的包时。

  7. 缓存与离线模式:当你在离线模式下工作时,NPM会尽量使用缓存中的数据,而不是尝试从网络下载。

  8. 缓存的清理时机

    • 遇到安装错误,且怀疑是缓存问题时。
    • 需要确保正在使用最新版本的包时。
    • 缓存数据过大,需要清理磁盘空间时。
  9. 缓存清理的注意事项

    • 清理缓存会暂时减慢安装速度,因为NPM需要重新下载数据。
    • 清理缓存前,确保你的网络连接正常,以便能够成功下载所需的数据。
  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿_Mr. Guo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值