当前位置: 首页 > news >正文

从依赖地狱到依赖天堂PNPM

目录

前言

使用 npm 全局安装(推荐)

总结

什么是Monorepo

主流解决方案

依赖管理优化

 使用PNPM 改造大型项目

1. 初始化 pnpm 工作区

2.初始子项目 package.json

3. 启动项目及安装依赖


前言

在现代前端开发中,高效的包管理和依赖治理对于项目的健康发展至关重要。随着项目规模的不断扩大,传统的 npm 和 yarn 在处理依赖关系时可能会遇到诸如依赖重复安装、磁盘空间浪费、依赖版本冲突等问题。而 pnpm(performant npm)作为新一代包管理工具,不仅显著提升了安装效率,还为项目依赖治理带来了全新的解决方案。

pnpm王牌登场 – 网状+平铺结构
pnpm (performant npm) 是一个快速、节省磁盘空间的包管理工具。它于 2017 年发布,是 npm 的替代品,专注于解决传统包管理工具存在的问题。

就这么简单,说白了它跟npm与yarn没有区别,都是包管理工具。但它的独特之处在于:

包安装速度极快
磁盘空间利用非常高效
安装包速度快

使用 npm 全局安装(推荐)

如果你已经安装了 Node.js 和 npm,可以直接运行:

npm install -g pnpm

安装完成后,检查版本:

pnpm -v

总结

场景命令
安装在根目录pnpm add <package> -w
安装在子包pnpm add <package> --filter <子包名>
关闭警告在配置中设置 ignore-workspace-root-check=true

这样可以避免意外将依赖装错位置!

什么是Monorepo

Monorepo (单体代码仓库)是一种将多个相关项目集中管理在单一代码仓库中的架构模式,适用于大型前端项目、微前端架构或前后端共存的系统。其核心优势包括共享依赖、统一代码规范及提升开发效率。 ‌12

主流解决方案

  1.  pnpm workspaces 
    pnpm原生支持Monorepo结构,通过pnpm-workspace.yaml配置实现依赖管理和多框架支持(如Vue、React)。适用于现代前端项目,支持按需构建和缓存复用。 ‌14

  2.  TurboRepo 
    Vercel 开发的工具,基于文件哈希实现增量构建和远程缓存共享,可显著提升大型仓库的构建效率。支持依赖提升白名单设置和循环依赖检测。 ‌45

  3.  Lerna 与 Nx 
    Lerna适合早期Monorepo实践,配合npm/yarn使用;Nx提供更完整的项目生命周期管理(包括依赖管理、构建优化等),适合复杂的前后端一体化项目。 ‌13

依赖管理优化

  • 依赖冲突‌:通过:ml-search[node-linker=hoisted]配置解决版本冲突,设置:ml-search[public-hoist-pattern]允许部分依赖提升。 ‌5
  • 构建加速‌: TurboRepo 支持:ml-search[增量构建](基于文件哈希缓存)和:ml-search[远程缓存共享],减少全量构建时间。

 使用PNPM 改造大型项目

1. 初始化 pnpm 工作区

首先,在项目根目录下创建 pnpm-workspace.yaml 文件:

packages:

  - 'src/*'

安装package.json已有的依赖文件 pnpm i 

2.初始子项目 package.json

每个子项目应该有独立的 package.json,使用pnpm init

{"name": "youyang","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC","dependencies": {"decimal.js": "^10.6.0"}
}

3. 启动项目及安装依赖

安装子项目依赖命令 pnpm add decimal.js --filter youyang

安装项目公共依赖命令 pnpm install --save decimal.js -w

启动项目命令pnpm run dev

http://www.dtcms.com/a/268598.html

相关文章:

  • 01、通过内网穿透工具把家中闲置电脑变成在线服务器
  • C盘瘦身 -- 虚拟内存文件 pagefile.sys
  • (六)PS识别:源数据分析- 挖掘图像的 “元语言”技术实现
  • python list去重
  • 【Behavior Tree】-- 行为树AI逻辑实现- Unity 游戏引擎实现
  • Docker 将镜像打成压缩包将压缩包传到服务器运行
  • 物联网技术的关键技术与区块链发展趋势的深度融合分析
  • Java SE与Java EE使用方法及组件封装指南
  • 安卓10.0系统修改定制化_____安卓9与安卓10系统文件差异 有关定制选项修改差异
  • Java 并发编程中的同步工具类全面解析
  • qiankun隔离机制
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的高校实验室资源综合管理系统,推荐!
  • 按键开关:新型防水按键开关的特点!
  • 音频流媒体技术选型指南:从PCM到Opus的实战经验
  • 【Java面试】Https和Http的区别?以及分别的原理是什么?
  • 02 除了前面常见图表,还有许多更细分或专业的可视化类型,尤其是在特定领域(如金融、工程、生物信息等)。
  • GaussDB应用场景全景解析:从金融核心到物联网的分布式数据库实践
  • OpenCV 人脸分析----人脸识别的一个经典类cv::face::EigenFaceRecognizer
  • Oracle PL/SQL 编程基础详解(从块结构到游标操作)
  • idea 使用vscode 快捷键
  • UE 材质 变体 概念
  • ClickHouse 入门详解:它到底是什么、优缺点、和主流数据库对比、适合哪些场景?
  • 1.1_5_2 计算机网络的性能指标(下)
  • 【Vben3全解】【组件库开发】解决组件库开发中css的命名难题,保证代码质量,构建useNamespace函数
  • docker所占硬盘内存指令
  • 强化学习:Distributed PPO (DPPO) 学习笔记
  • Day08-Flask 或 Django 简介:构建 Web 应用程序
  • C++高频知识点(三)
  • 基于STM32设计的心率脉搏测量仪(项目资料)(ID:9)
  • 【Linux | 网络】网络编程套接字