架构-单一代码库-monorepo-lerna(8.0.0):lerna-pnpm-vue3-vite-ts 实践 / 用于管理包含多个软件包(package)的 JavaScript 项目

一、关于Lerna

将大型代码仓库分割成多个独立版本化的 软件包(package)对于代码共享来说非常有用。但是,如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪,并且, 跨越多个代码仓库的测试将迅速变得非常复杂。

为了解决这些(以及许多其它)问题,某些项目会将 代码仓库分割成多个软件包(package),并将每个软件包存放到独立的代码仓库中。但是,例如 Babel、 React、Angular、Ember、Meteor、Jest 等项目以及许多其他项目则是在 一个代码仓库中包含了多个软件包(package)并进行开发。

Lerna 是一种工具,针对 使用 git 和 npm 管理多软件包代码仓库的工作流程进行优化。

二、安装Lerna及 入门

Lerna · 入门及安装

2.1、安装

pnpm add --global lerna

版本:8.0.0

2.2、入门

我们将创建一个新的 git 代码仓库

git init lerna-repo && cd lerna-repo

 我们将上述仓库转变为一个 Lerna 仓库

lerna init

 代码仓库目前应该是如下结构

lerna-repo/
  packages/
  package.json
  lerna.json

三、single pattern && multiple patterns

Getting Started | Lerna

3.1、Passing a single pattern

npx lerna init --packages="packages/*"

 

3.2、Passing multiple patterns

npx lerna init --packages="project1/*" --packages="project2/*"

四、依赖提升 / 使用根目录 node_modules

本文技术栈 pnpm + lerna8.0.0 + vue3 + vite + ts

4.1、创建Lerna仓库

创建一个空的文件夹来作为Lerna仓库,然后在该文件夹下运行以下命令:

npx lerna init

这将会创建一个Lerna仓库,手动在根目录创建packages目录用于存放所有子项目。

4.2、创建子项目

4.2.1、packages目录下创建app-base目录作为子项目目录

packages/app-base

4.2.2、在app-base目录创建vue-ts子项目

pnpm create vite app-base --template vue-ts

创建项目后,在子项目pnpm install安装项目依赖 

4.3、子项目测试依赖提升

根目录安装element-plus、lodash在子项目测试,查看是否成功

pnpm add lodash

pnpm add @types/lodash

pnpm add element-plus

main.ts 配置 element-plus

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')

4.4、app.vue使用lodash、element-plus测试

<script setup lang="ts">
import { isEmpty } from 'lodash'
console.log('isEmpty', isEmpty(''))
</script>

<template>
  <div>
    <el-button>haha</el-button>
  </div>
</template>

<style scoped>
</style>

lodash和element-plus均可正常使用,说明node_modules依赖提升成功

五、组件提升

使用pnpm-workplace的方法

架构-单一代码库-monorepo-pnpm-workspace:基本使用 / 一个代码仓库中包含了多个软件包(package)并进行开发-CSDN博客

六、子项目更多lerna配置

在Lerna仓库下创建子项目。在packages目录下执行以下命令:

npx lerna create app-base

执行前目录

执行后目录 

执行前 package.json

{
  "name": "app-base",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "^3.3.8"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.5.0",
    "typescript": "^5.2.2",
    "vite": "^5.0.0",
    "vue-tsc": "^1.8.22"
  }
}

执行后 package.json

此时已经增加了一些lerna的配置项,详细用法后续补充。

{
  "name": "bar",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "bar": "^0.1.2",
    "vue": "^3.3.8"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.5.0",
    "typescript": "^5.2.2",
    "vite": "^5.0.0",
    "vue-tsc": "^1.8.22"
  },
  "description": "> TODO: description",
  "author": "[email protected] <[email protected]>",
  "homepage": "",
  "license": "ISC",
  "main": "lib/bar.js",
  "directories": {
    "lib": "lib",
    "test": "__tests__"
  },
  "files": [
    "lib",
    "package.json",
    "README.md"
  ],
  "publishConfig": {
    "registry": "https://registry.npmmirror.com/"
  }
}

五、根目录package.json配置

待补充

六、过程记录

记录一、lerna8.0.0需要设置软链接吗

AI回答

在Lerna 8.0.0中,不需要设置软链接。Lerna 8.0.0使用了新的默认行为,即通过Yarn的workspace功能来管理项目中的所有包。这个功能已经内置了链接包的功能,因此不需要手动设置软链接。

在Lerna 8.0.0之前,使用软链接是一种常见的方法来管理项目中的包。软链接允许你将包目录链接到全局安装的包目录,这样你就可以在项目中使用全局安装的包。然而,在Lerna 8.0.0中,这种做法已经被Yarn的工作空间功能所取代。

如果你之前使用软链接管理Lerna项目中的包,升级到Lerna 8.0.0后,你可以移除软链接的设置,并使用Yarn的工作空间功能来管理你的包。

pnpm同理

记录二、Lerna 和 pnpm workspaces区别

AI回答

Lerna和PNPM Workspaces都是用于管理多个相关项目的工具,但它们之间有一些区别。

Lerna是一个JavaScript工具,它允许您在单一存储库中管理多个相关的npm软件包。Lerna提供了一种简化版本的monorepo工作流程,允许您在多个软件包之间共享代码和依赖项。Lerna使用Git和npm来管理包,并允许您通过npm或Yarn进行安装和启动项目。

PNPM Workspaces是一个npm客户端,它允许您在单个存储库中管理多个npm软件包,但它与Lerna不同,它不需要将所有代码放在单个存储库中。PNPM Workspaces使用单个node_modules文件夹来管理所有软件包的依赖项,并使用软链接来确保所有软件包都可以共享相同的依赖项。相比于Lerna,PNPM Workspaces更加轻量级,更容易使用,但需要更多的手动配置来使其正常工作。

总的来说,Lerna适用于需要在一个大型存储库中管理多个相关软件包的项目,而PNPM Workspaces适用于需要更灵活的存储库结构的项目。无论您选择哪种工具,它们都可以帮助您更轻松地管理多个相关软件包。

记录三、根目录安装依赖(node_modules)

pnpm add lodash -w

 pnpm add lodash --workspace-root

记录四、lerna失效内容

本文使用lerna版本,8.0.0

序号 方法 备注
1 "useWorkspaces": true
2 npm link
3 lerna bootstrap
4 npx lerna link

参考链接

微前端-qiankun:vue3-vite 接入 vue3、nuxt3、vue2、nuxt2等子应用_vue3乾坤-CSDN博客

pnpm:基础使用-CSDN博客

多工程管理方式 - lerna的使用_lerna bootstrap-CSDN博客

【Lerna 基本使用】-CSDN博客

lerna+yarn workspace+monorepo项目的最佳实验_lerna yarn-CSDN博客

Lerna 中文教程详解-CSDN博客

现代前端工程化-基于 Monorepo 的 lerna 模块(从原理到实战)-CSDN博客

Lerna入门与实战-CSDN博客

projectTest_lerna: 个人开发练习项目,熟悉lerna管理多项目应用,使用koa2搭建服务器,vite vue3完成前端项目 - Gitee.com

GitHub - sanlangguo/lerna-vue3-dom

Vue3+Vite+Lerna+Monorepo微前端实践: Vue3+Lerna+Monorepo:落地大型SaaS应用的微前端解决方案

package.json · study-demo/pnpm-lerna-workspace - Gitee.com

大仓实践录:Lerna/NPM/Yarn Workspace 方案组合和性能对比-腾讯云开发者社区-腾讯云

来聊一聊前端工程师会涉及的monorepo管理工具lerna_哔哩哔哩_bilibili

Using pnpm with Lerna | Lerna

Workspace | pnpm

Lerna · 是一个管理工具,用于管理包含多个软件包(package)的 JavaScript 项目 | Lerna 中文文档

架构-单一代码库-monorepo-pnpm-workspace:基本使用 / 一个代码仓库中包含了多个软件包(package)并进行开发-CSDN博客

Getting Started | Lerna

lerna 中文文档

猜你喜欢

转载自blog.csdn.net/snowball_li/article/details/129700515