为什么捐赠
API 浏览器
升级指南
创建新项目
quasar.config 配置文件
从 Webpack 项目转换
浏览器兼容性
TypeScript 支持
目录结构
命令列表
CSS 预处理器
使用 VueRouter 进行页面路由
懒加载 - 代码分割
资源处理
Boot 文件
预取特性
API 代理
配置 Vite
处理 import.meta.env
使用 Pinia 管理状态
代码检查与格式化
测试与审计
开发移动应用
Ajax 请求
开放开发服务器到公网
联系站长
Quasar CLI with Vite - @quasar/app-vite
Electron 与 Typescript

为了让 Electron 支持 Typescript,你需要将 /src-electron 目录下的文件扩展名从 .js 改为 .ts,并进行必要的 TS 代码调整。

TIP

@electron/packagerelectron-builder 从各自的包中导出配置类型。 由于 quasar.config 文件的自动补全依赖于这些类型,electron.packagerelectron.builder 属性只有在安装了相应的包之后才会获得完整的类型提示。 你可以通过在 Electron 模式下运行构建命令来强制安装所选的打包工具(取决于你的 electron.bundler 选项):quasar build -m electron

以下是 /src-electron 目录中的文件示例:

/src-electron/electron-main.ts

import { BrowserWindow, app } from 'electron'
import path from 'node:path'
import os from 'node:os'
import {
  registerQuasarRuntime,
  resolveElectronAssetsPath
} from '#q-app/electron/main'

// needed in case process is undefined under Linux
const platform = process.platform || os.platform()

async function createWindow() {
  /**
   * Initial window options
   */
  const mainWindow = new BrowserWindow({
    icon: resolveElectronAssetsPath('icons/icon.png'), // linux
    width: 1000,
    height: 600,
    useContentSize: true,
    webPreferences: {
      contextIsolation: true,
      // https://v2.quasar.dev/quasar-cli-vite/developing-electron-apps/electron-preload-script
      preload: path.join(import.meta.dirname, 'electron-preload.cjs')
    }
  })

  if (import.meta.env.QUASAR_DEV) {
    await mainWindow.loadURL(import.meta.env.QUASAR_APP_URL)
  } else {
    await mainWindow.loadFile('index.html')
  }

  if (import.meta.env.QUASAR_DEBUG) {
    // if on DEV or Production with debug enabled
    mainWindow.webContents.openDevTools()
  } else {
    // we're on production; no access to devtools pls
    mainWindow.webContents.on('devtools-opened', () => {
      mainWindow?.webContents.closeDevTools()
    })
  }
}

void app.whenReady().then(async () => {
  await registerQuasarRuntime()

  void createWindow()

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      void createWindow()
    }
  })
})

app.on('window-all-closed', () => {
  if (platform !== 'darwin') {
    app.quit()
  }
})
/src-electron/electron-preload.ts

/**
 * 此文件专门用于安全目的。
 * 您可以在此通过 Electron 的 contextBridge 功能安全地向渲染进程暴露特权 API,
 * 并通过 Electron 的进程间通信(IPC)与主进程进行通信。
 *
 * 警告!
 * preload 脚本的沙箱环境仅提供有限的 Node.js 环境访问能力。
 * 请勿尝试在此文件中从 node_modules 导入包或直接使用 Node.js API。
 * 应该通过 IPC 与主进程通信,在主进程中访问包和 Node.js 功能。
 *
 * 将 window.myAPI.doAThing() 注入到渲染进程的示例:
 *
 *   import { contextBridge } from 'electron'
 *
 *   contextBridge.exposeInMainWorld('myAPI', {
 *     doAThing: () => {}
 *   })
 *
 * Preload 脚本文档:
 * https://www.electronjs.org/docs/latest/tutorial/tutorial-preload
 */
import { contextBridge } from 'electron'
import { quasarRuntime } from '#q-app/electron/preload'

contextBridge.exposeInMainWorld('quasarRuntime', quasarRuntime)