alibaba / ice

🚀 ice.js: The Progressive App Framework Based On React(基于 React 的渐进式应用框架)
https://ice.work
MIT License
17.85k stars 2.1k forks source link

icejs 项目支持 pnpm 启动 #4979

Closed ClarkXia closed 2 years ago

ClarkXia commented 2 years ago

由于 icejs 的运行时依赖均为 Phantom dependencies(幽灵依赖),导致在使用 pnpm 时必须添加 --shamefully-hoist 进行提升 期望支持 pnpm i 的方式进行安装

方案设计

需要提升的包

Core 依赖

插件 plugin-react-app

-[x] query-string

插件 plugin-request

插件 plugin-store

插件 plugin-icestark

插件 plugin-dev-inspector

插件 plugin-keep-alive

插件 plugin-rematch 不再维护

- [ ] react-redux - [ ] @rematch/core

插件 plugin-router

方案一

将运行时 Phantom dependencies 收敛到 @ice/runtime 中,如果使用 pnpm 只需要在项目中添加 @ice/runtime 这个依赖包即可。

@ice/runtime 可预置进项目的 Dependencies。

优点:天然隔离 Phantom dependencies 的问题,用户无需过多配置; 缺点:需要修改运行时依赖代码;需要单独维护一个包,所有依赖从 @ice/runtime 导出(需要考虑成本);三方运行时依赖不好处理。

方案二

提供一份 .npmrc 配置,只将运行时 Phantom dependencies 幽灵依赖提升至当前项目 node_modules。

优点:不需要修改运行时代码。 缺点:运行时依赖可能跟随配置变化,依赖变更会影响需修改现有配置;配置文件需要用户手动维护。

maoxiaoke commented 2 years ago

该 PR 对 ice.js 2.x 存在较多不可预知的不稳定因素,并可能因此引入其他非需要依赖。因此,不打算为 icejs 2.x 提供功能完备的 pnpm 支持。

对于需要使用在 ice.js 2.x 使用 pnpm 的用户,我们建议您使用 shamefully-hoist。在 ice.js 项目下新增 .npmrc 文件,并配置:

shamefully-hoist=true

ice.js 3.x 将默认支持 pnpm

ice.js 3.x 将默认支持 pnpm,欢迎您的关注。