Skip to content
泠泠彻夜的笔记
Main Navigation首页笔记
HTML
CSS
JavaScript
TypeScript
Node.js
Vue3
uniapp
插件
算法题

外观

此页内容
Table of Contents for current page
  • 1. npm
    • 1.1 npm常用指令
    • 1.2 cnpm
    • 1.3 npx
  • 2. yarn
  • 3. pnpm
  • 4. npm 与 yarn 、 pnpm 的区别
blogs

包管理器

怡然

1427字约5分钟

npm

2024-08-20

1. npm

npm 是 Node.js 官方的包管理工具,它在你安装 node 的时候一并安装。

1.1 npm常用指令

  • npm init: 初始化一个 npm 项目,引导创建package.json
  • npm install: 根据项目中 package.json 安装相关依赖
  • npm install [packageName]: 安装指定的包
  • npm uninstall [packageName]: 卸载指定包
  • npm update [packageName]: 更新指定包
  • npm publish: 发布当前包
  • npm search [packageName]: 查询包
  • npm view [packageName]: 查询包的详细信息,版本、依赖、描述等
  • npm outdated: 查看当前有新版本的包
  • npm ls: 查看当前项目所有依赖树
  • npm run [script_name]: 运行 package.json 中 script 定义的脚本
  • npm link: 将当前包链接到全局的 npm 环境中

1.2 cnpm

为了解决 npm 下载速度过慢的问题,阿里巴巴的淘宝团队提供的一个 npm 镜像。以提高下载速度和稳定性。

1.3 npx

npx 是 npm5.2 版本引入的工具,用于执行 npm 包命令,相比 npm,npx 会自动安装依赖包并执行某个命令,无需预先全局或本地安装某个命令行工具。

2. yarn

通过并行下载和本地缓存来提高性能,可以更快地安装项目的依赖项。默认生成一个 yarn.lock 文件来锁定版本(类似于 npm 的 package-lock.json),确保在不同环境中安装的依赖项版本一致,并且通过验证依赖项的来源和内容来提高安全性,检查每个依赖项的哈希值,并提供签名验证功能。

指令大多与 npm类似,简述两个不一致的指令:

  • yarn add [packageName]: 安装指定的包并添加到 dependencies 中
  • yarn remove [packageName]: 删除指定的包,并更新 package.json 和 yarn.lock

3. pnpm

  • 共享依赖:当多个项目使用相同的依赖的时候,pnpm 只会在磁盘上保留一份依赖。
  • 符号链接:当一个项目安装了某个包的时候 pnpm 会在项目的 node_modules 目录下创建一个符号链接指向全局的依赖目录,这样多个项目可以共享一个依赖而不是每个项目都拥有一份独立的依赖副本。
  • 快照:为了确保项目在不同环境下的一致性,pnpm 将每个项目的依赖信息记录在 pnpm-lock.yaml 的锁文件中。该文件包含了项目所需的依赖以及版本信息,当其他开发者在不同的环境下安装相同的项目时,pnpm 会根据锁文件中的信息安装相同的依赖,从而保证依赖的一致性。

4. npm 与 yarn 、 pnpm 的区别

  1. 早期npm所有的包是附带各自的node_modules的嵌套结构。比如我现在依赖中需要 package1 和 package2,但是这两个包都依赖 package3 的包,但是这时候的 package3 会存在需要依赖它的包中,这样会导致 package3 的冗余,node_modules 的体积特别大,而且如果包一个依赖一个会造成文件路径特别深,并且 windows 有最大路径长度限制,所以在对于一些依赖层级比较深的包就会产生问题。这时候 yarn 就针对该问题做了处理。
  2. 为了解决上述嵌套层级深的问题,yarn 采用扁平化来解决(npm@3+也采用扁平化解决)。将 package3 包进行提升,但是依赖包有多个版本的时候只会提升一个,其余的版本依旧会存在多个。但这种扁平化包管理的方式经常会造成幽灵依赖问题。
    1. 幽灵依赖指我们使用 yarn 有时会出现安装了一些不需要的或者不正确的依赖包的情况。这些依赖包在项目中没有被显式地引用或使用,但仍然存在于 node_modules 目录中,占用了项目的存储空间。
  3. pnpm 采用了软连接和硬链接的方式解决以上存在的问题,软硬连接是操作系统提供的机制。
    1. 硬链接是指在同一个文件系统中,将一个文件名关联到一个已经存在的文件上,使得该文件名也可以访问该文件。硬链接与原文件共享 inode,即它们有相同的 inode 号(储存文件元信息的区域)和相同的 device 号。因此,对于硬链接和原文件来说,它们的访问权限、所有者、大小等属性都是相同的。(可以理解为对原文件起了一个别名,本质是同一个文件)
    2. 软链接(也称符号链接)是指在不同的文件系统之间,将一个文件名关联到另一个文件上,使得该文件名也可以访问该文件。软链接与原文件不共享 inode,它们有不同的 inode 号和 device 号。因此,对于软链接和原文件来说,它们的访问权限、所有者、大小等属性可能不同。(它包含了到原文件的路径信息,本质不是同一个文件)
    3. pnpm 将所有的依赖放在全局的 store 中,然后硬连接到node_modules/.pnpm下。
  4. pnpm 也提高了安装速度:
    1. 依赖解析:仓库中没有的依赖都被识别并获取到仓库。
    2. 目录结构计算:node_modules目录结构是根据依赖关系计算的。
    3. 链接依赖项:所有剩余的依赖项都会从存储中提取并硬链接到node_modules。

相关信息

本篇文章主要参考了以下文章:https://juejin.cn/post/7380771735682236435
作者:outsider_友人A

贡献者: tsxwslk
上一页面试总结CSS部分
下一页S型流程

Power by VuePress & vuepress-theme-plume