跳转到内容

Monorepo

刀刀

8/8/2025

0 字

0 分钟

现在在 monorepo 中,除了前面的 reactivityvue 两个包,我们再新增一个 shared 包,用于存放一些公共的工具函数,给其他包导入使用。他们配置分别如下:

  • reactivity

    js
    {
      "name": "@vue/reactivity",
      "version": "1.0.0",
      "description": "响应式模块",
      "main": "dist/reactivity.cjs.js",
      "module": "dist/reactivity.esm.js",
      "files": [
        "index.js",
        "dist"
      ],
      "sideEffects": false,
      "buildOptions": {
        "name": "VueReactivity",
        "formats": [
          "esm-bundler",
          "esm-browser",
          "cjs",
          "global"
        ]
      }
    }
    js
    export function fn (a, b) {
      return a + b;
    }
  • vue

    js
    {
      "name": "vue",
      "version": "1.0.0",
      "description": "Vue总包",
      "main": "dist/vue.cjs.js",
      "module": "dist/vue.esm.js",
      "files": [
        "dist"
      ],
      "sideEffects": false,
      "buildOptions": {
        "name": "Vue",
        "formats": [
          "esm-bundler",
          "esm-browser",
          "cjs",
          "global"
        ]
      }
    }
    js
    export function isObject (value) {
      return value !== null && typeof value === 'object'
    }
  • shared

    js
    {
      "name": "myshared",
      "version": "1.0.0",
      "description": "分享模块",
      "main": "dist/shared.cjs.js",
      "module": "dist/shared.esm.js",
      "files": [
        "index.js",
        "dist"
      ],
      "sideEffects": false,
      "buildOptions": {
        "name": "VueShared",
        "formats": [
          "esm-bundler",
          "esm-browser",
          "cjs",
          "global"
        ]
      }
    }
    js
    export function isObject (value) {
      return value !== null && typeof value === 'object'
    }

现在 reactivity 模块想要引用 shared 模块的方法,除了 import { isObject } from '../../shared',还可以 import { isObject } from '@vue/shared'。但是这么导入的话会报错,找不到模块,因为 @vue/shared 模块并没有被安装。

如果直接 pnpm i @vue/shared --filter @vue/reactivity,会把 Vue 官方的包也安装进去,这并不是我们想要的。如果想要安装本地的包,需要添加 --workspace 标记。

sh
pnpm i @vue/shared --workspace --filter @vue/reactivity

注意

--workspace 标记表示在当前工作区安装包,--filter 标记表示在指定的包中安装包。

运行完毕后 reactivity 模块下的 package.json 文件中会多出以下内容:

json
{
  "dependencies": {
    "@vue/shared": "workspace:^"
  }
}

表示 reactivity 模块依赖 @vue/shared 模块,并且版本是 workspace:^,表示在当前工作区中找到 @vue/shared 模块。不过会出现 TypeScript 报错,因为 @vue/shared 模块并没有定义类型声明文件,所以需要手动添加类型声明文件。

tsconfig.json 中添加以下内容:

json
{
  "compilerOptions": {
    "target": "ESNext", // 指定 ECMAScript 目标版本
    "module": "ESNext", // 指定模块代码生成规范
    "moduleResolution": "node", // 指定模块解析策略
    "outDir": "dist", // 指定编译输出的目录
    "resolveJsonModule": true, // 允许导入 JSON 文件
    "strict": false, // 关闭严格模式
    "lib": ["ESNext", "DOM"], // 指定要使用的库文件
    "paths": { 
      "@vue/*": ["packages/*/src"] 
    }, 
    "baseUrl": "./"
  }
}

现在就可以在 reactivity 模块中使用 @vue/shared 模块了。