NPM

在同一个项目中,当我们想把编写好的模块给别人复用的时候,只需要引入路径就可以了。不同项目,也只需要通过通信工具发送就好。但当我们决定开源时,由于应用模块的人都不认识,遍布世界各地,如何保证所有需要该模块的开发者都能够随时得到适用于各自系统的版本,并且在模块之间存在依赖关系的时候,也能够顺利找到所有的依赖项?这就需要使用模块管理工具 NPM 了。

NPM(Node Package Manager)官网地址为 https://www.npmjs.com。Node.js 社区的工具包非常丰富,前端开发者可以在 NPM 的官网上获取和上传模块、搜索社区资源。NPM 中的单个模块通常只用来解决一个问题,职责明确单一。

模块结构

完全符合 CommonJS 规范的模块应包含以下 5 个文件。

  • package.json,模块的描述性文件。
  • bin,存放可执行的二进制文件。
  • lib,存放 JavaScript 代码。
  • doc,存放文档。
  • test,存放单元测试用例。

常用命令

简写

  • npm install 可简写 npm i

创建 package.json

  • npm init
  • npm init -y

安装/卸载

  • npm install <package> -g,全局
  • npm install <package>, 本地
  • npm install <package>@latest,安装到最新版本
  • npm install <package> <package>,一次性
  • npm install <package> --save-dev/npm install <package> -D,开发时依赖包
  • npm install <package> --save/npm install <package> -S ,运行时依赖包
  • npm uninstall <package>,卸载

更新

  • npm update <package>,简单更新
  • npm update <package>@version,更新到指定版本
  • 高版本到低版本,可先卸载在安装

查看/检查

  • npm -v,自身版本号
  • npm help,所有命令
  • npm root,项目所在目录
  • npm root -g,全局所在目录
  • npm view <package>,包所有信息
  • npm view <package> dependencies,包的属性
  • npm view <package> repository.url,包源文件地址
  • npm view <package> engines,包依赖 node 最低版本号
  • npm view <package> version,包当前版本号
  • npm view <package> versions,包历史版本号
  • npm view <package> maintainers,包作者信息
  • npm list -g,全局包列表
  • npm list,当前项目包列表
  • npm list --depth=0,限制展示目录层级
  • npm home antd,查看 ant.design 主页
  • npm docs antd,查看 ant.design 文档
  • npm repo antd,查看 ant.design github 仓库
  • npm bugs <package>,包 bugs
  • npm bugs,当前项目 bugs
  • npm outdated,检查所有包是否过时

清除

  • npm cache clean,清除缓存(慎用该命令)
  • npm prune,清除没有使用到的包

发布

  • npm search <package>,发布前先查看包名是否存在。
  • 注册账号 https://www.npmjs.com/signup
  • 进入项目目录运行命令 npm adduser,输入刚刚注册好的用户名、密码和邮箱。
  • 发布命令 npm public

依赖包版本号

NPM 的版本兼容机制非常宽松,比如 ^2.5.0,定义的是只要在大版本号“2”上相同,就允许下载最新版本的依赖包。也就是说,实际上得到的版本也许是 2.5.2,符号 ^ 表示的是大于某个版本号。虽然 NPM 的模块开发原则是:大版本相同的接口必须保持兼容,然而这个原则并非强制执行,因此用户下载的最新版本也许会导致依赖包的行为完全不兼容,从而导致模块不可用。

package-lock.json 锁定了依赖版本号,只要保存了源文件,就能够确保得到完全一致的依赖包,从而提高了模块的稳定性和可用性。package-lock.json就是 NPM 为了防止模块包的不一致而进行的功能加强,这也是在 Yarn 冲击下的必然结果。这个文件在运行命令 npm install 的时候为了锁定依赖版本和来源而由 NPM 自动创建,实际上记录了当前状态下安装的所有模块信息,确保了在下载时间、开发者、机器和下载源都不相同的情况下也能够得到完全一样的模块包。

NVM

在日常开发过程中经常会因为不同的项目所依赖的Node.js版本不同,而需要在不同的Node.js版本之间进行切换。NVM(Node Version Manager,Node版本管理器)是在 Mac 环境下管理 Node.js 版本的工具。在 Windows 环境下推荐使用 nvmw 或 nvm-windows。在 github 上有对 nvm 详细的描述。github 地址:https://github.com/creationix/nvm

卸载已经全局安装的 Node.js 和 NPM(推荐,非必须)

  • cd ~rm -rf .nvm
  • 删除 /usr/local/lib/usr/local/include 两个文件夹中所有和 Node.js 及 node_modules 相关的文件;
  • 检查个人主文件夹下所有的 locallibinclude 文件夹并删除所有与 Node.js 和 node_modules 有关的内容;
  • /usr/local/bin 中删除 Node.js 的可执行文件。
  • 使用 brew 安装的 Node.js 还需要额外运行 brew uninstall node 命令来进行卸载。

安装和检测 NVM

  • 建议使用 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash,安装后将创建目录 ~/.nvm 并将内容存放在这里。
  • wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
  • nvm -h,测试是否安装成功。
  • nvm install v8.9.0,安装 node 8.9.0 版本。

如果安装后不起作用,可以

  • 查看 ~/.bashrc, ~/.bash_profile, ~/.zshrc, ~/.profile 中有没有配置信息 export NVM_DIR...
  • 若没有,就 cd ~vim .bash_profile
  • 将下面 nvm 全局变量配置信息粘贴到文件中,esc -> 输入":wq" -> 回车。
  • 让配置文件里面生效 source .bash_profile
// nvm 全局变量配置信息
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  ## This loads nvm
1
2
3

切换不同版本,配置默认版本

  • nvm ls 列出本机所有已安装的版本。
  • nvm alias default v12.10.0,如果不设置,每次进入终端都要设置哪个版本,烦死,效率低。
  • 若项目所需 Node.js 版本不是默认版本,可以在项目根目录下创建 .nvmrc 文件并在其中预先指定版本号。
  • /Users/你的电脑/.nvm/versions/node/,nvm 版本目录路径。