news 2026/4/29 6:20:46

【实践】Monorepo 工程化:沉淀可复用的配置规则

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【实践】Monorepo 工程化:沉淀可复用的配置规则

一、背景介绍

在上次完成最小可用 Vue Monorepo 之后,我们遇到一个关键问题:配置一旦被复制成 N 份,就不再是统一规范,而是会各自独立演化的副本

Monorepo 提供了更优雅的方案:把配置本身当作 npm 包发布到 workspace 内部,其他包通过继承这些配置来生效。例如 TypeScript 的 extends、ESLint 的 import flat config、函数工厂(vitest 预设)。

这样可以做到:升级配置只改一个地方,所有包同步生效。这才是 Monorepo 真正的杠杆所在——不是更快地构建,而是更低成本地维护规范

二、方案分析

本次主要解决“好协作”问题,让多人/多包开发在同一套规则下进行,并把这些规则沉淀成可复用的 package。

将 ESLint、TypeScript、Vitest 三类配置从“每个包各复制一份”,改为“通过依赖一份共享包来继承”。

2.1 整体方案

  1. 新增 3 个内部基础包
    • @repo/tsconfig:所有包的 TS 配置基线
    • @repo/eslint-config:所有包的 ESLint 规则基线(flat config)
    • @repo/vitest-preset:所有包的 Vitest 预设工厂
  2. 为现有 3 个包接入基础设施
    • apps/webpackages/uipackages/utils从共享包继承配置
    • packages/utilspackages/ui补充单元测试
    • 提供统一脚本:pnpm lint/pnpm typecheck/pnpm test/pnpm format
  3. 根目录补充提交侧守护
    • Prettier + EditorConfig:统一代码格式
    • husky + lint-staged:commit 前自动 lint 改动文件
    • commitlint:约束提交信息风格

三、实操步骤

步骤 1:共享 TypeScript 配置(@repo/tsconfig)

1.1 包结构
packages/tsconfig/ ├── package.json ├── base.json # 通用基线 ├── vue.json # Vue 项目变体 └── node.json # Node 项目变体
1.2 package.json
{"name":"@repo/tsconfig","version":"0.0.0","private":true,"files":["base.json","vue.json","node.json"]}

注意:这个包没有任何代码入口,只是一组 JSON 文件的集合。pnpm 通过 workspace 链接将它放进消费者的 node_modules,TypeScript 的 extends 通过 Node resolution 找到。

⚠ 注意:files是发布/共享 npm 包时的白名单配置,用来精确指定哪些文件/文件夹会被包含在最终发布的包里,未在列表中的文件默认不会被打包发布。

1.3 base.json(通用基线)
{"$schema":"https://json.schemastore.org/tsconfig","compilerOptions":{"target":"ES2022","module":"ESNext","moduleResolution":"Bundler","lib":["ES2022"],"strict":true,"noUncheckedIndexedAccess":true,"noImplicitOverride":true,"esModuleInterop":true,"resolveJsonModule":true,"isolatedModules":true,"skipLibCheck":true,"verbatimModuleSyntax":true,"forceConsistentCasingInFileNames":true,"useDefineForClassFields":true}}

几个有意为之的选择:

  • strict: true+noUncheckedIndexedAccess:进一步收紧类型安全
  • moduleResolution: "Bundler":现代打包器(Vite/esbuild)通用方案
  • verbatimModuleSyntax: true:强制 import/export 语法精确,配合 ESLint 可以发现混用 type/value 的问题
  • isolatedModules: true:保证每个文件可被独立转译,是 esbuild/SWC 的前置条件
1.4 vue.json 与 node.json

vue.json(在 base 基础上加 DOM 相关 lib)

{"extends":"./base.json","compilerOptions":{"jsx":"preserve","lib":["ES2022","DOM","DOM.Iterable"]}}

node.json(在 base 基础上加 Node 类型)

{"extends":"./base.json","compilerOptions":{"lib":["ES2022"],"types":["node"]}}

步骤 2:共享 ESLint 配置(@repo/eslint-config)

ESLint 9 已经全面切到 flat config,这是当前主流,新建项目应直接使用 flat。

2.1 包结构
packages/eslint-config/ ├── package.json ├── base.js # 通用 TS/JS 规则 └── vue.js # 在 base 之上叠加 Vue 规则
2.2 package.json 关键设计
{"type":"module","name":"@repo/eslint-config","exports":{"./base":"./base.js","./vue":"./vue.js"},"dependencies":{"@eslint/js":"^9.13.0","eslint-config-prettier":"^9.1.0","eslint-plugin-vue":"^9.30.0","globals":"^15.11.0","typescript-eslint":"^8.12.0","vue-eslint-parser":"^9.4.3"},"peerDependencies":{"eslint":"^9.0.0"}}

关键点:

  • 把 ESLint 插件作为 dependencies:消费包不必各自安装一堆插件,只需依赖@repo/eslint-config即可
  • ESLint 本身放 peerDependencies:让消费方决定 ESLint 版本,避免多版本共存
  • 这是“配置即依赖”的核心模式:配置包负责规则版本管理,消费包只关心继承
2.3 base.js
importjsfrom"@eslint/js";importtseslintfrom"typescript-eslint";importprettierfrom"eslint-config-prettier";
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 6:20:29

AssetRipper终极指南:从Unity游戏文件中提取资源的完整教程

AssetRipper终极指南:从Unity游戏文件中提取资源的完整教程 【免费下载链接】AssetRipper GUI Application to work with engine assets, asset bundles, and serialized files 项目地址: https://gitcode.com/GitHub_Trending/as/AssetRipper 你是否曾遇到过…

作者头像 李华
网站建设 2026/4/29 6:19:26

egergergeeert实战案例:用‘fantasy anime girl’提示词生成系列化角色图

egergergeeert实战案例:用fantasy anime girl提示词生成系列化角色图 1. 创作背景与工具介绍 egergergeeert是一款专为图像创作设计的文生图工具,通过简单的提示词输入就能生成高质量的视觉内容。这套工具特别适合需要快速产出角色设计、概念草图或宣传…

作者头像 李华
网站建设 2026/4/29 6:19:23

Javascript提高:国际化 API(Intl 对象)详解-由Deepseek产生

国际化 API(Intl 对象),是 ECMAScript 国际化规范提供的原生工具,用于处理日期、时间、数字、货币、列表、相对时间、复数规则等与语言文化相关的格式化。它的最大优势是无需第三方库,且能自动适配不同地区&#xff08…

作者头像 李华
网站建设 2026/4/29 6:08:50

一套键鼠操作两台电脑

解决了什么问题? 当我们需要在台电脑上进行文件传输,工作使用键盘和鼠标时,频繁的切换鼠标和键盘异常繁琐,并且会占用过多的空间,这是我们不想看到的。今天的分享是提出两套解决方案,来解决多套键鼠占用空…

作者头像 李华
网站建设 2026/4/29 6:07:28

D13: 文化建设:鼓励实验,容忍失败

文章目录 D13: 文化建设:鼓励实验,容忍失败 🎯 为什么这个话题重要? 1. AI 工具的特性决定了它需要试错空间 2. 管理者的态度直接决定了团队的实验意愿 3. 容忍失败是吸引 AI 人才的软实力 核心内容 小节 1: 理解"容错"文化的三层含义 小节 2: 建立"低风险…

作者头像 李华