npm 学习笔记

npm

# npm 学习笔记

# 安装

  • 安装Node.js的时候,会连带一起安装npm
  • 安装最新版npm: npm install npm@latest -g

# npx

  • npm 从5.2版开始,增加了 npx 命令。npx 想要解决的主要问题,就是调用项目内部安装的模块。
  • 对于一些全局安装的工具包,比如create-react-app,执行npx create-react-app my-react-app,那么npx执行的逻辑是:将create-react-app下载到临时目录,使用以后再删除;若后面再次执行这个命令,会重新下载create-react-app

# 全局链接

  • 查看所有全局链接:npm ls --global --depth 0
  • 删除某个全局链接:npm uninstall --global pkg
  • 在一个npm的项目中执行npm link会创建一个全局的npm链接,指向当前执行命令的目录。
  • 链接的名字对应的是package.json中的name,比如叫做:pkgName
  • 记得给项目添加main属性,指定主入口。
  • 如果要在其他的项目中使用这个全局链接,则在项目的根目录中执行,npm link pkgName。生成链接后,每次修改代码,都会同步。不需要再做二次链接。
  • 如果测试完成后,务必记得删除pkgName,先在项目中删除模块,执行npm unlink pkgName
  • 然后进入pkgName项目根目录,执行npm unlink

# 使用模块

  • npm link pkgName
  • 如果pkgName中指定了"main":"index.js"属性,那么在require的时候,就会去查找pkgName/index.js
  • 如果pkgNamepackage.json中还使用了bin属性,那么会在本地的{prefix}/bin/下面再建立一个软连接,这样就可以直接在命令行中使用bin配置的属性。
  • 如果bin下面有多个命令,则会在{prefix}/bin下面,生成多个全局的软连接。
  • 如果执行bin下面对应命令提示没有权限的话,需要将npm{prefix}/bin路径,添加到$PATH中。
  • 例如,你可以在.zshrc中,添加代码:export PATH={home}/.nvm/versions/node/v12.16.1/bin。作者本人是使用的nvm管理node,所以PATH可能跟大家的不一样,仅供参考。

# 注意

  • pkgName项目中删除的时候,直接npm unlink会删除不掉,错误信息为:Must provide a package name to remove。然后又执行npm unlink pkgName,还是删除不掉。后来使用了npm unlink pkgName -g才能删除成功。不知道是不是使用了nvm的关系。如果是使用原生的node安装包安装,可能会不一样。笔者在这里没有做进一步的测试。
  • 测试的npm版本为 7.22.0,这时候,{prefix}/lib/node_modules{prefix}/bin/下面的软连接都会一起删除掉。
  • 也可以进入到目录下,手动删除:rm linkName

# npm ci

  • npm ci 基于一个独立的库 libcipm 安装依赖,功能类似npm install。当它安装依赖时,默认是缓存优先的,从而加速装包。
  • 使用限制:
    • 必须包含package-lock.json
    • npm 版本 >=5.7

# npm install

  • 在项目中执行npm install pkgName, pkgName被安装到当前目录的node_modules子目录;其次,node_modules/.bin目录会生成一个符号链接node_modules/.bin/pkgName,指向pkgName模块的可执行脚本。
  • 安装成功后,就可以在package.jsonscript属性里面,不带路径的引用pkgName这个脚本。

# peerDependency

  • 可以用来避免核心依赖库被重复下载的问题。提示宿主环境去安装满足插件peerDependencies所指定依赖的包。
  • 比如antd就指定了peerDependencies
  "peerDependencies": {
    "react": ">=16.9.0",
    "react-dom": ">=16.9.0"
  }
  • 我在自己的本地项目中显式的安装依赖"react": "^17.0.2",然后再安装antd
  • 最终在本地项目的node_modules下,安装了"react": "17.0.2"和"react-dom": "17.0.2"
  • 删除node_modulespackage-lock.json,先安装react@16.0.0,再安装antd,会提示unable to resolve dependency tree
  • 另外,如果先安装antd,再安装低版本的react,也会提示相应的报错。

# 同yarn比较

# yarn

  • 并行安装。二次安装,直接从缓存中读取。速度更快。
  • 安装版本统一:生成yarn.lock文件
  • yarn依赖结构是扁平化的。
  • 命令:add, remove
  • 日志输出更加简洁,仅展示必要的信息。

# npm

  • 按照队列进行安装,类似串行安装。
  • 5.0版本,默认新增了类似yarn.lock的 package-lock.json
  • npm2之前是树形的,npm3以上是扁平化的。
  • 命令:install uninstall,安装的时候打印安装依赖。