追踪安 Electron
CSV 导出。

按照一个按钮点击从页面API,通过Electron IPC,到CSV文件编写器。

"Export notes(导出笔记)"去哪儿了?

本指南使用一个小型 Electron 应用。点击Export notes(导出笔记)后,页面调用 API,通过进程边界进入主进程,最后写出 CSV。这个行为分散在几个文件中。

该 CSV 跨导出 Electron 过程

  1. 渲染器→预加载notes.exportCsv()renderer.js 调用由 preload.js.
  2. 进程之间notes:export预加载调用IPC通道:主进程的命名消息。
  3. 主进程导出处理函数main.js处理这个通道,再调用 CSV 写入函数。

csv.js 格式化注释→ main.js 写道 downloads/notes.csv.

REA将字面IPC调用与其处理程序相匹配,并标识公开的API。 路径是从代码中推断出来的;运行时捕获可以检查执行的内容。

询问有关 CSV 导出

将你的编程助手连接到 REA 并给它的应用程序目录或 ASAR 档案:

你的编程助手

用 REA 找出这个应用导出笔记时发生了什么。CSV 文件在哪里创建?

示例提示。 包括应用程序文件夹的绝对路径或 app.asar.

REA读取应用程序文件并构建入口点,模块和流程边界的映射。 你的编程助手使用该映射将调查范围缩小到导出功能。

跟踪导出代码

页面调用一个小API

renderer.js · 示例来源
document.querySelector("#export").addEventListener("click", async () => {
  const destination = await window.notes.exportCsv();
  document.querySelector("#status").textContent = `Saved to ${destination}`;
});

页面知道方法名称。 实现存在于预加载中,预加载将其暴露给渲染器。

preload.js · 示例来源
contextBridge.exposeInMainWorld("notes", {
  exportCsv: () => ipcRenderer.invoke("notes:export"),
});

REA 记录 notes.exportCsv 和直接写在代码中的通道名 notes:export,并将调用关联到主进程里唯一匹配的处理函数。

main.js · 示例来源
ipcMain.handle("notes:export", () => {
  const destination = path.join(app.getPath("downloads"), "notes.csv");
  writeFileSync(destination, toCsv(notes), "utf8");
  return destination;
});

读取处理函数就能回答最初的问题:csv.js 格式化笔记,主进程将 notes.csv 写入用户的下载文件夹。

REA 结果 · summary.ipc 摘录
{
  "literal_channels": 1,
  "renderer_transmissions": 1,
  "main_handlers": 1,
  "paired_renderer_transmissions": 1,
  "ambiguous_renderer_transmissions": 0
}

使用 REA 4.1.0 分析下面可下载的示例。API、通道和处理函数的结果均附有源码位置。

自己分析例子

下载示例并解压缩。 存档包含完整的 notes-example 文件夹。 分析它与 Node.js 和 npm; Electron 本例不需要。

下载示例ZIP

浏览六个源文件
静态应用分析
npx -y rea-agents@latest analyze-javascript-application \
  /absolute/path/to/notes-example --json

将路径替换为你解压缩的文件夹。 你应该在以下位置找到一个IPC通道和一个匹配的处理程序 normalized_result.summary.ipc. 源位置在 normalized_result.graph.

对于你自己的应用程序,请对其目录或ASARpath使用相同的命令。 编程助手可以使用REA的功能跟踪工具跟随文字字符串,API名称或IPC通道。

检查CSV写入器

追踪 notes:export 到处理函数。哪些输入传给 CSV 写入函数?如果写入失败,会怎样?

使用源位置检查这些详细信息。 计算的通道名称和不明确的处理程序可以保持未解析;运行时观察为你提供了另一种调查它们的方法。

顶部