pnpm+monorepo实现前端公共函数、组件库

一、前言

1. pnpm

pnpm 是前端包管理工具之一,常见的还有npm、yarn等,但pnpm由于安装速度快、磁盘占用低、内置支持monorepo等优势,所以更推荐使用。

1-1 包管理工具核心特点对比

特性pnpmnpmyarn
安装速度🚀 快(基于硬链接和缓存)⏳ 较慢(全量复制)🚀 快(全量复制+缓存优化)
磁盘占用📉 低(共享 node_modules 依赖)📈 高(每个项目完整安装)📈 高(和 npm 类似)
包管理机制硬链接+全局存储直接安装到 node_modules直接安装到 node_modules
严格性🔒 严格模式(默认不可创建隐式依赖)🔓 允许隐式依赖🔓 允许隐式依赖
Monorepo 支持✅ 内置(pnpm workspaces❌ 需要 npm workspacesyarn workspaces
离线安装✅ 支持❌ 不支持✅ 支持
自动并行安装✅ 默认并行安装❌ 串行安装(npm 6)✅ 并行安装(npm 7+✅ 并行安装
Hoisting(提升依赖)🚫 默认不提升(更符合依赖层级)✅ 允许✅ 允许
Lockfilepnpm-lock.yamlpackage-lock.jsonyarn.lock

1-2 简单命令对比

操作pnpmnpmyarn
安装依赖pnpm installnpm installyarn install
添加依赖pnpm add <pkg>npm install <pkg>yarn add <pkg>
移除依赖pnpm remove <pkg>npm uninstall <pkg>yarn remove <pkg>
运行脚本pnpm run <script>npm run <script>yarn <script>
全局安装pnpm add -g <pkg>npm install -g <pkg>yarn global add <pkg>
初始化项目pnpm initnpm inityarn init

2. monorepo

2-1 概念

所有模块在同一仓库下,代码共享和协作更方便,无需发布到 npm 才能使用。

2-2 优势

  • 代码共享更容易

    • 所有模块在同一仓库下,代码共享和协作更方便,无需发布到 npm 才能使用。
  • 一致的依赖管理

    • 可以使用 pnpm/yarn/npm workspaces 统一管理依赖,避免每个模块单独安装,减少重复安装的依赖包。
  • 更容易的跨模块修改

    • 在此之前,多采用 Multi-repo 模式,即多个项目分别单独管理,这会导致一些问题,如修改 A 项目 API 需要:
      1. 更新 A 项目代码
      2. 发布新版本到 npm
      3. 更新 B 项目的依赖
    • 在 Monorepo 中,只需在同一个仓库内修改 A 和 B,避免复杂的版本管理。
  • 简化 CI/CD 流程

    • 只需配置一个 CI/CD 流程,即可管理多个模块的构建、测试和发布。
  • 原子性提交

    • 允许一次 PR 修改多个模块,保证所有变更一次性生效,避免版本不兼容问题。

2-3 缺点

  • 首次配置繁琐
  • Git 仓库规模较大,所有项目都在一个仓库中,随着时间推移,Git 历史可能变得庞大。
  • 不方便对项目做权限划分

2-4 Monorepo vs Multi-repo

对比项Monorepo(单仓库)Multi-repo(多仓库)
代码存储单个 Git 仓库每个模块独立 Git 仓库
依赖管理共享 node_modules,统一管理每个模块单独管理
版本管理可以使用 workspace:*每个模块单独发布版本
跨模块修改统一 PR 提交,改动同步需要更新多个仓库,发布新版本
CI/CD统一 CI/CD 流程每个仓库需要独立 CI/CD
适用场景内部共享库、组件库、前端+后端一体化需要独立发布、独立管理的项目

二、实现流程

1. 构建项目结构

根目录下执行 pnpm init 初始化项目

使用pnpm进行work-space,根据 pnpm官方文档,项目根目录下创建 pnpm-workspace.yaml,基本内容如下:

packages:
  # 指定根目录直接子目录中的包
  - 'my-app'
  # packages/ 直接子目录中的所有包 - 所有前端项目存储的目录
  - 'packages/*'
  # components/ 子目录中的所有包 - 给所有项目使用的公共组件
  - 'components/**'
  # utils/ 子目录中的所有包 - 给所有项目使用的公共工具库
  - 'utils/**'
  # 排除测试目录中的包
  - '!**/test/**'

根目录下创建 .npmrc,用于确保后续下载依赖时,优先从本地查找,而非远程npm。

# 解决pnpm add时优先在本地查找依赖
link-workspace-packages=true 

根据 pnpm-workspace.yaml 中声明的目录创建结构,此时项目目录如下:

在这里插入图片描述

2. 测试本地依赖

通过 utils、packages/web 测试本地依赖

2-1 utils

utils目录 下,执行pnpm init,此时出现 package.json,修改name为 @xxx/utils 格式,并加入 "private": true,

{
  "name": "@tbc/utils",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "private": true,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {}
}

utils目录下创建 text.js

const testFn1 = () => { console.log("fn1"); }
const testFn2 = () => { console.log("fn2"); }

export default {
  testFn1,
  testFn2
}

utils目录下创建 index.js注意: 文件名要与 package.json 中的 main 字段一致,默认为 index.js

在这里插入图片描述
index.js 中整合所有方法并导出

export * from "./test"

2-2 packages/web

packages目录下,创建项目 web 模拟真实项目,执行npm create vitepnpm i
执行pnpm add @tbc/utils安装 utils目录的依赖

在这里插入图片描述
npm run dev启动项目,并在 App.vue 中使用 utils下 的公共方法

import { testFn1 } from '@tbc/utils'
console.log(testFn1(),"===");

查看控制台打印
在这里插入图片描述
此时直接修改 utils目录 下的公共方法(加入return)
在这里插入图片描述
web项目中无需更新依赖,自动使用最新公共方法,查看打印
在这里插入图片描述

3. 组件库

3-1 封装简易组件

组件库与utils同理,在components目录下创建组件库项目,如npm create vite。修改 package.json 的name字段为 @tbc/ui

组件库项目根目录下,创建 dir 目录,用于存储组件。
dir/MyButton.vue

<template>
  <button style="background-color: antiquewhite;width: 150px;border-radius: 8px;">自定义组件</button>
</template>

组件库项目根目录下,创建 index.js 文件,用于对外暴露组件
index.js

import 'element-plus/dist/index.css'; 
import MyButton from "./dir/MyButton.vue"

export { MyButton }

3-2 其他项目中使用组件库

packages目录下其他项目中通过 pnpm add @tbc/ui 安装依赖,依赖详情为 "workspace:^"

使用组件库

<template>
  <MyButton>自定义组件库</MyButton>
</template>

<script setup>
import { MyButton } from "@tbc/ui"
</script>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981544.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机网络入门】初学计算机网络(八)

目录 1. S-W协议的信道利用率 2. GBN、SR协议的信道利用率 3.术语补充 3.1 滑动窗口协议 3.2 ARQ协议、连续ARQ协议 4. 信道划分介质访问控制 4.1 时分复用&#xff08;TDM&#xff09; 4.2 统计时分复用&#xff08;STDM&#xff09; 4.3 频分复用&#xff08;FDM&a…

JVM基本概念及内存管理模型

一、JVM基本概念 JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;是 Java 程序运行的核心组件。它负责将 Java 字节码转换为特定平台的机器指令&#xff0c;并提供内存管理、垃圾回收、安全性等功能。JVM 的主要功能包括以下&#xff1a; 加载和执行…

Docker 学习(三)——数据管理、端口映射、容器互联

一、数据管理 容器中的管理数据主要有两种方式&#xff1a; 数据卷 &#xff08;Data Volumes&#xff09;&#xff1a; 容器内数据直接映射到本地主机环境&#xff1b; 数据 卷容器&#xff08; Data Volume Containers&#xff09;&#xff1a; 使用特定容器维护数据卷 1.…

解锁Egg.js:从Node.js小白到Web开发高手的进阶之路

一、Egg.js 是什么 在当今的 Web 开发领域&#xff0c;Node.js 凭借其事件驱动、非阻塞 I/O 的模型&#xff0c;在构建高性能、可扩展的网络应用方面展现出独特的优势 &#xff0c;受到了广大开发者的青睐。它让 JavaScript 不仅局限于前端&#xff0c;还能在服务器端大展身手&…

我的ChatGPT怎么登不上?

近期&#xff0c;不少用户反馈在使用ChatGPT时遇到登录困难、连接超时等问题。本文将从技术角度分析常见原因&#xff0c;并提供合规、安全的解决方案&#xff0c;同时结合开发者实际需求推荐实用工具&#xff0c;助您高效应对登录障碍。 ChatGPT登录失败的常见原因 网络环境限…

小米手机如何录制屏幕?手机、电脑屏幕录制方法分享

大家最近有没有遇到想记录手机屏幕操作的情况&#xff1f; 比如精彩的游戏瞬间、有趣的视频教程&#xff0c;或者需要录制屏幕来制作演示材料。小米手机在这方面可是个好帮手&#xff0c;今天就来给你好好唠唠&#xff0c;小米手机如何录制屏幕&#xff0c;以及后续如何处理这…

【jenkins配置记录】

全局工具配置&#xff1a; D:\Program Files\Java\jdk1.8.0_281 D:\Program Files\Git\bin\git.exe E:\allure-2.13.2 2. GIT 3. 定时任务 H 8 * * 1-5 4. 构建触发器 5. 构建后操作 Allure Report 吐血记录&#xff1a;报告路径可以为 workspace 相对路径 6. 系统配置 em…

修改hosts文件,修改安全属性,建立自己的DNS

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

详解LSM树

目录 什么是LSM树 磁盘结构与顺序IO LSM树结构 LSM树的写入 SSTable合并 LSM树的读取 LSM树的删除 总结 什么是LSM树 LSM 树全名日志结构合并树&#xff08;Log-Structured Merge Tree&#xff09;&#xff0c;是一种用于存储和管理数据的树状数据结构&#xff0c;常用…

3d投影到2d python opencv

目录 cv2.projectPoints 投影 矩阵计算投影 cv2.projectPoints 投影 cv2.projectPoints() 是 OpenCV 中的一个函数&#xff0c;用于将三维空间中的点&#xff08;3D points&#xff09;投影到二维图像平面上。这在计算机视觉中经常用于相机标定、物体姿态估计、3D物体与2D图…

Spring Boot集成Minio笔记

一、首先配置MinIO 1、MinIO新建Bucket&#xff0c;访问控制台如图 创建访问密钥(就是账号和密码) 二、集成mino添加Minio客户端依赖 1.maven构建方式在pom.xml引入jar <dependency><groupId>io.minio</groupId><artifactId>minio</artifactI…

github进不去,一直显示错误

1、进入网址Dns检测|Dns查询 - 站长工具 2、复制检测出来的任意一个ip 3、打开电脑的文件夹&#xff1a;C:\Windows\System32\drivers\etc 下的hosts文件下复制这个ip地址 20.205.243.166 4、winr 打开cmd&#xff0c;输入ipconfig/flushdns ipconfig/flushdns出现这个就可以…

【商城实战(2)】商城架构设计:从底层逻辑到技术实现

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab

BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab 目录 BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测Matlab分类效果基本介绍BKA-CNN基于黑翅鸢算法优化卷积神经网络的数据多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目…

Windows下使用ShiftMediaProject方法编译FFmpeg

Windows SDK 8.1版本不支持dxva vp9! 需要10.0.17134.0&#xff01;或者把config编译选项去掉 1.下载源码 https://github.com/ShiftMediaProject 2.创建ShiftMediaProject文件夹 把下载好的源码放入source 3.进入SMP执行 project_get_dependencies.bat 自动下载ffmepg依赖项…

C++ Primer 动态数组

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

第四十一:Axios 模型的 get ,post请求

Axios 的 get 请求方式 9.双向数据绑定 v-model - 邓瑞编程 Axios 的 post 请求方式&#xff1a;

神经网络:AI的网络神经

神经网络&#xff08;Neural Networks&#xff09;是深度学习的基础&#xff0c;是一种模仿生物神经系统结构和功能的计算模型。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;能够通过学习数据中的模式来完成各种任务&#xff0c;如图像分类、语音…

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式

20250304在Ubuntu20.04的GUI下格式化exFAT格式的TF卡为ext4格式 2025/3/4 16:47 缘起&#xff1a;128GB的TF卡&#xff0c;只能格式化为NTFS/exFAT/ext4。 在飞凌的OK3588-C下&#xff0c;NTFS格式只读。 exFAT需要改内核来支持。 现在只剩下ext4了。 linux R4默认不支持exFAT…

FPGA之硬件设计笔记-持续更新中

目录 1、说在前面2、FPGA硬件设计总计说明3、 原理图详解 - ARITX - 7 系列3.1 顶层框图介绍3.2 FPGA 电源sheet介绍&#xff1a;3.2.1 bank 14 和 bank 15的供电3.2.2 bank 0的供电3.2.3 Bank34 35 的供电 3.3 核电压和RAM电压以及辅助电压 4 原理图详解-- Ultrascale ARTIX4.…