news 2026/4/22 19:38:38

Electron命令行工具-Asar

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Electron命令行工具-Asar

ASAR官网介绍: https://www.electronjs.org/zh/docs/latest/tutorial/asar-archives

ASAR是一个由 Electron 官方维护、基于 Node.js 的命令行工具/模块,用来把「一堆小文件」归档成「一个 .asar 文件」,从而解决 Windows 长路径、文件数量、首次读取性能等问题。

一、安装

  1. 全局安装(推荐在 CI / 开发机用)
npminstall-g @electron/asar# 全局命令 asar 可用asar -V# 验证,返回版本号即成功,注意V需要大写
  1. 项目内安装(推荐在脚本里调用 API)
npminstall-D @electron/asar# 本地 devDependencynpx asar …# 直接用,无需全局

二、命令行常用操作

  1. 打包
asar pack<源目录><输出.asar>例:asar pack ./dist app.asar
  1. 解包
asar extract<xxx.asar><输出目录>例:asar extract app.asar ./unpacked
  1. 仅查看目录结构
asar list app.asar
  1. 排除大文件 / 原生模块(–unpack)
asar pack.app.asar –unpack “*.node” 结果同时生成 app.asar# 归档部分app.asar.unpacked/# 被排除的文件,运行时需并列放置

三、在 Node 代码里调用 API

官方包 @electron/asar 暴露的接口极少,最常用的 3 个:

constasar=require('@electron/asar');// 1. 打包awaitasar.createPackage(srcDir,outputAsar);// 2. 解包awaitasar.extractAll(inputAsar,outDir);// 3. 读取单文件(不落地磁盘)constbuf=awaitasar.extractFile(inputAsar,'package.json');console.log(JSON.parse(buf.toString()));

四、进阶技巧

  1. Electron 项目一体化
    在 package.json 里加一行脚本,一键生成 app.asar:
"scripts":{"build:asar":"asar pack ./dist ./release/app.asar --unpack '*.node'"}
  1. VSCode 插件优化
    把 node_modules 打成 node_modules.asar 可减少 30 % 文件数;
    配合 .vscodeignore 忽略原 node_modules 即可 。

  2. 体积瘦身
    先 npm install --production 去掉 devDeps,再 asar pack;
    或者 –unpack-dir “{@types,ts-node}” 排除开发时依赖 。

  3. 加密 / 加固
    asar 本身只提供“打包”而非“加密”。如需防篡改,可:
    • 在 Electron 主进程里对 asar 做完整性校验(sha256);
    • 或者改用 electron-builder 的 “asarUnpack” + “afterPack” 钩子做自定义加密 。

五、ASAR的局限性

  1. 只读、不可热更新
    ASAR 一旦生成就是只读镜像,运行时无法往里写日志、改配置。
    社区有人尝试“解压→patch→重打包”做增量更新,官方明确表态「低效但可行」,不会提供原生增量 API。

  2. 工作目录(cwd)无法指向包内路径
    任何把 cwd 设成 asar 内目录的代码(如 spawn 选项、某些 C++ addon)都会直接抛 ENOENT。

  3. 部分 Node API 必须先解压到临时目录
    底层需要“真实文件路径”的系统调用,Electron 会在后台把文件拷到 %TEMP%/.com.github.Electron.xxx/ 再执行:

    • child_process.execFile / execFileSync
    • fs.open / openSync
    • process.dlopen(require 原生模块时)

结果:

  • 首次调用变慢;
  • 临时文件不自动清理,长期运行会堆积;
  • 若杀进程会留下僵尸文件。
  1. fs.stat 返回“假”信息
    除了 size、isFile/Directory 外,mtime/uid 等全为 0,依赖精确时间的日志切割、缓存校验会翻车。

  2. 原生模块必须 --unpack
    .node 文件如果留在包内,require 时会被解包到临时目录,但部分杀毒软件会把“可执行体突然落地”当成可疑行为拦截;
    正确姿势是打包时加 --unpack “*.node”,让 xxx.asar.unpacked 与 xxx.asar 并列分发。

  3. 单文件体积上限 ≈ 4 GB
    ASAR 索引用 32-bit 偏移,理论极限 4 GB;electron-builder 在 ≥4.2 GB 直接报错中断。
    视频、3D 纹理等大资源应放到 extraFiles 走外部分包。

  4. 无加密、源码裸奔
    ASAR 只是 tar-like 格式,用十六进制编辑器就能直接看到源码。
    社区有“asar 加密补丁”,但限制极多:

    • 只能加密 JS,JSON/图片明文依旧;
    • 必须开 nodeIntegration,preload 脚本失效;
    • 动态 import()、HTML<script src>全部失效;
    • 需要自行编译 C++ 扩展,密钥埋 binary,仍可被逆向。
      官方立场:要真保密就改 Electron 源码重新编译,否则接受“只能防君子”。
  5. 调试阶段效率低
    开发时想改一行代码也要重新 asar pack,否则热重载看不到;
    VSCode、webpack 这类工具链需要额外脚本把 asar 解包到内存或临时目录,调试体验比直接文件夹差。

六、开启ASAR注意点

必须改(否则运行时报错):

  1. 不要把工作目录(cwd)指到包内
    所有child_process.spawn / execcwd选项、process.chdir()都只能指向真实磁盘目录
    asar 内部路径在系统调用层不存在,会立即抛ENOENT

  2. 不要把原生模块(.node)/可执行二进制留在包内
    require('xxx.node')execFile('ffmpeg')时,Electron 会偷偷把文件解包到%TEMP%再运行;
    但部分杀毒软件会拦截“落地可执行体”,正确姿势是打包时加
    asar pack . app.asar --unpack "*.node" --unpack "bin/*"
    app.asar.unpackedapp.asar并列分发。

  3. 不要依赖fs.statmtime / uid / mode
    asar 只提供sizeisFile/Directory,其余字段全是 0;
    日志按时间切分、缓存按时间戳比对等逻辑会翻车。

  4. 不要对包内文件做写操作
    asar 是只读镜像,fs.writeFile / fs.appendFile / fs.rename都会直接抛EROFS
    配置文件、日志、下载内容必须写到app.getPath('userData')等真实目录。

强烈建议改(否则首次调用变慢或调试困难):

  1. 不要fs.readFileSync超大文本到 Renderer
    首次读取会整包解包到内存,>100 MB 的 JSON 会卡 UI;
    大资源放extraResources走外部分包,或按需流式读取。

  2. 不要把动态 import()的路径写成运行时拼接
    import('./lang/'+lang+'.js'),webpack 会无法提前分析依赖,
    导致对应文件被打包器漏拷,运行时报Cannot find module
    改成显式 map 或require.context让构建工具可静态分析。

  3. 不要把__dirname / __filename当真实磁盘路径再二次运算
    在 asar 里它们返回的是虚拟路径,
    若再path.join(__dirname, '../assets')后传给原生库,会拿到不存在的路径。
    需要真实路径时,用app.isPackaged判断后走app.getAppPath()process.resourcesPath

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 12:07:14

多人合影能转吗?使用场景限制说明

多人合影能转吗&#xff1f;使用场景限制说明 1. 先说结论&#xff1a;多人合影可以转&#xff0c;但效果有明显边界 很多人第一次用这款「人像卡通化」工具时&#xff0c;会兴奋地上传一张全家福或团队合影&#xff0c;期待看到整张照片变成统一风格的卡通画。结果发现——只…

作者头像 李华
网站建设 2026/4/23 11:35:18

ESP-IDF下SDMMC接口驱动开发实战案例

以下是对您提供的博文内容进行 深度润色与结构重构后的技术文章 。本次优化严格遵循您的要求&#xff1a; ✅ 彻底去除AI生成痕迹&#xff0c;语言自然、专业、有“人味” ✅ 摒弃模板化标题&#xff08;如“引言”“总结”&#xff09;&#xff0c;改用逻辑递进、场景驱动…

作者头像 李华
网站建设 2026/4/23 13:20:05

一键启动Qwen3-0.6B,开箱即用太方便

一键启动Qwen3-0.6B&#xff0c;开箱即用太方便 [【免费下载链接】Qwen3-0.6B Qwen3 是阿里巴巴于2025年4月开源的新一代通义千问大语言模型系列&#xff0c;涵盖6款密集模型和2款混合专家&#xff08;MoE&#xff09;架构模型&#xff0c;参数量从0.6B至235B。Qwen3-0.6B作为…

作者头像 李华
网站建设 2026/4/23 11:42:56

YOLOv9移动端潜力如何?未来可期

YOLOv9移动端潜力如何&#xff1f;未来可期 YOLO系列模型自问世以来&#xff0c;始终在“精度”与“速度”的天平上寻求最优解。当YOLOv8n已在移动端站稳脚跟&#xff0c;以68ms的单帧延迟证明轻量检测的可行性时&#xff0c;一个更值得追问的问题浮出水面&#xff1a;刚刚发布…

作者头像 李华
网站建设 2026/4/23 10:05:45

全面讲解交叉编译的组成要素与依赖关系

以下是对您提供的博文《全面讲解交叉编译的组成要素与依赖关系》进行 深度润色与结构重构后的专业级技术文章 。全文严格遵循您的全部优化要求&#xff1a; ✅ 彻底去除AI痕迹&#xff0c;语言自然如资深嵌入式工程师现场授课&#xff1b; ✅ 摒弃“引言/核心/总结”等模板…

作者头像 李华
网站建设 2026/4/23 10:03:51

动手试了YOLO11镜像,树莓派上效果超出预期

动手试了YOLO11镜像&#xff0c;树莓派上效果超出预期 1. 为什么是YOLO11&#xff0c;又为什么选树莓派 很多人第一次听说“在树莓派上跑YOLO”时&#xff0c;下意识会皱眉&#xff1a;这小板子能扛得住&#xff1f;内存够吗&#xff1f;发热炸不炸&#xff1f;帧率能到5帧还…

作者头像 李华