この定型文 を参照として使用して、 電子 アプリを作成しました。 webpackを使用して、スクリプトとエクスプレスサーバーをバンドルしてホストします。
Webpackの設定は、実際には this およびserver 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コンポーネントアプリがマウントされています。しかし、どのように反応ルーターをこれに統合しますか?
ブラウザーアプリと同じ方法で実装しました。私はこのエラーを受け取ります:
[react-router] Location "/Users/arjun/Documents/Github/electron-app/app/index.html" did not match any routes
ルートとしてファイルパスを使用しています。ボイラープレートのコードを調べても解決しませんでした。私は何が欠けていますか?
別のオプションは、代わりにhashHistoryを使用することです。実際、参照されているレポジトリで hashHistory を使用していることがわかります。
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
はファイルベースの環境向けです。
詳細はこちら:
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>
);
this のときの最良の選択肢は、 MemoryRouter を使用することです、私のために働いた:)
(現在の) react-router docs say :
一般的に、要求に応答するサーバーがある場合は<BrowserRouter>を使用し、静的ファイルサーバーを使用している場合は<HashRouter>を使用する必要があります。
Electronアプリは基本的に静的なファイルサーバーです。
MemoryRouter も機能します。ただし、すべてのルーティングがアプリのReact部分から発せられる場合に限ります。特定のページにナビゲートする場合にのみ落ちますブラウザプロセス。たとえば、新しいウィンドウをポップアップして「一般設定」ページに直接移動したい場合、HashRouterでこれを実行できます。
prefsWindow.loadURL(`file://${__dirname}/app/index.html#/general-prefs`);
MemoryRouterで(ブラウザプロセスから)それを行う方法はないと思います。
Niekertに同意します。しかし、ルート管理の前にこのように処理する方が良いと思います。
if ( window.location.pathname.includes('index.html') ) {
location.pathname = ROUTES.ROOT;
}