生产抛出文件中的哈希路由未找到错误
Hash routing in production throwing file not found error
我正在使用 electron-react-boilerplate 并想在新的 BrowserWindow 中打开一个组件。关于如何执行此操作有多个问题和答案,但其中 none 个在打包应用程序后有效。
我找到的问题/答案:
- How to handle multiple windows in Electron application with React.JS?
在我的组件中,我尝试使用以下行打开一个新的 window 到不同的路线。
wind.loadURL(`file://${__dirname}/app.html#/video`)
wind.loadURL(`file://${Path.join(__dirname, '../build/app.html#/video')}`)
wind.loadURL(`file://${Path.join(__dirname, '../build/index.html#/video')}`)
第一个在 运行 yarn dev 时有效,但在生产中无效。他们都为各自的路径抛出 ERR_FILE_NOT_FOUND。
我的路线是这样设置的:
export default function Routes() {
return (
<App>
<HashRouter>
<Route exact path={routes.HOME} component={HomePage} />
<Route path={routes.VIDEO} component={VideoPage} />
</HashRouter>
</App>
);
}
在使用 React 的路由器打开新的 BrowserWindow 时,是否有一种简单的方法允许路由?
好时机。过去几天我在同一条船上,只是想通了。除了,我没有像你那样改成 HashRouter
。相反,我将所有路由的内容保留为默认 electron-react-boilerplate
附带的内容,例如 ConnectedRouter
。也许任何一种方法都有效。
__dirname
仅适用于开发。我使用 DebugTron 检查为每个资源加载了哪些 URL,它是 file://path/to/app.asar/something
。然后我想出了如何获得通往asar的道路。无论应用程序位于何处,这在开发和生产中都对我有用。您还需要设置 nodeIntegration: true
。在 macOS 上测试。
const electron = require("electron")
//...
win.loadURL(`file://${electron.remote.app.getAppPath()}/app.html#/yourroutename`)
更完整的示例,以防有人还想知道如何加载另一个页面并向其传递参数:
import routes from '../constants/routes.json'
const electron = require("electron")
// ...
var win = new BrowserWindow({
width: 400, height: 400,
webPreferences: { nodeIntegration: true }
})
win.loadURL(`file://${electron.remote.app.getAppPath()}/app.html#${routes["ROOM"]}?invitationCode=${encodeURIComponent(code)}`)
win.show()
并且在组件中路由加载:
const queryString = require('query-string')
// ...
constructor(props) {
super(props)
const params = queryString.parse(location.hash.split("?")[1])
this.invitationCode = params.invitationCode
}
我正在使用 electron-react-boilerplate 并想在新的 BrowserWindow 中打开一个组件。关于如何执行此操作有多个问题和答案,但其中 none 个在打包应用程序后有效。
我找到的问题/答案:
- How to handle multiple windows in Electron application with React.JS?
在我的组件中,我尝试使用以下行打开一个新的 window 到不同的路线。
wind.loadURL(`file://${__dirname}/app.html#/video`)
wind.loadURL(`file://${Path.join(__dirname, '../build/app.html#/video')}`)
wind.loadURL(`file://${Path.join(__dirname, '../build/index.html#/video')}`)
第一个在 运行 yarn dev 时有效,但在生产中无效。他们都为各自的路径抛出 ERR_FILE_NOT_FOUND。
我的路线是这样设置的:
export default function Routes() {
return (
<App>
<HashRouter>
<Route exact path={routes.HOME} component={HomePage} />
<Route path={routes.VIDEO} component={VideoPage} />
</HashRouter>
</App>
);
}
在使用 React 的路由器打开新的 BrowserWindow 时,是否有一种简单的方法允许路由?
好时机。过去几天我在同一条船上,只是想通了。除了,我没有像你那样改成 HashRouter
。相反,我将所有路由的内容保留为默认 electron-react-boilerplate
附带的内容,例如 ConnectedRouter
。也许任何一种方法都有效。
__dirname
仅适用于开发。我使用 DebugTron 检查为每个资源加载了哪些 URL,它是 file://path/to/app.asar/something
。然后我想出了如何获得通往asar的道路。无论应用程序位于何处,这在开发和生产中都对我有用。您还需要设置 nodeIntegration: true
。在 macOS 上测试。
const electron = require("electron")
//...
win.loadURL(`file://${electron.remote.app.getAppPath()}/app.html#/yourroutename`)
更完整的示例,以防有人还想知道如何加载另一个页面并向其传递参数:
import routes from '../constants/routes.json'
const electron = require("electron")
// ...
var win = new BrowserWindow({
width: 400, height: 400,
webPreferences: { nodeIntegration: true }
})
win.loadURL(`file://${electron.remote.app.getAppPath()}/app.html#${routes["ROOM"]}?invitationCode=${encodeURIComponent(code)}`)
win.show()
并且在组件中路由加载:
const queryString = require('query-string')
// ...
constructor(props) {
super(props)
const params = queryString.parse(location.hash.split("?")[1])
this.invitationCode = params.invitationCode
}