【发布时间】:2019-01-10 13:02:03
【问题描述】:
我们有一个用 React 开发的前端应用程序。 现在我们还想制作一个 react-native 应用程序,但要尽可能重用当前应用程序。
我已经看到在这些情况下经常使用 react-native-web,但是,我们已经开发了我们的应用程序,仅使用 react 并将我们当前的所有组件替换为 react-native-web 组件会花费太多时间(也因为我们使用的是antd组件库)。
我的想法是将所有渲染方法移动到另一个 npm 包(以及需要重写以使用 react-native 的其他部分)并从主包中导入它们。
我想像这样的文件夹结构:
- 根
- 核心 -- 将包含所有可重用的代码
- web -- 将包含所有带有 antd 组件的渲染方法
- native -- 将包含所有带有原生组件的渲染方法
通过这种方式,Web 和原生包将各自拥有自己的 npm 启动和构建脚本。 如何在核心包中并基于平台(在本例中为 Web 或本机)从正确的包中导入渲染部分?
我想我可以使用 lerna 库来分离包和 commonjs 或 requirejs 之类的东西,然后动态导入正确的渲染元素。
您能推荐一些其他有用的工具吗? 或者整个方法是错误的,还有另一种方法可以实现吗?
也就是说,我们如何实现从web包到核心包的依赖注入?
想象一下,我们在核心包中有一个组件 Home:
class Home extends Component {
..
render() {
// somehow import required 'view'
// example: import('path_to_web_package_from_some_global_variable' + '/HomeRender.js');
// There would be a HomeRender.js in 'web' package and another one in 'native' package
}
..
}
【问题讨论】:
-
我如何才能在核心包中并基于平台(在本例中为 Web 或原生)从正确的包中导入渲染部分? - 你最好不应该,因为这不允许对未使用的平台进行树摇动。这些是特定于平台的包,应该依赖于
core,而不是相反。考虑提供一个简短的示例,这些包是什么以及它们如何协同工作。 -
@estus 摇树未使用平台是什么意思?我只想导入特定于“web”或“native”的代码。我添加了一个小样本,说明它的外观
-
为什么不直接将组件移动到
web/native都可以访问的文件夹中并从那里导入它们? -
我只想导入特定于 'web' 或 'native' 的代码 - 你不能这样做。此外,动态
import()是异步的,它将强制组件异步,这不是一件好事。我会根据我对您的包裹外观的理解尝试给出答案。
标签: javascript reactjs react-native