前端架构: 脚手架之包管理工具的案例对比及workspaces特性的使用与发布过程

npm、yarn、pnpm的workspaces使用 示例项目中总会遇到npm的packages中出现的workspaces键值对,自己的项目中没接触过这个东西,到底是什么?怎么用的?‌ 当你定义一个缩写后,可以在输入特定的分隔符号时自动展开为完整的表达。例如,如果你定义了"foo"为"find outer otter"的缩写,输入"f o o ."会自动展开为"find outer otter"‌1。使用abbrev包可以极大地提高开发效率,特别是对于那些需要频繁输入的文本。通过定义缩写,开发者可以减少输入工作量,专注于代码的编写‌。 阅读详情

npm的workspaces 特性


1 )使用或不使用包管理工具的对比

  • vue-cli 这个脚手架使用 Lerna 管理,它的项目显得非常清晰
  • 在 vue-cli 中包含很多 package 点开进去,每一个包都有package.json
  • 它里面有很多项目,再没有 Lerna 之前去维护和管理这么多包是会非常困难的
  • 而 webpack 至今还没有用任何的包管理工具,在其 lib 下会有非常多的模块
  • 而且它还自己写了很多脚本来进行管理各种功能
  • 同上上述正反两个例子,可见,不使用包管理工具,整个项目维护起来会很麻烦
  • 比如说你想去给 webpack 做一些贡献,很麻烦很困难,因为你不太清楚,你的改动对整体一个影响
  • 如果使用包管理以后,它就会拆的很清楚,你的改动就是聚合在一个package里面的,这个就是用包管理一些好处
  • 包管理目前流行的两种方式是 workspaces 和 Lerna

2 )workspaces 的基本使用

  • 在一个脚手架项目中,比如xyzcli项目中(之前一直用这个脚手架演示)创建workspaces 目录
    • $ mkdir workspaces && cd workspaces
  • 在 workspaces 目录中执行
    • $ npm init -y
    • 其实,在使用 npm init 的过程中,通过 $ npm init --help
    • 可以看到 Options 中存在 [-w|--workspace <workspace-name> [-w|--workspace <workspace-name> ...]]
    • 也就是 -w 的参数, 比如:$ npm init -w a -w b 默认一路回车
    • 这样,就会在 workspaces 目录下新建了两个包:a 和 b,每个包中,都存在package.json,其name属性分别为 a 和 b
    • 在 workspace/node_modules下 生成a和b的两个软链
    • 在 workspace/package.json 中,存在 workspaces 的配置
      "workspaces": [
        "a",
        "b"
      ]
      
  • 好,现在结构基本搭建完成,现在我要在 workspaces 目录对a包进行安装依赖
    • $ npm i vue -w a
    • 这时候,a包中安装了 chalk 的依赖,但是a包中没有生成 node_modules 目录
    • 在 workspaces 目录下的 node_modules 中安装了 chalk, 而 a 的 package.json 中的 dependencies 是 chalk
    • 同时,b包中的package.json中是没有的
  • 这是 workspace 非常有意思的特性,它把各个内层包的依赖抽象到了最外层来进行管理
  • 这里借助了 commonjs 中对 node_moduels 查找的特性,如果当前查找不到,去上一层目录中去查找
  • 由于此特性,可以通过最外层来管理依赖包,这样的好处是非常明显的
  • 现在在a包中使用chalk, 在package.json中添加 "type": "module" 在 a/index.js 中编写
    import  chalk from 'chalk';
    
    export default {
      print() {
        console.log(chalk.red('Hello workspace'))
      }
    }
    
  • 现在继续修改 a/package.json 中的 name属性,修改为:“@somegroup/a”
  • 这时候,a包就会在后续发布中,自动在 somegroup 分组中了,这个 somegroup 可以是自己起的任意组名
  • 好现在在workspaces目录中新增一个具有cli功能的包,比如就叫做 cli 这个脚手架包
  • $ npm init -w cli 一路回车, 创建了 cli 这个脚手架包
  • 将 cli 包的 package.json 目录中的name属性改成和a包同组,如:"name": "@somegroup/cli"
  • 同时在 workspaces/cli 的package.json中添加 bin 属性
    {
      "bin": {
        "cli": "bin/cli.mjs"
      }
    }
    
  • 因为这时候 cli 脚手架包的 name 不是在一开始创建的,而是一路回车之后,要确定和a同组的,需要执行下 $ npm i -ws 来更新下分组
    • 这时候可以看到 workspaces/node_modules/@somegroup/下存在 a 和 cli 两个软链
    • 同时,可以删除 workspaces/node_modules/cli 这个软链
  • 这时候,想要在 cli 这个脚手架包中引用 a包来调试,需要 在 workspaces 目录下执行
    • $ npm i @somegroup/a -w cli
    • 这时候,会在 cli 脚手架目录中添加了 @somegroup/a 这个 dependencies
  • 新建 bin/cli.mjs 编写
    #!/usr/bin/env node
    
    import * as a from '@somegroup/a'
    
    const { print } = a.default;
    print();
    
  • 最后,可以将 这个 cli 工具在workspaces下配置使用, 因为在 workspace/node_modules/.bin 下有这个cli的软链
  • 所以在 workspaces/package.json 中添加配置
    "scripts": {
      "cli": "cli"
    },
    
  • 这时候在 workspaces 下执行 $ npm run cli, 这样,我们的脚手架就可以直接使用了,如下图
  • 以上就是使用 workspace 来进行包的管理,这里生成了3个包,其中包a和包cli都在@somegroup组下

  • 这里演示了脚手架包cli如何使用包a,在不发布的场景下进行调试,并且对cli包本地的调试

  • 同时,可以参考之前的文章:https://blog.youkuaiyun.com/Tyro_java/article/details/136112045

  • 好,现在发布之前, 还需要处理一下b包,毕竟建立这个包是有用的,不在远程发布有问题的包

  • 将b包的name修改成 "name": "@somegroup/b", 目前这三个包都在 @somegroup 组中了

  • 在b中新建 index.js, 在b/package.json中同步"main": "index.js", 并添加 "type": "module"

  • 给b包安装 ora 依赖,在 workspaces 目录下执行 $ npm i ora -w b

  • 编写 b/index.js

    import ora from 'ora';
    
    export default function() {
    	const spinner = ora().start('loading');
    	setTimeout(() => {
    		spinner.stop();
    	}, 3000)
    }
    
  • 因为修改了 b 的package.json的name属性,需要同步下 $ npm i -ws

  • 并且注意删除下之前 workspaces/node_modules/b 这个叫b的软链

  • 好,现在b包作为工具库为 cli 脚手架提供方法,为cli安装b包, 回到 workspaces 目录下

  • 执行 $ npm i @somegroup/b -w cli, 修改 cli/bin/cli.js 文件

    #!/usr/bin/env node
    
    import a from '@somegroup/a'
    import bLoading from '@somegroup/b'
    
    const { print } = a;
    
    print();
    
    console.log('----------');
    
    bLoading();
    
  • 这时候万事俱备了,就可以发布上线了, 在 worksapces 目录中

    • npm publish -ws 发布所有 workspace 包内容,这个是全部包发布的举例
    • npm publish -w a 发布a包,这个是单个包发布的举例
  • 注意,如果包存在发布报错,可能是因为权限问题,可修改对应包的package.json

    {
    	"publishConfig": {
    		"access": "public"
    	}
    }
    
  • 这样就顺利发布成功了,注意,Lerna 使用时会帮助我们考虑到这一点,Lerna 会省事一些

从Monorepo到微前端:聊聊pnpm Workspaces和Yarn Workspaces在实际大厂项目里的那些坑与最佳实践 本文深入探讨了在大厂级Monorepo项目中,使用pnpm Workspaces和Yarn Workspaces时遇到的依赖管理挑战及解决方案。通过实际案例对比了不同包管理器在幽灵依赖、磁盘空间占用、微前端架构下的表现,并分享了CI流水线优化、构建工具集成等实战经验,帮助团队提升开发效率和项目稳定性。 阅读详情

相关推荐

Monorepo项目管理利器:用pnpm workspaces重构大型前端项目的完整指南

本文是一份针对大型前端项目的完整重构指南,详细介绍了如何利用pnpm workspaces这一Monorepo项目管理利器,解决多仓库协作、依赖地狱和构建效率低下等痛点。文章从工具选型、结构规划、实战迁移到生产级流水线搭建,提供了手把手的步骤与最佳实践,帮助团队实现高效、可维护的代码仓库管理。

weixin_28836875的博客 332

npm里存在感较低的角色- workspace

本期给大家带来的内容是workspace(工作区),它是npm里一个相对重要角色,感兴趣的小伙伴可以进来看一看,或许对你有帮助

2241

Monorepo实战:用pnpm+Workspaces管理前端多项目(附完整配置流程)

本文详细介绍了使用pnpm Workspaces搭建和管理前端Monorepo的完整实战流程。通过对比主流工具,阐述了pnpm在依赖管理、磁盘空间和安装速度上的优势,并提供了从项目结构初始化、依赖配置、脚本构建到CI/CD集成的具体步骤,帮助团队高效实现多模块管理,提升开发协作效率。

weixin_29233857的博客 255

npm【1】package.json中workspace详解

在库的开发过程中,如果每次改动我们都将项目发布到npm或者私库上再下载进行调试未面太过于麻烦。通过npm项目中的package.json进行软链接,可以非常方便的看到我们的开发库在被项目使用后的具体情况。

qq_32019935的博客 6648

从0死磕全栈之Next.js使用pnpm :更快、更省空间的包管理器,开发体验直接拉满!

pnpmnpm)是一个快速、节省磁盘空间的 Node.js 包管理器。它由在2017年发布,目标是解决 npm 和 yarn 在依赖管理中的性能与空间浪费问题。用硬链接 + 符号链接实现依赖共享,避免重复安装。场景推荐工具新项目(尤其是 Next.js)✅pnpm老项目迁移可尝试从 npm/yarn 迁移磁盘空间紧张✅ pnpm 节省 50%+ 空间追求构建速度✅ pnpm 安装快 2-3 倍🚀结论:pnpm 是现代前端开发的更优选择——更快、更小、更安全。

weixin_44058951的博客 1073

前端包管理器pnpm与yarn实战指南:从安装、镜像源配置到核心命令对比

在现代前端开发中,包管理器是管理项目依赖的核心工具,它负责从远程仓库下载和安装第三方库。其工作原理是通过解析package.json文件,构建依赖关系树,并确保版本一致性。这项技术的核心价值在于提升开发效率、保障项目稳定性和优化团队协作流程,广泛应用于Web应用、Node.js服务端及Monorepo项目管理等场景。本文聚焦于当前主流的前端包管理器pnpm和yarn,深入解析其安装部署、镜像源配置优化及日常使用命令,特别针对pnpm的硬链接机制和yarn的确定性安装等热词特性进行对比,帮助开发者根据项目需求

weixin_30482181的博客 348

3 分钟读懂 sample-monorepo:npm workspaces 多包管理入门完全指南

sample-monorepo 是一个基于 **npm workspaces** 与 **TypeScript project references** 的 monorepo 示例项目,它用极简的代码向你演示了多包仓库的目录组织、依赖管理、构建与测试全流程。无论你是前端新手,还是正在为大型项目拆分代码库的工程师,本文都能帮你快速理解 monorepo 的核心思想,并在 3 分钟内搭建出属于自己的第

gitblog_01044的博客 605

持而盈之,不如其已,写 ABAP 时懂得止,系统才有余地

ABAP开发中的"适度哲学":代码不是越满越好。看似周全的代码往往因过度承载职责而成为隐患,如混杂多业务逻辑的报表或工具类。《道德经》"持而盈之,不如其已"启示我们:开发应保持边界清晰,为变更留余地。在ABAP实践中,这体现在:1)方法单一职责,避免校验、持久化、提交混杂;2)RAP开发中合理使用determination/validation等特性;3)SQL查询避免"一次读全"的过度优化。真正的稳健来自适度克制,而非功能堆砌。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1509

npm RFCs实战案例:工作区(Workspaces)提案如何彻底改变多包管理

在当今的JavaScript生态系统中,**npm工作区(Workspaces)**功能已经成为现代前端项目开发的革命性工具。这个功能通过npm RFCs(Request for Comments)流程诞生,彻底改变了开发者处理多包项目的管理方式。本文将深入探讨npm RFCs流程如何孕育出工作区功能,以及它如何为开发者提供更高效的多包管理解决方案。 ## 什么是npm RFCs流程? npm

gitblog_00372的博客 366

npm包管理深度探索:从基础到进阶全面教程!

在当代前端开发领域,npm(Node Package Manager,即Node包管理器)无疑是每位开发者不可或缺的工具。它不仅是一个用于管理Node.js依赖关系的工具,更是一个庞大的生态系统,支撑着百万的软件包。下面,我们将深入探讨npm的基本概念和功能。npm是一个开源的代码库管理器,它允许开发者下载、安装、管理和更新JavaScript项目中的库和依赖项。npm与Node.js紧密集成,是Node.js默认的包管理工具。

邓邓子的博客 2475

[Vue][面试]谈谈你对MVC、MVP和MVVM的理解

谈谈你对MVC、MVP和MVVM的理解 答题思路:此题涉及知识点很多,很难说清楚,说透彻,因为MVC,MVP这些我们前端程序员自己甚至都没用过。但是恰恰反映了前端这些年从无到有, 从有到优的变迁过程,因此沿此思路回答将十分清除。 Web1.0时代 在web1.0时代,并没有前端的概念。开发一个web应用多数采用ASP.NET/Java/PHP编写,项目通常由多个aspx/jsp/php文件构成,每个文件中同时包含了HTML、CSS、JavaScript、C#/Java/PHP代码, 系统整体架构可能如下图所

你好,欢迎光临! 725

Yarn安装与使用全指南:前端包管理利器详解

包管理工具是现代前端工程化的核心组件,通过自动化解决依赖关系提升开发效率。Yarn作为npm的替代方案,采用并行安装和确定性算法,显著提升了依赖管理的速度和可靠性。其核心技术原理包括离线缓存机制和lock文件锁定,确保团队协作时依赖版本的一致性。在实际工程应用中,Yarn广泛应用于各类JavaScript项目,特别适合需要稳定依赖关系的大型项目。通过配置镜像源和工作区功能,开发者可以进一步优化安装速度和项目管理效率。本文详细介绍Yarn的安装方法、常用命令和性能优化技巧,帮助开发者掌握这一前端必备工具。

weixin_26833139的博客 223

银河麒麟服务器(ky10 server)arm、x86安装qemu虚拟机

接下来就可以新建服务器了。

zengliguang的专栏 8714

终极前端包管理指南:npm/yarn/pnpm深度对比与选择策略

在现代前端开发中,包管理工具是项目构建与依赖管理的核心。无论是新手开发者还是资深工程师,选择合适的包管理工具都直接影响开发效率、项目性能和团队协作。本文将深入对比npm、yarn和pnpm三大主流包管理工具,从安装速度、磁盘占用、依赖处理等关键维度进行分析,并结合前端面试常见考点,帮助你做出最优选择。 ## 包管理工具进化史:从npm到pnpm的技术革新 前端包管理工具的发展历程反映了Java

gitblog_00231的博客 443

Windows系统离线搭建PyTorch深度学习环境全攻略(CUDA+cudnn实战)

本文提供了一份在Windows系统下离线搭建PyTorch深度学习环境的完整实战指南。文章详细讲解了如何在没有网络连接的情况下,正确安装和配置CUDA、cudnn以及PyTorch,并构建独立的Python虚拟环境。重点强调了版本依赖关系的重要性,并提供了从驱动准备到环境验证的每一步操作,旨在帮助用户高效、稳定地部署可复用的GPU深度学习开发环境。

table的专栏 579

告别概念晕眩:用TC3xx SMU和TLF35584的配置实例,搞懂ASIL D功能安全落地

本文通过英飞凌TC3xx系列MCU的SMU模块与TLF35584电源管理芯片的协同配置实例,详细解析了如何实现符合ASIL D功能安全标准的刹车辅助ECU。文章涵盖SMU报警源配置、响应动作类型、TLF35584的安全状态管理,以及构建完整安全闭环的实践方法,帮助工程师将抽象的安全概念落地为具体设计方案。

weixin_30647065的博客 439

Yarn Workspaces 多包管理:搭建前端 Monorepo 项目,实现多包共享依赖与统一构建

体积($ \text{体积} \propto \frac{1}{\text{包数量}} $),提升大型项目协作效率。通过 Yarn Workspaces 搭建 Monorepo 项目可实现。所有子包自动继承这些依赖。通过此方案,可显著减少。

2501_93892011的博客 353

《uni-app 长列表优化:虚拟列表(vue-virtual-scroller)解决 1000+ 数据渲染卡顿》(附虚拟列表封装与多端适配)

本文详细介绍了虚拟列表技术在前端长列表渲染中的优化方案。针对传统v-for渲染导致的性能问题(内存占用高、渲染阻塞、滚动卡顿),提出基于vue-virtual-scroller的虚拟列表解决方案,通过可视区域渲染和DOM复用实现性能突破。文章包含核心原理、组件封装、多端适配及性能对比,并给出常见问题的解决方法。实践表明,该方案可将1000条数据的首次渲染时间从3800ms降至420ms,滚动FPS提升至55帧,显著改善用户体验。

qq_59041750的博客 2109

Monorepo项目管理利器:用pnpm workspaces重构前端工程实践

本文详细介绍了使用pnpm workspaces重构中大型前端项目为Monorepo的实践。通过对比npm/yarn,阐述了pnpm在磁盘空间、安装速度及依赖管理上的核心优势,并提供了从项目结构设计、依赖管理到CI/CD集成的完整配置指南,旨在解决多包管理下的依赖混乱与构建效率问题。

yolo5detector的博客 175

【11】GD32H7xx MPU记录

GD32H7xx系列MPU内存保护单元模块的使用记录

madao1234的博客 880

腾讯滑块验证码防水墙 tdc.js 补环境实录

腾讯滑块验证码破解研究摘要 本文记录了破解腾讯防水墙滑块验证码(tdc.js)的全过程。研究重点包括: 流程分析:通过抓包分析验证码完整链路,识别出关键参数collect和eks需从tdc.js虚拟机获取 环境模拟:采用渐进式补环境方法,针对字节码虚拟机特性构建完整的window对象,包括navigator、screen、canvas等API的精确模拟 核心破解:成功调用TDC.getData()和TDC.getInfo()获取关键参数,解决POW计算和滑块缺口识别问题 优化调整:针对errorCode 5

码王吴彦祖的博客 235

Yarn 1.x 终极Monorepo管理指南:使用Workspaces实现高效多包发布

在当今的前端开发中,Monorepo(单一代码库管理多个包)已经成为大型项目的标配架构。Yarn 1.x作为经典的包管理工具,其Workspaces功能为开发者提供了强大的Monorepo管理能力。通过Workspaces,你可以在单一仓库中管理多个相互依赖的包,实现代码共享、统一构建和简化发布流程。😊 ## 🚀 什么是Yarn Workspaces? Yarn Workspaces是Ya

gitblog_00139的博客 369

注意力机制模块:CA(坐标注意力)二次创新:融合深度可分离卷积,打造 CADS 模块

本文提出CADS模块,将坐标注意力(CA)与深度可分离卷积(DSC)深度融合,优化移动端AI部署效率。通过重构CA的计算范式,用深度卷积替代传统1×1卷积,在保持精度的同时显著降低计算开销。文章深入分析了CA的计算瓶颈和DSC的实际效率问题,详细阐述了CADS的设计原理与PyTorch实现,并提供了多组性能对比数据。该模块可直接应用于YOLO、UNet等主流模型,为移动端AI部署提供高效解决方案。

ZXSXJ的博客 96

Yarn Workspaces 完整指南:大型项目管理的终极解决方案

Yarn Workspaces 功能是 Yarn 包管理器的强大特性,专为管理包含多个相互依赖包的**大型项目**而设计。通过工作区,您可以在单个仓库中管理多个包,同时保持依赖关系的清晰和一致。对于现代前端开发和企业级应用来说,Yarn Workspaces 提供了一个**高效**的依赖管理方案,让团队协作和代码复用变得更加简单。✨ ## 什么是 Yarn Workspaces? Yarn W

gitblog_00623的博客 421

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

create-eth-app工作区管理:Yarn Workspaces最佳实践

想要快速构建以太坊驱动的去中心化应用?create-eth-app 是一个强大的脚手架工具,通过单一命令即可创建完整的以太坊应用。本文将深入探讨该项目中的工作区管理机制,特别是如何利用 Yarn Workspaces 实现高效的多包管理。🚀 ## 什么是Yarn Workspaces及其优势 Yarn Workspaces 是 Yarn 包管理器提供的一个功能,允许你在单个代码仓库中管理多个

gitblog_01115的博客 562

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

FossFLOW开发环境搭建:npm workspaces管理monorepo项目

在现代前端开发中,随着项目规模扩大,代码组织和依赖管理变得越来越复杂。Monorepo(单一代码库)架构通过将多个项目存储在同一仓库中,有效解决了跨项目协作、版本一致性和依赖共享等问题。FossFLOW作为一个功能丰富的等距图编辑器,采用了基于npm workspaces的monorepo架构,本文将详细介绍如何搭建其开发环境并高效管理多包项目。 ## 项目架构概览 FossFLOW采用典型的...

gitblog_00633的博客 761
上一篇: 前端架构: 脚手架之多package项目管理和架构
下一篇: 前端架构: 脚手架包管理工具之lerna的全流程开发教程
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值