為何捐款
API 瀏覽器
升級指南
NEW!
quasar.config 檔案
轉換為搭配 Webpack 的 CLI
瀏覽器相容性
支援 TypeScript
目錄結構
命令列表
CSS 預處理器
路由
延遲載入 - 程式碼分割
處理資源
啟動檔案
預取功能
API 代理
處理 Webpack
處理 process.env
使用 Pinia 進行狀態管理
使用 Vuex 進行狀態管理
Linter
測試與稽核
開發行動應用程式
Ajax 請求
公開開發伺服器
Quasar CLI with Webpack - @quasar/app-webpack
Electron 預載腳本

基於安全考量,渲染執行緒(來自 /src 的 UI 程式碼)無法存取 Node.js 的內容。然而,您可以執行 Node.js 程式碼,並透過位於 /src-electron/electron-preload.[js|ts] 的 Electron 預載腳本將其橋接到渲染執行緒。使用 contextBridge (來自 electron 套件) 來公開您的 UI 需要的內容。

由於預載腳本從 Node.js 執行,請小心您對其執行的操作以及您向渲染執行緒公開的內容!

如何使用

/src-electron/ 資料夾中,有一個名為 electron-preload.js 的檔案。在其中填寫您的預載程式碼。

請確保您的 /src-electron/electron-main.[js|ts] 具有以下內容(在 “webPreferences” 區段附近)

檔案:/src-electron/electron-main

// Add this at the top:
import path from 'path'

// ...

function createWindow () {
  // ...
  mainWindow = new BrowserWindow({
    // ...
    webPreferences: {
      // HERE IS THE MAGIC:
      preload: path.resolve(__dirname, process.env.QUASAR_ELECTRON_PRELOAD)
    }
  })

/src-electron/electron-preload.[js|ts] 內容範例

// example which injects window.myAPI.doAThing() into the renderer
// thread (/src/*)

const { contextBridge } = require('electron')

contextBridge.exposeInMainWorld('myAPI', {
  doAThing: () => {}
})

警告

  1. 請注意,此檔案在 Node.js 環境中執行。
  2. 如果您從 node_modules 匯入任何內容,請確保該套件在 /package.json > “dependencies” 中指定,而不是在 “devDependencies” 中。

安全考量

僅僅使用 contextBridge 並不代表您所做的一切都是安全的。例如,以下程式碼是不安全的

// BAD code; DON'T!!
contextBridge.exposeInMainWorld('myAPI', {
  send: ipcRenderer.send
})

它直接公開了強大的 API,而沒有任何類型的引數過濾。這將允許任何網站傳送任意的 IPC 訊息,這是您不希望發生的。公開基於 IPC 的 API 的正確方法是為每個 IPC 訊息提供一個方法。

// Good code
contextBridge.exposeInMainWorld('myAPI', {
  loadPreferences: () => ipcRenderer.invoke('myAPI:load-prefs')
})

現在,loadPreferences 在您的 javascript 程式碼中全域可用(即:window.myAPI.loadPreferences)。

警告

請確保選擇的名稱不會與現有的 Window 鍵衝突。

在主執行緒中使用 invoke 呼叫 load-prefs 的上述程式碼,程式碼會像這樣

ipcMain.handle('myAPI:load-prefs', () => {
  return {
    // object that contains preferences
  }
})

預載腳本的自訂路徑

如果您希望變更預載腳本的位置(和/或甚至是主執行緒檔案),請編輯 /quasar.config 檔案

// should you wish to change default files
sourceFiles: {
  electronMain: 'src-electron/electron-main.js',
  electronPreload: 'src-electron/electron-preload.js'
}