面试官问你,你了解前端项目工程化monorepo吗?

4,304 阅读3分钟

背景

有一天下午,小明打开某软件,想帮HR刷一下KPI:

image.png

image.png

面试官:了解过monorepo吗? :额,额额...

小明886!!!

了解一下,至少到时候还能侃几句,至少有个印象,那么下面plz👇

👇
👇
👇

monorepo

monorepo字面意思是由monorepo组成的,mono(monolithic)的意思:独立的,单一的,整体的repo(repository)的意思是:仓库

image.png

注释:monorepo这个工具用来管理多个不同项目的单一库,项目与项目之间可能有相关联系,但是逻辑又是独立互不影响。

前端Monorepo这个东西其实本质上来说,就是指的是将『一个项目的所有前端代码存储在一个统一的代码仓库中』的开发的模式。

传统的一般的前端开发,就是一个项目去npm去下载不同的库来辅助主项目,而npm中的单个库都是独立的代码仓库,当需要安装的npm包越来越多的时候,我们需要去各个仓库里面维护管理多个独立的库就变得越来越困难,越来越庞大。

那么monorepo就是思想就是,将多个应用程序、库和模块组织在同一个代码仓库里,使用统一的版本控制系统进行管理。

常见的monorepo工具框架

  • Lerna
  • nx
  • Yarn Workspaces
  • ...

这些工具提供了管理monorepo结构,流程为:安装构建发布,提高了开发效率和代码质量。

接下来用一个案例项目来解说一下。

项目解说

1、首先创建一个pnpm-workspace-monorepo文件夹;

2、确保安装了包管理工具pnpm

3、在项目文件目录下执行pnpm init

image.png

4、去pnpm官方文档,复制一段配置过来到项目根目录(根目录创建一个pnpm-workspace.yaml文件);

image.png

这个文件做什么用的呢?

这个pnpm-workspace.yaml是: (1)、用来定义workspace工作空间的根目录的; (2)、从这个workspace工作空间包含/排除某些目录(默认情况是包含所有子目录);

image.png

5、去api文件下下载一个axios

安装pnpm add axios;

image.png

分别新建base.js,user.js,index.js.

// 封装axios的base.js

import axios from 'axios';

let Axios = axios.create({
  baseURL: '/',
})

export default Axios

// user.js 请求接口

import Axios from "./base";

export const getUser = (data) => Axios.get(data);

// index.js

export * from './user'; // user.js里面的东西全暴露出来为*

image.png

6、在packages目录下,创建一个vue项目;

npm create vite去跑,

image.png

image.png

7、跨项目安装依赖包

vite-project项目下面,下载刚刚我们单独一个文件夹做的api的包,

第一种安装方法

pnpm add @test/api

第二种安装方法:

package.json的开发依赖里面这样写:

{
  "name": "vite-project",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "^3.4.21"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^5.0.4",
    "vite": "^5.2.0",
    "@test/api": "workspace:*" // 直接在引用里面写然后指定为`workspace:*`
  }
}

至于这里的"@test/api": "workspace:*"的的意思就是说,指定依赖项是从这个工作区里面去找的那个包,安装过来,平常一般我们这里的话就是写版本号嘛,

但是monorepo这里就是无论啥版本,去安装现在工作区(workspace)里面的这个@test/api的现有版本,不需要每次都去手动更改依赖项的版本号这个意思。

pnpm install 一下,就可以看到vite-project的vue项目就有这个api的包了。

image.png

8、在项目里面引入公共包

在上一步骤做完之后,就安装完成了,然后就可以在项目中引用去使用:

<template>
  vue3 + vite
</template>

<script setup lang="ts">
import { getUser } from '@test/api';

console.log(getUser)
</script>

打印出来如下:

image.png

说明已经在项目中引入公共包是,引入成功了,最后就可以在页面中调用接口去请求数据那些了。

9、编译打包运行到服务器上

npm run build

image.png

得到dist文件夹,最后用vscode插件live-server本地服务器跑起来。

image.png

完成!