news 2026/6/1 12:40:11

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/5/31 1:26:16

jflash怎么烧录程序:入门必看的操作基础篇

以下是对您提供的博文《J-Flash 烧录程序全流程技术解析》的 深度润色与重构版本 。我以一位有十年嵌入式量产经验、常驻产线调试现场的工程师视角&#xff0c;彻底重写全文&#xff1a;去掉所有模板化结构、弱化“教学感”&#xff0c;强化 真实开发语境中的判断逻辑、踩坑…

作者头像 李华
网站建设 2026/5/1 7:24:09

Arduino Uno复位电路设计:工作机制深度剖析

以下是对您提供的博文《Arduino Uno复位电路设计&#xff1a;工作机制深度剖析》的 全面润色与专业重构版本 。本次优化严格遵循您的全部要求&#xff1a; ✅ 彻底消除AI生成痕迹&#xff0c;语言自然、老练、有“人味”——像一位在嵌入式一线摸爬滚打十年的工程师&#xf…

作者头像 李华
网站建设 2026/5/27 3:34:59

新手友好!GPEN镜像让盲人脸恢复变得如此简单

新手友好&#xff01;GPEN镜像让盲人脸恢复变得如此简单 你是否遇到过这样的困扰&#xff1a;一张模糊、低分辨率、甚至带噪点的人脸老照片&#xff0c;想修复却无从下手&#xff1f;修图软件调参数调到眼花&#xff0c;AI工具又总在细节上“翻车”——眼睛不对称、皮肤不自然…

作者头像 李华
网站建设 2026/5/29 11:35:52

内存不足导致崩溃?科哥镜像优化建议帮你解决

内存不足导致崩溃&#xff1f;科哥镜像优化建议帮你解决 在实际部署 OCR 文字检测服务时&#xff0c;不少用户反馈&#xff1a;模型启动后运行几轮就卡死、批量处理时 WebUI 假死、训练中途报 CUDA out of memory 或直接 Killed —— 这些现象背后&#xff0c;90% 以上都指向同…

作者头像 李华
网站建设 2026/5/23 7:07:35

AI 赋能小说创作:智能起名功能如何提升写作效率

✨ AI 赋能小说创作&#xff1a;智能起名功能如何提升写作效率 &#x1f4a1; 在小说创作过程中&#xff0c;为角色起名往往是最耗时且最需要灵感的环节之一。本文以 51mazi 小说写作软件的 AI 随机起名功能为例&#xff0c;深入探讨 AI 如何辅助创作者快速生成符合故事背景的角…

作者头像 李华
网站建设 2026/5/25 10:54:16

Multisim主数据库加载失败的项目应用解决方案

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 &#xff0c;严格遵循您的全部要求&#xff1a; ✅ 彻底去除AI痕迹&#xff0c;语言自然、老练、有“人味”&#xff0c;像一位在高校实验室带了十年电赛的工程师在和你面对面聊故障&#xff1b; ✅ 全…

作者头像 李华