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

如何配置Electron/Electron-Forge实现asar仅打包指定目录其余文件外置

解决方案

方案一:原生配置实现单app.asar结构(推荐,符合第二种期望结构)

不需要手动写脚本处理asar,直接通过Electron Forge的配置即可实现,Electron原生适配无需额外修改模块逻辑。
修改你的forge.config.js核心配置如下:

module.exports = {
  packagerConfig: {
    // 开启asar,指定仅将目标内容打包进app.asar
    asar: {
      patterns: [
        "package.json", // 必须保留,Electron需要读取入口配置
        "sources/**/*",
        "node_modules/**/*"
      ]
    },
    // 将不需要进asar的目录复制到resources/app下
    extraResource: [
      {
        from: "executable",
        to: "app/executable"
      },
      {
        from: "images",
        to: "app/images"
      }
    ],
    // 确认入口路径和asar内结构匹配,比如入口是sources下的index.js
    main: "sources/index.js"
  },
  // 其余你的makers、plugins等配置保持不变
}

注意事项

  • 只需保证package.json里的main字段指向的路径和asar内的入口文件路径一致即可,Electron会自动优先从app.asar内读取对应文件
  • 访问外部的executable、images目录资源时,直接用path.join(app.getAppPath(), 'executable/目标文件')即可,Electron发现asar内无对应路径时会自动查找外部的app目录,完全符合要求的自动识别逻辑。

方案二:双asar独立打包结构(符合第一种期望结构)

如果需要单独打包sources.asar和node_modules.asar,按以下步骤配置:

  1. 先关闭默认asar打包,在forge.config.js的packagerConfig里设置asar: false
  2. 添加afterPack钩子,在构建完成后调用asar包手动打包两个目录:
const asar = require('asar')
const path = require('path')
const fs = require('fs-extra')

module.exports = {
  packagerConfig: {
    asar: false,
    // 复制不需要打包的目录到输出位置
    extraResource: [
      "executable",
      "images"
    ]
  },
  hooks: {
    afterPack: async (config, buildPath, electronVersion, platform, arch) => {
      const resourcesPath = path.join(buildPath, 'resources', 'app')
      // 打包sources为asar
      await asar.createPackage(path.join(__dirname, 'sources'), path.join(resourcesPath, 'sources.asar'))
      // 打包node_modules为asar
      await asar.createPackage(path.join(__dirname, 'node_modules'), path.join(resourcesPath, 'node_modules.asar'))
      // 删除原本复制过去的未打包sources和node_modules
      await fs.remove(path.join(resourcesPath, 'sources'))
      await fs.remove(path.join(resourcesPath, 'node_modules'))
    }
  }
}
  1. 在你的项目入口文件最顶部添加模块解析配置,让Electron识别两个单独的asar:
const { app } = require('electron')
const path = require('path')
// 将node_modules.asar加入全局模块搜索路径
require('module').globalPaths.push(path.join(app.getAppPath(), 'node_modules.asar'))
// 加载sources.asar内的业务入口
require(path.join(app.getAppPath(), 'sources.asar', 'index.js'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:39:03