npm相关

150 阅读5分钟

npx执行过程

  • 执行npx命令时,会先去node_modules/.bin路径检查npx后的命令是否存在,找到之后执行;
  • 找不到,就去环境变量$PATH里面,检查npx后的命令是否存在,找到之后执行;
  • 还是找不到,自动下载一个临时的依赖包最新版本在一个临时目录,然后再运行命令,运行完之后删除,不污染全局环境。

npm命令行

  • npm init -y
  • npm install 过程
b8bb768363371a3f9c.png
查看信息
  • npm version 关于npm的版本信息,npm -v 仅仅是版本号
  • npm root 本地依赖的node_modules文件夹地址, npm root -g 全局的
  • npm info lodash 查看一个包的信息(版本,依赖项,作者,关键字等)
  • npm search lodash 搜索含有lodash关键字的包,就是 npm官网的搜索框搜索的机构
  • npm outdated 查看当前项目安装的包是否有更新的包等
  • npm ls --depth 1 当前项目安装的依赖包,--depth控制依赖树的深度, -g罗列全局的包
配置相关
// npm config list -a
// npm内置的配置
; "builtin" config from C:\Users\WL\AppData\Roaming\npm\node_modules\npm\npmrc

prefix = "C:\\Users\\WL\\AppData\\Roaming\\npm"
// user 自己配置的
; "user" config from C:\Users\WL\.npmrc

registry = "https://registry.npmmirror.com/"
strict-ssl = false

; "cli" config from command line options

all = true

; node bin location = C:\Program Files\nodejs\node.exe
; node version = v20.11.1
; npm local prefix = D:\vue3demo\vue3demo
; npm version = 9.6.6
; cwd = D:\vue3demo\vue3demo
; HOME = C:\Users\WL
; Run `npm config ls -l` to show all defaults.
建立软连接
  • npm link 为一个包创建一个全局的软连接,其他的包可以应用这个包,这样在本地就方便测试了.分两步走
    • cd ~/projects/node-redis # go into the package directory
    • npm link # creates global link 第一步 查看 npm ls -g
    • cd ~/projects/node-bloggy # go into some other package directory.
    • npm link redis # link-install the package,第二步,这个redis是node-redis的package.json中的name,不是文件夹的名字
  • 两步合成一步
    • cd ~/projects/node-bloggy # go into the dir of your main project
    • npm link ../node-redis # link the dir of your dependency 合成一步
  • npm unlink redis 断开连接
缓存
  • 当我们安装、更新或卸载包的时候,npm 会将这些包的tarball文件缓存到本地磁盘上,有助于加速将来的安装过程,再次安装的时候可以直接在缓存文件中安装,不需要在远程仓库安装
  • tarball文件是一种压缩文件格式,通常用于Unix和Linux系统打包分发源代码,二进制文件,扩展名通常.tar.gz or .tgz
  • npm中,tarball文件通常用于将包的所有文件(源代码,二进制文件)打包成单独的文件,以便安装和更新包。
  • npm从registry.npm.org下载包时,npm i <package>时,从远程仓库下载tarball文件,然后解压缩安装该包。
  • npm cache clean 清除缓存,新版不推荐使用了
  • npm cache verify 验证缓存的完整性,验证缓存是否有用
  • npm cache add <package> 一般不需要手动添加,安装时自动添加了
  • npm cache ls 查看缓存
  • npm config get cache
包的更新
  • npm update 检查依赖是否有新的包可用,有就更新。
  • npm update <package>
  • npm audit 检查当前项目的依赖,哪些依赖有漏洞
  • npm audit fix 带有修复
  • npm dedupe 能够优化项目的依赖树结构
  • npm prune 删除没有在package.json列出的依赖包,删除不再需要的包
帮助指令
  • npm help

npm的原理相关

  • 每一个项目都有大量的依赖文件在node_modules中,多个项目独自维护自己的依赖,占用大量空间
  • 扁平化安装依赖包,这样项目的两个依赖,这两个依赖都依赖了同一个包,这个包只需要下载一次就可以了。
  • 幽灵依赖问题

pnpm

  • 优点

    • 多仓库
    • strict 严格 non-flat node_modules
    • 高效 使用硬连接、软连接 content-addressable storage
    • 节省磁盘content-addressable storage
      • npm是100 projects依赖同一个包,这个包在硬盘上有100份
      • pnpm 使用content-addressable storage,同一个依赖磁盘只保留一份,同一个依赖不同的版本,也只保存有差异的文件。应该是以文件的hash不同确定保存的
    • 加上安装速度
    • 避免幽灵依赖引起的问题 1714541697562.png 1714542062141.png
  • 硬链接vs软链接

    6bbf5639493a8beedbd702f7acdd920.png 74a92f85c03120c28382c7a0636be1b.png beb17054f1d7f52bec31456b68442a6.png
  • 创建非扁平化的node_modules

1bc7e7ee9418ff8311d95b5e670874c.png #### workspace - By default, pnpm will link packages from the workspace - 例如:bar依赖foo@1.0.0,并且foo@1.0.0在workspace中;然而,修改bar依赖foo@2.0.0并且不在workspace中,foo@2.0.0将从registry中安装。这就引来了不确定性。 - 使用workspace:protocol,可以只从local workspace package中引入包,去掉了这种不确定性 - workspace protocol非常有用, `link-workspace-packages`是false时
  "dependencies": {
    "@vue/shared": "workspace:*",
    "@vue/reactivity": "workspace:*"
  }

pnpm

  • -c <path> 指定pnpm的运行目录; -w 即--workspace-root在workspace的root目录执行pnpm
  • pnpm add
    • pnpm add --workspace packageName packageName必须在workspace中
    • pnpm add debug -w 添加到root
  • pnpm store 管理磁盘的.pnpm/store 存储所以得硬链接
    • pnpm store path 返回路径 每一个磁盘有一个,硬链接不能跨磁盘建立
    • pnpm store add packageName 功能同pnpm add,处理不修改任何项目的package.json
    • pnpm store prune 删除不需要的包