Electron将视频文件单独打包成asar并调用

要将视频文件放到单独的 asar 包中,并让 Electron 应用正常调用,可按以下步骤操作:

项目结构调整

首先调整项目结构,将视频文件单独放在一个目录:

your-app/

├── main.js

├── forge.config.js

├── package.json

├── src/

├── index.html

└── assets/

└── videos/

├── video1.mp4

└── video2.mp4

将视频文件打包到单独的asar

若未安装 asar,可通过以下命令进行安装

bash 复制代码
npm install -g asar

使用asar命令打包

bash 复制代码
asar pack src/assets/videos out/videos.asar

修改 forge.config.js 配置

javascript 复制代码
const { FusesPlugin } = require('@electron-forge/plugin-fuses');
const { FuseV1Options, FuseVersion } = require('@electron/fuses');
const path = require('path');

module.exports = {
  packagerConfig: {
    asar: true,
    icon: path.join(__dirname, 'app-icon.ico'), // 图标文件路径
    ignore: [
      "./assets/videos",    // 忽略视频目录
      "py",
    ]
  },
  rebuildConfig: {},
  makers: [
    {
      name: '@electron-forge/maker-squirrel',
      config: {},
    },
    {
      name: '@electron-forge/maker-zip',
      platforms: ['darwin'],
    },
    {
      name: '@electron-forge/maker-deb',
      config: {},
    },
    {
      name: '@electron-forge/maker-rpm',
      config: {},
    },
  ],
  plugins: [
    {
      name: '@electron-forge/plugin-auto-unpack-natives',
      config: {},
    },
    // Fuses are used to enable/disable various Electron functionality
    // at package time, before code signing the application
    new FusesPlugin({
      version: FuseVersion.V1,
      [FuseV1Options.RunAsNode]: false,
      [FuseV1Options.EnableCookieEncryption]: true,
      [FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false,
      [FuseV1Options.EnableNodeCliInspectArguments]: false,
      [FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: false, // 是否验证 ASAR 归档文件的完整性
      [FuseV1Options.OnlyLoadAppFromAsar]: false,    // 将 Electron 查找应用代码的路径限制为仅 app.asar
    }),
  ],
};

EnableEmbeddedAsarIntegrityValidation 是一个构建时启用的安全开关,用于确保 Electron 应用在运行时加载的 ASAR 文件未被篡改,建议与 onlyLoadAppFromAsar 一起使用,并由 Electron Forge 或 Packager 自动完成配置。

主进程中注册协议

在主进程代码(通常是main.js)中注册一个自定义协议来处理 asar 文件中的资源:

javascript 复制代码
const { protocol } = require('electron');

app.whenReady().then(() => {
    createWindow()
        
    // 注册自定义协议处理videos.asar中的文件
    protocol.registerFileProtocol('app', (request, callback) => {
        const url = request.url.replace('app://', '');
        const decodedUrl = decodeURIComponent(url);
        try {
            const filePath = path.join(app.getAppPath(), '..', decodedUrl);
            console.log(filePath)
            // 检查文件是否存在
            fs.accessSync(filePath, fs.constants.R_OK);
            callback(filePath);
        } catch (error) {
            console.error('Error accessing video file:', error);
            callback({ error: 404 });
        }
    });
}

在渲染进程中使用视频

在 index.html(或任何渲染进程的 HTML 文件)里放宽 CSP,把 app:// 协议加入白名单。

html 复制代码
<meta http-equiv="Content-Security-Policy" 
    content="default-src 'self' app://*;
        media-src 'self' app://*;
        script-src 'self' 'unsafe-eval'; 
        style-src 'self' 'unsafe-inline'">
  • app://* 表示允许任意 app:// 开头的资源。

  • 如果只想放行媒体,可只保留 media-src 'self' app://*。

在 HTML 中使用注册的 app:// 协议引用视频文件:

html 复制代码
<video src="app://videos.asar/video1.mp4" autoplay loop muted></video>

确保 videos.asar 文件夹放在打包后的resources目录下。

相关推荐
QQ1__8115175157 小时前
Spring boot名城小区物业管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
前端·vue.js·spring boot
钛态7 小时前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
一粒黑子7 小时前
【实战解析】阿里开源 PageAgent:纯前端 GUI Agent,一行JS让网页支持自然语言操控
前端·javascript·开源
独角鲸网络安全实验室7 小时前
2026微信小程序抓包全解析:从实操落地到合规风控,解锁前端调试新范式
前端·微信小程序·小程序·抓包·系统代理绕过·https证书严格校验·进程隔离
紫微AI7 小时前
前端文本测量成了卡死一切创新的最后瓶颈,pretext实现突破了
前端·人工智能·typescript
GISer_Jing7 小时前
AI前端(From豆包)
前端·aigc·ai编程
IT枫斗者7 小时前
前端部署后如何判断“页面是不是最新”?一套可落地的版本检测方案(适配 Vite/Vue/React/任意 SPA)
前端·javascript·vue.js·react.js·架构·bug
测试修炼手册7 小时前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json
AI老李7 小时前
2026 年 Web 前端开发的 8 个趋势!
前端
里欧跑得慢7 小时前
15. Web可访问性最佳实践:让每个用户都能平等访问
前端·css·flutter·web