npm CLI:JavaScript 世界的包管理器

npm CLI:JavaScript 世界的包管理器 文章目录npm CLIJavaScript 世界的包管理器npm CLIJavaScript 世界的包管理器npm CLI 是 Node.js 官方的包管理工具目前在 GitHub 上有 9,800 的 Star。做前端或者 Node.js 开发的人基本每天都在用它但很多人可能没怎么关注过这个项目本身。npm 全称是 “npm is not an acronym”一个递归缩写。它的前身是一个叫 pm 的 bash 脚本用来在不同平台上安装东西。后来 Isaac Schlueter 在 2010 年把它重写成了 Node.js 的包管理器再后来随着 Node.js 的流行npm 成了 JavaScript 生态里不可缺少的基础设施。npm 做的事情说起来很简单帮你安装、管理 JavaScript 项目的依赖包。但实际用起来它能做的事情远不止这些。基本功能安装依赖是最常用的操作。运行 npm install它会读取项目根目录的 package.json 文件把里面声明的所有依赖下载到 node_modules 目录下。如果项目里有 package-lock.jsonnpm 会严格按照里面记录的版本来安装保证团队里每个人装出来的依赖一模一样。发布自己的包也很方便。注册一个 npm 账号运行 npm publish你的代码就上了 npm 仓库全世界的开发者都能通过 npm install 你的包名来使用。npm 还提供了脚本运行能力。在 package.json 的 scripts 字段里定义命令然后用 npm run 来执行。比如 npm run build、npm run test这些在前端项目里已经是标准做法了。版本管理npm 使用语义化版本号格式是 major.minor.patch。比如 1.2.31 是主版本号2 是次版本号3 是补丁版本号。在 package.json 里写依赖的时候可以用 ^、~ 这些符号来控制版本范围。^1.2.3 表示可以升级到 1.x.x 的最新版本~1.2.3 表示只能升级到 1.2.x 的最新版本。这个机制让依赖管理变得灵活。你不需要每次都指定精确版本npm 会在你设定的范围内帮你找到合适的版本。安全和审计npm 内置了安全审计功能。运行 npm audit它会检查项目里有没有已知漏洞的依赖包并给出修复建议。npm audit fix 可以自动把有漏洞的包升级到安全版本。对于企业用户npm 还提供了私有仓库的支持。你可以用 npm config set registry 来切换到公司内部的私有 registry或者使用 Verdaccio 这样的工具搭建本地仓库。npxnpx 是 npm 5.2.0 之后自带的工具用来直接运行 npm 包里的可执行文件而不需要全局安装。比如 npx create-react-app my-app它会临时下载 create-react-app 并执行用完就清理掉。这个功能解决了一个老问题全局安装的工具版本不好管理不同项目可能需要不同版本。配置和定制npm 的配置项很多。可以通过 npm config set 来修改也可以在项目根目录放一个 .npmrc 文件来做项目级别的配置。常用的配置包括设置代理、切换 registry、配置 scope 对应的 registry 等。.npmrc 文件支持项目级、用户级、全局级三个层次优先级从高到低。团队可以在项目里放一个 .npmrc统一配置避免每个人手动设置。工作空间npm 7 引入了 workspaces 功能支持在一个仓库里管理多个包。这在开发大型项目或者组件库的时候很有用。你可以在根目录的 package.json 里声明 workspaces 字段npm install 会自动把各个子包之间的依赖链接起来不需要手动 npm link。这个功能和 yarn workspaces 类似是 npm 追上包管理器竞争的一个重要更新。和 Node.js 的关系npm 随 Node.js 一起安装。你装了 Node.js就有了 npm。不过 npm 的更新频率比 Node.js 高得多可以用 npm install -g npmlatest 来单独升级 npm。需要注意的是不同版本的 Node.js 自带的 npm 版本不同。如果你在用比较老的 Node.jsnpm 的功能可能会少一些。Node.js 的官方下载页面列出了当前受支持的版本建议使用这些版本来获得最好的体验。npm CLI 这个项目本身是开源的代码在 GitHub 上任何人都可以参与贡献。项目有完善的 issue 跟踪、RFC 流程和社区讨论渠道。如果你遇到了 npm 的 bug可以在 GitHub 上提交 issue如果有功能建议可以通过 RFC 仓库来提出。对于大多数 JavaScript 开发者来说npm 就像空气一样用的时候不会特别注意它但没有它寸步难行。对于大多数 JavaScript 开发者来说npm 就像空气一样用的时候不会特别注意它但没有它寸步难行。