You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nuxt3+Electron页面导航失效:无法加载带#的本地资源

问题分析

报错Not allowed to load local resource的核心原因是:在Electron的file://协议环境下,虽然开启了Vue Router的hash模式,但路由跳转时浏览器错误地将#/mypage/subpage解析为本地文件路径,而非SPA的路由hash标识;同时Nuxt生成的静态资源未配置正确的路由回退规则,导致跳转时无法加载对应路由组件。

解决方案

1. 修正Nuxt基础路径与静态资源配置

修改nuxt.config.ts,将生产环境的基础路径配置到app.baseURL,并指定Nitro的静态回退页面为200.html(确保所有路由请求都指向SPA入口):

export default defineNuxtConfig({
  // ... 其他原有配置
  app: {
    baseURL: process.env.NODE_ENV === 'production' ? './' : '/', // 生产环境用相对路径
    // ... 其他app配置
  },
  nitro: {
    preset: 'static',
    routeRules: {
      '/*': { fallback: '/200.html' }, // 所有路由回退到SPA入口
    },
  },
  // ... 其他原有配置
})

2. 确保Electron窗口加载正确入口文件

在Electron主进程(electron/main.mts)中,明确指定index.html的绝对路径,避免路径解析错误:

import { app, BrowserWindow } from 'electron'
import path from 'node:path'

function createWindow() {
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, '../.dist-electron/preload.mjs'),
      // 不建议关闭webSecurity,优先通过路径配置解决问题
      // webSecurity: false
    },
  })

  // 加载Nuxt生成的静态首页
  const indexHtmlPath = path.join(app.getAppPath(), '.output/public/index.html')
  mainWindow.loadFile(indexHtmlPath)
}

app.whenReady().then(createWindow)

3. 对齐Vue Router的基础路径配置

确认nuxt.config.ts中的路由配置与基础路径保持一致:

export default defineNuxtConfig({
  // ... 其他原有配置
  router: {
    options: {
      hashMode: true,
    },
    base: process.env.NODE_ENV === 'production' ? './' : '/', // 与app.baseURL同步
  },
  // ... 其他原有配置
})

4. 重新构建项目

执行以下命令清理缓存、重新生成静态资源并打包:

npx nuxi clean && npx nuxi generate && electron-forge make
关键说明
  • 生产环境必须使用相对路径(./)作为baseURL,避免file://协议下的绝对路径解析错误。
  • Nitro的routeRules配置是SPA静态部署的核心,确保所有路由请求都由Vue Router接管解析。
  • 不要随意关闭Electron的webSecurity,优先通过正确的路径配置解决资源加载问题,避免安全风险。

内容的提问来源于stack exchange,提问作者Sev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:11:00