技术选型-架构

228 阅读5分钟

基于 pnpm monorepo 项目工程设计,字节框架传授多场景项目架构要诀

你的过往项目中,项目和工程化架构有没有做过,有没有了解 monorepo 框架方案?

传统架构概述

  • 组件库、用户中心、脚手架、图表库、工具库
  • 独立项目结对,所有项目都是分开的 github 仓库
  • 技术栈独立
  • 规范化、自动化相关处理是项目间割裂
  • 依赖管理,版本本难统一管理
  • 部署、docker, docker compose, 自动化脚本很难形成统一

monorepo 框架

  • 混合项目结构,所有相关的工程形成子包进行管理
  • 技术栈高度集成(团建基础项目、业务项目、子服务、技术栈)
  • 规范化、自动化,流量在项目间共享
  • 依赖管理,版本本统一

monorepo 架构方案

  • 包管理, pnpm pnpm workspace、yarn workspace、lerna
  • 构建缓存
  • 增量构建,nx、 turbo

pnpm 优势

npm、yarn、cnpm

  • 链接机制
  • 缓存机制,寻址
  • 原生支持 workspace
  • 磁盘占用少

中心化思想解决依赖复用问题

传统架构到 monorepo 框架进展

附段1:传统架构基础痛点(主要缺陷)

  • 代码分散化,将多个关键项目统一到一个 github 仓库
  • 工具引入,pnpm workspace
  • CI/CD 重构

附段2:具体的 monorepo 框架

  • 公共技术基础设施
  • pnpm, turbo,解决子包与主包关系

附段3:自动化的构建流程优化

  • 打包方案:vite, webpack, rollup, parcel, sup, esbuild, swc, rollupdown
  • 构建流程优化,依赖关系(循环依赖引入),哪些包需要重构构建
  • 发布:npm publish, docker 镜像
  • 监控和测试

关键性卡点 (步骤)

  1. 项目统一
  2. pnpm 配置
  3. 依赖管理
  4. 统一化脚本
    • 工程化脚本:package.json 中的 script
    • scripts 文件夹

面试上的表述:我主导了工程化架构的重构工作,基于pnpm workspace 统一化工程组织,统一自动化、流程、规范化相关内容,子包管理更清晰基于tsup构建团队基建包,业务架构我主导通过为前端机制来实现,统一化主应用与子应用状态管理细节

屏幕截图 2025-01-19 211738.png

组件库、脚手架、业务系统工程化基于 monorepo 架构设计有什么实践经验,详细讲讲?

  • 组件库,工具库、图标库
  • 脚手架,基于类形态的项目模块
  • 业务系统
  • 服务端脚手架

负责过项目前期打包构建流程设计么?有了解哪些打包构建方案?(初级)

  • babel
  • tsc
  • rollup、parcel
  • tsup
  • vite、webpack

typescript compiler编译ts工具,将ts编译成js tsconfig.json

特点

  • 专注于ts编译
  • 强类型检查
  • 单文件编译

使用场景

  • 早期项目,没又复杂的编译需求
  • 工具类的开发、后端node

缺点

  • 仅支持ts编译,常规js编译、类型输出.d.ts
  • 不能代码拆分、模块打包
  • 性能差,大规模的项目用它编译性能堪忧
  • 配置繁琐,tsconfig,有时需要借助babel、postcss编译其他内容

rollup

随着项目的复杂度提高,tsc无法满足需求,这个时候希望有一个开箱即用的0配置,rollup成了工具库的首选构建打包方案

  • tree-shaking
  • 简化配置,tsc、webpack
  • 丰富的插件生态,将功能的生态构建工作交给全世界开发者,框架插件规则制定者

使用场景

  • ui库
  • 工具库
  • 按需导入场景

缺点

  • 大型业务项目,vite和webpack适合
  • 热更新
  • 性能方面

tsup

go,esbuild, tsup

特点

  • 零配置,默认支持ts
  • 性能非常好
  • 多格式输出
  • 代码的动态导入
  • 代码分割

使用场景

  • 工具库
  • 脚手架

缺点

  • 业务构建不推荐
  • 插件生态没rollup繁荣

vite

  • 整合了esbuild的rollup的现代构建工具

特点

  • 开发环境基于 esbuild
  • 按需加载
  • 模块替换HMR
  • 生产构建rollup

使用场景

  • 大型业务系统
  • vue、react业务系统

缺点

  • 生态
  • 低版本兼容 lagecy
  • 微信网页开发,本地开发环境,es模块

不同形态前端项目打包构建有什么具体设计思路和实践经验?(中级)

工具库

  • 脚手架
  • 函数库 选择tsc、rollup、tsup

组件库

选择rollup、tsup

业务系统

选择vite、webpack

站在leader的角度,从原理层面的分析常规与新兴的构建方案异同,详述rust重构工具链的优势?(专家)

技术原理

  • 常规的:
    • 原理 js,webpack、tsc工具见AST无法共享
    • 生态成熟,兼容性
    • 性能瓶颈
  • 需要突破的是语言
  • python、go

基于rust的工具

  • swc
  • turbo
  • oxc

拥抱新兴构建工具的目的

  • 性能
    • 单线程瓶颈
    • 大型项目的收件,webpack4十来分钟
  • 统一化
    • oxc编译、lint、format
    • 内存安全稳定性
    • 社区繁荣

除了常规css还有哪些方案?(初级)

  • css 简单好理解,复用性底,容易冲突,无法支持动态语法
  • sass、less 变量定义、编译处理
    • 学习曲线,需要进一步封装,css hack(兼容性、厂商前缀)
    • postcss
  • css module 和css一样,针对ts类型支持不完善,定制化、复用性高的需求无法满足
  • atomic css/utility-first css(tailwindcss)
    • 非常快,编译时,对于运行时的开销非常小
    • 不写css全部写类名
  • cssinjs(style-conponemts、emotion)
    • 运行时,无需编译,复用性高
    • 运行时的反噬性能差
  • scoped css
    • 简单好理解,解决冲突问题
    • 复用性差
  • BEM,写法,不是一个技术 (下划线)

请举例 css、cssinjs、tailwindcss的使用技巧与方案价值体现?(中级)

module css

  • 变量复用
    • css3 变量 --primary:pink,tokens颜色色值定义
:root{
--color-primary:pink
--bg-primary:white
}
  • BEM 命名规范,header-ssdf__sdfsdf
  • flex、grid布局

cssinjs

  • 动态样式
  • 样式隔离,类名自动生成
  • 嵌套

tailwind

  • 原子化设计,归为类名