JS/TS多项目代码复用:如何便捷复用units模块?求分步方案
代码复用方案探索
可能还有我没发现的解决方案,我试过很多方法:搭配npm link的JS/TS、Git子模块、tsconfig paths、符号链接、npm/pnpm/yarn工作区、npm pack & npm link、package.json exports、package.json commonjs/module,还有nx(nrwl)/lerna,但每种都有问题,目前没找到便捷的标准方案。
问题描述
作为开发者,我的需求是:
- 编写可复用的代码
- 启动新项目时仅引入所需代码
- 多项目间共享代码且支持同步更新
- 需要清晰的分步实现指引
- 使用JetBrains IntelliJ IDEA作为开发工具
同时我有明确的排斥点:
- 不想因包管理、配置、命令等额外操作打乱代码结构或拖慢开发节奏
- 因为有数十个项目,IDE的搜索、替换等操作性能会受影响,因此不能使用单体仓库(monorepo)
代码结构
/unit_domain_project_1 .git package.json /src /units # 可复用库 /meter.ts # 核心模块 /meter.test.ts # 单元测试文件 /nodejs # 仅Node.js环境可用的TS代码(无法在浏览器编译) /browser # 仅浏览器环境可用的TS代码(无法在Node.js编译) /furniture_project_2 .git package.json /src table.ts # 此处需要复用`units`模块 /building_project_3 # 嵌套依赖示例 /src house.ts # 此处需要复用`table`以及`units/meter`
当前临时方案
目前找到的最优临时方案是使用符号链接,执行命令如下:
ln -s $ABSOLUTE_PATH_TO_PROJECT_1/units
但该方案在Docker环境下需要额外编写Shell脚本完成代码复制(例如copy ./linked_code_source ./linked_code),增加了复杂度。
核心问题
如何便捷复用units模块?(需提供分步实现指引)
其他方案为何不理想
git submodules:每个项目都要单独执行git pull/push操作,流程繁琐symlink:Docker环境下需要额外编写Shell脚本处理代码复制,无法直接复用链接tsconfig paths:不支持跨父目录的相对路径配置,IDE无法正常解析依赖package.json exports: {'*./'}:与package.json commonjs/module配置冲突,必须将TypeScript编译为JS模块,还会频繁遇到依赖和路径解析问题,调试耗时极长npm link:Docker环境下无法正常工作,需要额外Shell脚本适配npm/pnpm/yarn workspace:依赖特定npm/node版本,采用符号链接或文件复制的方式,无法自动同步更新,需要编写post_install脚本并重新构建包npm pack & npm link:需要自行编写更新脚本,无法实现自动同步nx(nrwl)/lerna:必须遵循其指定的目录结构,还要强制使用构建命令,需将代码拆分为独立库并配置package.json,引入了不必要的复杂度
内容的提问来源于stack exchange,提问作者Yevhenii Kamenskyi
相关产品推荐
相关产品推荐

