如何将 React Router 与 Electron 一起使用?

Posted

技术标签:

【中文标题】如何将 React Router 与 Electron 一起使用?【英文标题】:How to use React Router with Electron? 【发布时间】:2016-07-30 01:26:08 【问题描述】:

使用this boilerplate 作为参考,我创建了一个Electron 应用程序。它使用 webpack 来打包脚本并使用 express server 来托管它。

Webpack 配置实际上与 this 和服务器 this 相同。

Electron 的脚本加载:

mainWindow.loadURL('file://' + __dirname + '/app/index.html');

并且 index.html 会加载服务器托管的脚本:

<script src="http://localhost:3000/dist/bundle.js"></script>

我运行electron index.js 来构建应用程序并运行node server 来启动使用webpack 捆绑脚本的服务器。

它工作正常,我的 React 组件 App 已安装。但是我如何将 react-router 集成到其中呢?

我以与在浏览器应用程序中相同的方式实现它。我收到此错误:

[react-router] Location "/Users/arjun/Documents/Github/electron-app/app/index.html" did not match any routes

它以文件路径为路径。浏览样板代码并没有帮助。我错过了什么?

【问题讨论】:

得到完全相同的东西。你找到解决方案了吗,@arjun-u – 还是你只是选择了 hashHistory? 我使用了 hashHistory。 【参考方案1】:

另一种选择是改用 hashHistory。实际上,在您引用的 repo you can see that they're using hashHistory 中,尝试一下并发回怎么样?

【讨论】:

HashRouter 已被弃用,所以我选择了 Niekert 的回答。 github.com/ReactTraining/react-router/blob/master/packages/… HashRouter 在 2019 年不会被弃用。【参考方案2】:

我正在使用 React Router v4 并且不想回退到 HashRouter,所以我通过以下方式解决了它:

import  Redirect, BrowserRouter  from 'react-router-dom';

const App = () => (
  <BrowserRouter>
    <div>
      window.location.pathname.includes('index.html') && <Redirect to="/" />
    </div>
  </BrowserRouter>
);

【讨论】:

您的解决方案有效,但重新加载电子会导致空白页。这在“生产”中不是问题,但在开发中我经常需要重新加载。它发生在你身上吗? 在加载应用程序方面工作,但未加载所有导入的资产(图像/视频)!【参考方案3】:

this 回答时的最佳选择是使用MemoryRouter,为我工作:)

【讨论】:

重新加载页面会丢失状态【参考方案4】:

(当前)react-router docs say:

一般来说,如果你有一个响应请求的服务器,你应该使用 ,如果你使用的是静态文件服务器,你应该使用

Electron 应用基本上是一个静态文件服务器。

MemoryRouter 也可以工作,只要所有路由都来自应用程序的 React 部分。只有当您想从浏览器进程导航到特定页面时,它才会下降,例如您想弹出一个新窗口并直接导航到“常规首选项”页面。在这种情况下,您可以使用 HashRouter:

prefsWindow.loadURL(`file://$__dirname/app/index.html#/general-prefs`);

我认为没有办法使用 MemoryRouter(来自浏览器进程)来做到这一点。

【讨论】:

【参考方案5】:

必须将BrowserRouter 替换为HashRouter

import 
  HashRouter,
  Route
 from "react-router-dom";

然后在我的index.js 或 Electron 应用程序的入口文件中,我有这样的内容:

<HashRouter>
  <div>
    <Route path="/" exact     component= Home  />
    <Route path="/firstPage"  component= FirstPage  />
    <Route path="/secondPage" component= SecondPage  />
  </div>
</HashRouter>

然后一切正常。

推理:BrowserRouter 用于基于请求的环境,而HashRouter 用于基于文件的环境。

在这里阅读更多:

https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/docs/api/HashRouter.md

【讨论】:

男人!你救了我整个星期!我尝试了数万亿种组合,并一直在谷歌上搜索它。现在,它就像魅力一样!谢谢 @IWIH 我有完全相同的一周,所以当我发现如何做时,我想我最好分享它以拯救其他一些可怜的灵魂。很高兴它为您节省了一些时间和理智! =-) 字面意思*(掌心) 在我的情况下,这个解决方案没有帮助。我仍然得到一个空白页:( 非常感谢它就像一个魅力❤️你拯救了我的整个项目。【参考方案6】:

同意尼克特的观点。 但我认为在进行任何路线管理之前最好这样处理。

if ( window.location.pathname.includes('index.html') ) 
    location.pathname = ROUTES.ROOT;

【讨论】:

【参考方案7】:

如果简单地使用 Switch 来默认为“/”,如下所示:

<Switch>
  <Route path="/" exact component=Home/>
  <Route path="/foo" component=Foo/>
  <Route path="/bar" component=Bar/>
  <Route render=() => <Redirect to="/"/>/>
</Switch>

这样,“/index.html”会重定向到“/”

【讨论】:

每次刷新都会导致一个空站点,整个应用程序都需要刷新......你是如何解决这个问题的? @maetulj 我也有同样的问题,

以上是关于如何将 React Router 与 Electron 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免重定向两次(react-router-redux)?

将Redux SubApp与React Router配合使用

React JS如何使用react-router-dom将数组作为参数传递

无法将 redux-devtools-extension 与 react-router-redux syncHistoryWithStore 一起使用

React-router:如何将 props 传递给子组件?

如何用 redux 和 react-router 组织状态?