我找到了另一種解決方案,而無需使用express
或serve-static
,只有我們做 需要定製Electron內置interceptFileProtocol()
來提供靜態內容。
代碼:(main.js)
(我用的是electron-quick-start爲電子模板)
function createWindow() {
window = new BrowserWindow({ width: 800, height: 600 })
window.loadURL(url.format({
pathname: 'index.html', /* Attention here: origin is path.join(__dirname, 'index.html') */
protocol: 'file',
slashes: true
}))
window.on('closed',() => {
window = null
})
}
app.on('ready',() => {
protocol.interceptFileProtocol('file', (request, callback) => {
const url = request.url.substr(7) /* all urls start with 'file://' */
callback({ path: path.normalize(`${__dirname}/${url}`)})
}, (err) => {
if (err) console.error('Failed to register protocol')
})
createWindow()
})
參考: protocol.interceptFileProtocol()
釋:
通常,如果您將React應用程序作爲普通網站運行,則應通過HTTP [GET]
方法提供所有靜態內容。雖然他們使用相對路徑,但您的HTTP服務器將處理路徑解析工作。
但是,在Electron下運行時,情況會改變。
你的靜態內容通常使用像./picture.jpg
相對路徑,電子將使用file
協議,而不是HTTP
協議下找到根路徑中的文件一樣C://.//
。因此,像./picture.jpg
這樣的靜態內容將無法正確加載。
通過自定義interceptFileProtocol()
,所有靜態內容的請求將被指向您的工作目錄而不是Windows(或其他操作系統)根目錄。
最後,我不知道它是否是所有電子項目的一個很好的解決方案,但如果你已經有了一個React
項目(或其他一些SPA),並希望與電子把它包起來,此解決方案將是罰款使用。
這對我有用,但後來在索引index.html中使用相對路徑時遇到了索引js文件的問題。通過使用'require('electron')。remote.app'獲取應用程序路徑,最終需要使用絕對路徑。getAppPath()' –