使用符号链接在多个 React 应用程序之间共享代码

Posted

技术标签:

【中文标题】使用符号链接在多个 React 应用程序之间共享代码【英文标题】:Sharing Code between Multiple React Applications with Symlinks 【发布时间】:2020-12-31 15:48:43 【问题描述】:

我目前有两个独立的前端应用程序。一个轻量级的移动客户端和一个重量级的管理面板。两者都是用 CRA 创建的。我们对一切都使用 TypeScript。

目前目录结构如下:

root
├── admin (created using create-react-app)
|   ├── node_modules
|   ├── public
|   ├── src
|   │   └── common (symlink)
│   │   └── index.ts
|   ├── package.json
|   └── tsconfig.json
├── mobile (created using create-react-app)
|   ├── node_modules
|   ├── public
|   ├── src
|   │   └── common (symlink)
│   │   └── index.ts
|   ├── package.json
|   └── tsconfig.json
└── common (linked)
    ├── src
    ├── package.json
    └── tsconfig.json

无论出于何种原因,CRA 都不尊重符号链接。就好像没有文件一样。

是否有经批准的方式来做这样的事情?

现在,我们正在使用另一个脚本将文件复制到两个存储库中。我也尝试使用yarn link,但 Typescript 无法正确解析文件(它一直希望看到 javascript)。

【问题讨论】:

尝试将 common 的内容打包到库中,有简单的解决方案,例如 nx nx.dev/react/getting-started/why-nx 【参考方案1】:

有几种不同的方法。 您可以将其打包为库并将所述库导入到您的项目中。该库可以托管在私有或公共 Git 主机上,并在您的 package.json 中引用 Git URL,就像 NPM 包一样。

"dependencies": 
  "your-lib": "git+ssh://git@domain.com:name/repo.git",

这种方法会强制您推送代码并在每次更改时重新安装。如果您的代码经常发生更改,则可能很难处理。

您还可以使用 Lerna 之类的工具将您的代码库组织到一个多包存储库中。 https://github.com/lerna/lerna

【讨论】:

【参考方案2】:

我相信最简单的方法是使用 yarn 工作区 (https://classic.yarnpkg.com/blog/2017/08/02/introducing-workspaces/),为此你需要在根 package.json 中定义依赖项,像这样

"workspaces": [
    "admin",
    "mobile",
    "common"
]

然后您可以使用 yarn install,它应该可以开箱即用。 在您尝试之前,请取消链接 common,以确保它可以正常工作。

此外,您还需要在 common 包上的 adminmobile 中具有依赖关系。

【讨论】:

【参考方案3】:

我正在使用yarn link,它运行良好。不同之处可能在于,我正在完全构建(使用汇总)ts 库(通用)代码。

提示/技巧:

在普通包的tsconfig.json中有"declaration": true 有时如果新的东西没有捡起来,在VSCode中使用Restart TS server 在两个包中运行一些 yarn start 构建监视(对于 tsc-watch 或任何其他构建),这样所有更改都会立即得到 如果ls -ald node_modules/<mypkg> 确实是一个符号链接,则值得检查它,因为任何其他npm install 都可以删除它(纱线似乎更好)

【讨论】:

以上是关于使用符号链接在多个 React 应用程序之间共享代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在主机和来宾机器之间的共享 nfs 目录中映射符号链接目标路径?

在 Firebase 函数和 React 之间共享代码

React 新手:在未链接的组件之间共享状态

React Native Context,如何在多个嵌套文件和组件之间共享上下文

在没有符号链接的情况下跨服务重用数据存储模型

如何在 React-Router 中的路由之间共享状态?