monorepo 项目中 node 后台依赖外部公共 package 运行和打包出错的问题

前提条件

  • monorepo 解构
  • node 项目子包
  • 使用外部公共模块
  • 使用 tsc 打包项目

症状

  • 运行后 dist 打包目录结构从子包根目录变为全局根目录
  • 打包依赖项丢失

解决办法猜测

想到了三种解决方法

  1. 外部公共模块发布为 npm 包
  2. 解决 dist 文件目录混乱问题
  3. 使用构建工具打包

其中第一条是肯定可以的,只是办法有点繁琐,需要每次改动公共模块后都打包发布代码,项目并不是工具类项目,不太好这样做。
第二条,目前没找到办法,否则这种是最方便的,需留意以后是否有办法解决。
第三种也不太行,因为服务端项目大都需要保持原结构,打包成一个文件可能会出 bug。

最终解决方案是 build 时把公共依赖复制了一份到对应 dist,然后更改 dist 目录下的 package.json 内的依赖版本为对应目录的地址

  • 2023-2-22
    新发现:子包依赖移动到root包下,webpack就会把公共依赖打包进来,而如果是子包下有的依赖则是直接使用require的,猜应该是配置的external把子包所有的依赖都囊括进去了。

  • 2023-2-25

    目前是使用第三种方案,使用构建工具打包。
    tsconfig 添加 paths,jest 添加 moduleNameMapper,保证开发和测试的别名映射正确。
    这种方式好在公共包不再需要打包了,可以直接使用 ts 的源码,不用每次更新都要打包一次;
    就是需要注意打包后的代码是只有一个文件了,项目目录里的各种层级都已经没了,需要注意该问题。

  • 2023-3-1

    原来 nestjs 官方是支持 monorepo 和库建立的,有其配套解决方案,见官方文档
    Libraries
    Workspaces
    不过这种方式需要保持src在项目根目录,才能使用tsc版的start:dev,否则还是需要webpack帮助打包

评论

0 / 800
全部评论()