npm CLI:JavaScript 世界的包管理器
文章目录
- npm CLI:JavaScript 世界的包管理器
npm CLI:JavaScript 世界的包管理器
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.json,npm 会严格按照里面记录的版本来安装,保证团队里每个人装出来的依赖一模一样。
发布自己的包也很方便。注册一个 npm 账号,运行 npm publish,你的代码就上了 npm 仓库,全世界的开发者都能通过 npm install 你的包名来使用。
npm 还提供了脚本运行能力。在 package.json 的 scripts 字段里定义命令,然后用 npm run 来执行。比如 npm run build、npm run test,这些在前端项目里已经是标准做法了。
版本管理
npm 使用语义化版本号,格式是 major.minor.patch。比如 1.2.3,1 是主版本号,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 这样的工具搭建本地仓库。
npx
npx 是 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 npm@latest 来单独升级 npm。
需要注意的是,不同版本的 Node.js 自带的 npm 版本不同。如果你在用比较老的 Node.js,npm 的功能可能会少一些。Node.js 的官方下载页面列出了当前受支持的版本,建议使用这些版本来获得最好的体验。
npm CLI 这个项目本身是开源的,代码在 GitHub 上,任何人都可以参与贡献。项目有完善的 issue 跟踪、RFC 流程和社区讨论渠道。如果你遇到了 npm 的 bug,可以在 GitHub 上提交 issue;如果有功能建议,可以通过 RFC 仓库来提出。
对于大多数 JavaScript 开发者来说,npm 就像空气一样,用的时候不会特别注意它,但没有它寸步难行。
对于大多数 JavaScript 开发者来说,npm 就像空气一样,用的时候不会特别注意它,但没有它寸步难行。