使用pnpm workspace管理Monorepo架构

这篇具有很好参考价值的文章主要介绍了使用pnpm workspace管理Monorepo架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在开发项目的过程中,我们需要在一个仓库中管理多个项目,每个项目有独立的依赖、脚手架,这种形式的项目结构我们称之为Monorepopnpm workspace就是管理这类项目的方案之一。

一、pnpm简介

1、pnpm概述

pnpm代表performance npm(高性能的npmn),同npmyarn,都属于javascript包管理安装工具,它较npmyarn在性能上得到很大提升,被称为 快速地,节省磁盘空间的包管理工具

2、pnpm优点

  • 快速:pnpm会将包缓存到本地,减少二次安装需要的时间。

  • 节省磁盘空间:他会把包软链到项目本地,不需要反复安装。

  • 节省网络带宽:同样的道理

  • 更好的依赖处理逻辑

3、对比lerna+yarn

使用lerna+yarn组合,也可以实现Monorepo项目管理。但是相比来说,更推荐pnpm workspace来管理。

原因如下:

当使用npmyarn时,如果你有100个项目使用了某个依赖,就会有100份该依赖的副本保存在硬盘上,而在使用pnpm时,依赖会被存储在内容可寻址的存储中。

  • 如果你用到了某依赖项的不同版本,只会将不同版本间有差异的文件添加到仓库。 例如,如果某个包有100个文件,而它的新版本只改变了其中1个文件。那么 pnpm update 时只会向存储中心额外添加1个新文件,而不会因为仅仅一个文件的改变复制整新版本包的内容。

  • 所有文件都会存储在硬盘上的某一位置。 当软件包被安装时,包里的文件会硬链接到这一位置上对应的文件,而不会占用额外的磁盘空间。 这允许你跨项目地共享同一版本的依赖。

4、安装pnpm

如果已经安装了npm,直接使用npm i -g pnpm进行全局安装。

二、构建一个Monorepo项目

先上最终的项目结构:

Monorepo
- umi-antd
- web
-- common1
-- common2

如上图,我们最终要创建如上图的一个项目结构,其中umi-antd是主项目,web文件夹下的都是子项目,供umi-antd调用。

1、创建主项目

主项目这里是使用的umi项目,这里也可以构建基于其他打包工具的各类项目,只要是遵守package.json配置条例的项目,都是可以的。

构建umi项目

pnpm dlx create-umi@latest

这里选择创建Ant Design Pro项目。

$ npx create-umi@latest
? Pick Umi App Template › - Use arrow-keys. Return to submit.
    Simple App
❯   Ant Design Pro
    Vue Simple App

根目录创建pnpm-workspace.yaml

packages:
  # 主项目
  - 'umi-antd'
  # 子目录下所有项目
  - 'web/*'

2、创建子项目common1

  • 进入Monorepo>web目录,创建common1文件夹

  • 然后进入common1目录,执行命令npm init对项目进行初始化,这时候会生产一个package.json文件

  • 新建index.ts文件,代码如下:

    export default function print(msg:string) {
        console.log(msg);
    }
    

3、创建子项目common2

步骤和创建common1一致

4、主项目中引入子项目

安装common1common2

pnpm -F umi-antd add common1
pnpm -F umi-antd add common2

安装完成后,在umi-antd依赖中出现两个子项目的软链接(或者叫符号链接)。

在业务代码中调用子项目输出的方法:

//umi-antd\src\pages\Home\index.tsx

import Guide from '@/components/Guide';
import { trim } from '@/utils/format';
import { PageContainer } from '@ant-design/pro-components';
import { useModel } from '@umijs/max';
import styles from './index.less';
import print1 from 'common1';
import print2 from 'common2';

const HomePage: React.FC = () => {
  const { name } = useModel('global');
  print1("umi-antd中调用common1");
  print2("umi-antd中调用common2");
  return (
    <PageContainer ghost>
      <div className={styles.container}>
        <Guide name={trim(name)} />
      </div>
    </PageContainer>
  );
};

export default HomePage;

5、运行主项目

到这里基本搭建完毕,这时候的整体项目结构如图:
使用pnpm workspace管理Monorepo架构,Web前端,monorepo,pnpm
然后执行命令启动主项目:pnpm -F umi-antd start,我们可以看到,控制台打印出来子模块中的信息。

使用pnpm workspace管理Monorepo架构,Web前端,monorepo,pnpm

6、子模块调用子模块

子模块也是可以相互调用的,这里我们在common1中引入common2的方法。

  • 执行命令pnpm -F common1 add common2

  • common1中调用common2中方法,代码如下:

    //web\common1\index.ts
    import print2 from 'common2';
    export default function print(msg:string) {
        console.log(msg);
        print2("这里是common1中调用common2");
    }
    

再次运行umi-antd项目时,我们可以看到,控制台已经打印了common2中方法。

使用pnpm workspace管理Monorepo架构,Web前端,monorepo,pnpm

三、workspace协议(workspace:)

1、协议概述

默认情况下,如果可用的 packages 与已声明的可用范围相匹配,pnpm 将从工作区链接这些 packages。 例如, 如果bar引用"foo": "^1.0.0"并且foo@1.0.0存在工作区,那么pnpm会从工作区将foo@1.0.0链接到bar。 但是,如果 bar 的依赖项中有 "foo": "2.0.0",而 foo@2.0.0 在工作空间中并不存在,则将从 npm registry 安装 foo@2.0.0 。 这种行为带来了一些不确定性。

幸运的是,pnpm 支持 workspace 协议 workspace: 。 当使用此协议时,pnpm 将拒绝解析除本地 workspace 包含的 package 之外的任何内容。 因此,如果您设置为 "foo": "workspace:2.0.0" 时,安装将会失败,因为 "foo@2.0.0" 不存在于此 workspace 中。

当 link-workspace-packages 选项被设置为 false 时,这个协议将特别有用。 在这种情况下,仅当使用 workspace: 协议声明依赖,pnpm 才会从此 workspace 链接所需的包。


以上是官网的解释,实际在使用的时候,如果引入的项目需要强制使用本地包,则可以使用workspace:协议。改造下umi-antdpackage.json文件如下:

  "dependencies": {
    "@ant-design/icons": "^5.0.1",
    "@ant-design/pro-components": "^2.4.4",
    "@umijs/max": "^4.0.76",
    "antd": "^5.4.0",
    "common1": "workspace:^",
    "common2": "workspace:^"
  },

上面加上common1common2的依赖声明后,会强制到本地寻找,找不到也不会到npm registry对应的私仓去下载。

2、版本符号

workspace协议,区分*~^版本号,表示的意义各部相同,具体如下:

{
    "dependencies": {
        "foo": "workspace:*",
        "bar": "workspace:~",
        "qar": "workspace:^",
        "zoo": "workspace:^1.5.0"
    }
}
///将会被转化为:
{
    "dependencies": {
        "foo": "1.5.0",
        "bar": "~1.5.0",
        "qar": "^1.5.0",
        "zoo": "^1.5.0"
    }
}

workspace协议官方说明:官方地址文章来源地址https://www.toymoban.com/news/detail-658806.html

到了这里,关于使用pnpm workspace管理Monorepo架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 袋鼠云数栈前端从 Multirepo 到 Monorepo 研发效率提升探索之路

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。 本文作者:星野 前端代码管理一直是困扰着不少前端开发团队的难题,从开发到发布的整体工作流程中,除了常规的技术问题外,往往

    2024年02月04日
    浏览(45)
  • monorepo

    (一)monorepo 管理 1. monorepo 是管理项目代码的一种方式,指在一个仓库项目(repo)中管理多个模块/包(package) 2. monorepo 最主要的好处是统一的工作流和代码共享 3. Lerna 是一个管理多个 npm 模块的工具,优化维护多包的工作流,解决多个包相互依赖,且发布需要手动维护多个包的

    2024年02月09日
    浏览(22)
  • umi + monorepo实践

    目前负责的企微端的应用有三个: 策略分享:手机端、PC端使用 单向视频审核:PC端使用 资配报告:手机端使用 三个项目的相同点: 后端接口域名相同 企微的JS-SDK配置基本相同 希望可以共用Jenkins部署脚本,减少部署脚本的工作量 不同点: 界面样式不同,有的给PC用,单位

    2024年02月02日
    浏览(29)
  • Monorepo-uniapp 构建分享

    Monorepo uniapp  构建灵感:刚好要做一个项目,于是想到升级一下之前自己写的一个vue3+ts+pinia+uno的模版框架,其实那个框架也不错;只是感觉还差点东西,我已经用那个小框架写了两三个项目;轻巧实用。为什么选择去基于vben3构建uniapp 的monorepo架子,主要还是热爱,想去探索

    2024年01月16日
    浏览(26)
  • monorepo工程开发交互nodejs命令行程序

    [MixedCli](https://zhangfisher.github.io/mixed-cli/) 为 monorepo 应用开发命令行程序提供了一套解决方案,提供了更加友好的命令行开发体验。 以一个典型的 monorepo 为例开始: 示例工程名为 flexapp ,工程中的包名分别是 @flexapp/core 、 @flexapp/cli 、 @flexapp/vue 、 @flexapp/react 。 @flexapp/cli 是命

    2024年01月25日
    浏览(26)
  • Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践

    书接上回《Monorepo 解决方案 — Bazel 在头条 iOS 的实践》,在头条工程切换至 Bazel 构建系统后,为了支持用户使用 Xcode 开发的习惯,我们使用了开源项目 Tulsi 作为生成工具,用于将 Bazel 工程转换为 Xcode 工程。但是在使用的过程中,我们发现了一些问题,其中影响较大的是,

    2024年04月16日
    浏览(43)
  • pnpm 使用 workspace 报错 ERR_INVALID_THIS

    有时候真的感觉如果有一个老师指路,那么遇到的坑真的会少很多。 错误示例: 原因是什么?原因就是 pnpm 的 bug!把你的pnpm升级到 8.3.1 及以上。 github issue

    2024年04月22日
    浏览(30)
  • 前端包管理器的工具,npm和Yarn以及pnpm是最常用的

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 前端包管理器是用于管理前端项目依赖项(如库、框架和工具)的工具。它们有助于确保项目的依赖项始终保持最新、可维护和可复制。以下是一些常用的前

    2024年02月07日
    浏览(52)
  • 你真的知道 NPM、Yarn 与 PNPM 这三个前端包管理器之间的区别吗?

    在当代的Web开发过程中,JavaScript项目的构建离不开各种外部依赖,无论是实用的库、辅助工具还是其他类型的资源。这些依赖项的管理,已经成为了开发者日常不可或缺的一部分。NPM、Yarn和PNPM这三个包管理器,就像是开发者的得力助手,它们在项目开发中扮演着至关重要的

    2024年04月13日
    浏览(48)
  • 前端 node 常见的包管理工具 npm、npx、Yarn、cnpm、pnpm 的区别有哪些

    些工具都是用于管理 Node.js 包和依赖项的 npm (Node Package Manager) : npm 是 Node.js 的默认包管理工具,随同 Node.js 安装。 主要功能包括安装、发布、管理 JavaScript 包和依赖项。 npm 是最常用的包管理工具之一,拥有庞大的包仓库(npm Registry)。 npx : npx 是 npm 5.2.0 版本引入的一个工

    2024年02月20日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包