聊一聊Electron生产环境cookie失效的问题

项目背景

项目运行在Windows系统下,架构为C/S。使用iframe加载第三方链接(所以没办法从第三方链接处理,只能前端这里处理)

技术栈

列出主要的和对项目影响大的技术框架

  1. vue3
  2. electron
  3. vite
  4. typescript

下面列出我的package.json(没有藏!都在这里)
注意版本哦


"dependencies": {
   
    "axios": "^1.4.0",
    "changedpi": "^1.0.4",
    "echarts": "^5.4.2",
    "electron-updater": "^6.1.1",
    "element-plus": "^2.3.6",
    "pinia": "^2.1.3",
    "vue": "^3.2.25",
    "vue-router": "^4.0.15",
    "winston": "^3.14.2",
    "winston-daily-rotate-file": "^5.0.0"
  },
  "devDependencies": {
   
    "@types/winston": "^2.4.4",
    "@vitejs/plugin-vue": "^2.3.3",
    "@vueuse/electron": "^8.5.0",
    "electron": "^19.0.0",
    "electron-builder": "^23.0.3",
    "electron-devtools-installer": "^3.2.0",
    "rimraf": "^3.0.2",
    "typescript": "^4.5.4",
    "unplugin-auto-import": "^0.16.4",
    "unplugin-vue-components": "^0.25.0",
    "vite": "^2.9.9",
    "vite-plugin-electron": "^0.4.5",
    "vue-tsc": "^0.34.7"
  },

问题描述:

开发环境是存储cookie是没问题的,为什么呢?排查后可以发现对于electron加载前端页面的方式不同

以下是相关代码

// 打开网址(加载页面)
    let winURL;
    if (app.isPackaged) {
   
    // app已经被打包(生产环境)
      winURL = args.route
        ? path.join(__dirname, `../index.html/#${
     args.route}`)
        : path.join(__dirname, "../index.html");
      win.loadFile(winURL);
    } else {
   
    // app没有被打包(开发环境)
      win.webContents.openDevTools();
      winURL = args.route
        ? `http://${
     process.env["VITE_DEV_SERVER_HOST"]}:${
     process.env["VITE_DEV_SERVER_PORT"]}${
     args.route}?winId=${
     args.id}`
        : `http://${
     process.env["VITE_DEV_SERVER_HOST"]}:${
     process.env["VITE_DEV_SERVER_PORT"]}?winId=${
     args.id}`;
      win.loadURL(winURL);
    }

以下对于两种方式 win.loadFile(winURL)和win.loadURL(winURL)聊一聊

loadURL(url);

通过从网络加载 URL,我这里是http协议打开一个url地址(类似在浏览器输入网址)

loadURL
用途:用于从网络加载 URL。
参数:
url:要加载的 URL 字符串。
options(可选):一个对象,可以包含以下属性:
httpReferrer:HTTP 引用字符串。
userAgent:用户代理字符串。
extraHeaders:额外的 HTTP 请求头。
postData:POST 数据。
baseURLForDataURL:当加载的数据 URL 时使用的基 URL。

loadFile(filePath);

通过file协议打开一个文件目录地址(类似在本地资源管理器双击html页面)

loadFile
用途:用于从本地文件系统加载 HTML 文件。
参数:
filePath:要加载的本地 HTML 文件路径。
search(可选):查询字符串。
hash(可选):哈希片段。

在使用 loadFile 方法加载本地 HTML 文件时,处理 Cookies 的方式与使用 loadURL 加载网络 URL 有所不同。loadFile 不会自动处理 HTTP 请求和响应头中的 Cookies,因为它是从本地文件系统加载内容的,而不是通过网络请求。

解决问题思路

找到了问题,从源头我们应该把file换成url地址方式就好了。开始我也是这么想的。但是打包后改成url地址,必然要起一个sever服务,那么electron是可以使用http网络模块起vue3打包后的dist文件夹静态http服务的。

思路1(loadFile–换–>loadURL)测试失败

以下是相关代码

// serve-local-resources.ts
import * as http from "http";
import * as path from
### 在Electron应用的生产环境中追加或加载额外的JavaScript文件 为了在Electron应用的生产环境中动态加载额外的JavaScript文件,可以采用多种方法。种常见的方式是在主进程中通过`session.defaultSession.loadURL()`或者使用预加载脚本来实现这点。 如果希望在构建后的Electron应用中加入新的JavaScript逻辑而修改原有代码,则可以在创建窗口时指定个预加载脚本。这允许开发者向渲染进程注入自定义模块,在那里能够安全地访问Node.js API以及执行特定任务[^1]。 对于已经发布的应用程序而言,另种策略是利用Web技术中的动态加载特性。可以通过编写段简单的HTML `<script>`标签并将其插入到DOM树中来引入外部资源: ```html <script src="./path/to/your/additional-script.js"></script> ``` 当涉及到实际操作时,考虑到安全性因素,建议先验证环境变量以确认当前运行模式(即开发还是生产),从而决定是否应该加载这些附加文件。例如: ```javascript if (process.env.NODE_ENV === 'production') { const script = document.createElement('script'); script.src = './dist/additional-script.min.js'; // 假设这是经过压缩优化后的版本 document.head.appendChild(script); } ``` 此外,还可以考虑将所有可能需要使用的辅助功能封装成独立的小型库,并仅按需懒加载它们。这样仅可以减少初始页面加载时间,还能提高整体性能表现。 值得注意的是,在处理这类需求时应当特别注意路径设置,尤其是在打包之后,相对路径可能会发生变化。因此推荐使用Webpack等工具来进行资产管理,确保无论在哪种环境下都能正确找到所需的静态资源文件[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值