electron-ohos-hotreload 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/eohr.js +134 -0
- package/docs/design-manual.md +445 -0
- package/docs/quick-start.md +54 -0
- package/docs/user-manual.md +766 -0
- package/package.json +40 -0
- package/src/commands/clean.js +97 -0
- package/src/commands/init.js +92 -0
- package/src/commands/log.js +35 -0
- package/src/commands/push.js +104 -0
- package/src/commands/setup.js +197 -0
- package/src/commands/status.js +57 -0
- package/src/commands/strategy.js +63 -0
- package/src/commands/watch.js +302 -0
- package/src/core/Bundler.js +86 -0
- package/src/core/Config.js +192 -0
- package/src/core/Dashboard.js +127 -0
- package/src/core/FileWatcher.js +201 -0
- package/src/core/HdcBridge.js +175 -0
- package/src/core/StatusPoller.js +72 -0
- package/src/utils.js +74 -0
- package/templates/hot-reload-agent.js +186 -0
|
@@ -0,0 +1,766 @@
|
|
|
1
|
+
# Electron OHOS Hot-Reload 用户使用手册
|
|
2
|
+
|
|
3
|
+
> **版本**: 1.4.0
|
|
4
|
+
> **工具名称**: `eohr`
|
|
5
|
+
> **用途**: 在鸿蒙版 Electron 工程中热加载你的 JS/TS 应用代码,无需重建 HAP
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 这是什么
|
|
10
|
+
|
|
11
|
+
`eohr` 是一个命令行工具。你修改 Electron 应用代码后,按一个组合键就能把代码打包推送到设备并重载,**不用重建 HAP**。
|
|
12
|
+
|
|
13
|
+
### 没用 eohr vs 用了 eohr
|
|
14
|
+
|
|
15
|
+
| | 没用 eohr | 用了 eohr |
|
|
16
|
+
|---|-----------|-----------|
|
|
17
|
+
| 流程 | 改代码 → 重建 HAP → 卸载 → 安装 → 启动 | 改代码 → 保存 → 按 Ctrl+Shift+X → 看结果 |
|
|
18
|
+
| 耗时 | 3~4 分钟 | 1~15 秒 |
|
|
19
|
+
| 操作 | 全程手动 | 改完按一下键 |
|
|
20
|
+
|
|
21
|
+
### 对开发者文件的影响
|
|
22
|
+
|
|
23
|
+
| 文件 | 操作 | 说明 |
|
|
24
|
+
|------|------|------|
|
|
25
|
+
| `hot-reload-agent.js` | **新增** | 设备侧 agent,工具自动管理,`eohr clean` 时自动删除 |
|
|
26
|
+
| `package.json` | **改一行** | `main` 字段指向 agent,`eohr clean` 时自动改回原始值 |
|
|
27
|
+
| `main.js` | **不碰** | 你的代码原封不动,从头到尾不会被修改 |
|
|
28
|
+
|
|
29
|
+
调试结束后执行 `eohr clean`,新增的文件自动删除,`package.json` 自动还原,工程恢复到 `eohr init` 之前的状态,不留任何痕迹。
|
|
30
|
+
|
|
31
|
+
### 适用范围
|
|
32
|
+
|
|
33
|
+
| 改了什么 | 能热加载? |
|
|
34
|
+
|---------|-----------|
|
|
35
|
+
| 你的 JS/TS 应用代码 (main.js、业务逻辑、UI) | ✅ |
|
|
36
|
+
| TypeScript 代码 | ✅ (esbuild 原生支持) |
|
|
37
|
+
| ETS Adapter 代码 (*.ets) | ❌ 需重建 HAP |
|
|
38
|
+
| `module.json5` / `build-profile.json5` | ❌ 需重建 HAP |
|
|
39
|
+
| `libelectron.so` / `libadapter.so` | ❌ 需重建 HAP |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 2. 环境准备
|
|
44
|
+
|
|
45
|
+
### 2.1 前置条件
|
|
46
|
+
|
|
47
|
+
- Node.js >= 16
|
|
48
|
+
- hdc 已安装(DevEco Studio 自带,需设置 `DEVECO_SDK_HOME` 或加入 PATH)
|
|
49
|
+
- HarmonyOS 2in1 / tablet 设备已连接
|
|
50
|
+
|
|
51
|
+
### 2.2 确认 hdc
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
hdc list targets
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
如果报错,设置 `DEVECO_SDK_HOME` 环境变量并把 hdc 加入 PATH:
|
|
58
|
+
|
|
59
|
+
**Windows (PowerShell)**:
|
|
60
|
+
```powershell
|
|
61
|
+
$env:DEVECO_SDK_HOME = "D:\Program Files\Huawei\DevEco Studio\sdk"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**macOS**:
|
|
65
|
+
|
|
66
|
+
打开配置文件:
|
|
67
|
+
```bash
|
|
68
|
+
nano ~/.zshrc
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
在文件末尾加入:
|
|
72
|
+
```bash
|
|
73
|
+
export PATH=$PATH:/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/toolchains
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
保存退出(`Ctrl+O` 回车,`Ctrl+X`),然后执行:
|
|
77
|
+
```bash
|
|
78
|
+
source ~/.zshrc
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 2.3 安装 eohr
|
|
82
|
+
|
|
83
|
+
**第一步:安装依赖**
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
cd <eohr工具所在路径>/electron-ohos-hotreload
|
|
87
|
+
npm install
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**第二步:配置快捷命令**
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
node <eohr工具所在路径>/electron-ohos-hotreload/bin/eohr.js setup
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
这一步会自动检测你的终端类型(PowerShell / cmd / bash / zsh),自动写入配置:
|
|
97
|
+
|
|
98
|
+
| 平台 | 终端 | 自动做的事 |
|
|
99
|
+
|------|------|-----------|
|
|
100
|
+
| Windows | PowerShell | 在 `$PROFILE` 写入 `function eohr`,设置执行策略为 RemoteSigned |
|
|
101
|
+
| Windows | cmd | 创建 `eohr.bat` 到用户目录,自动加入 PATH |
|
|
102
|
+
| macOS | zsh/bash | 在 `~/.zshrc` 或 `~/.bash_profile` 写入 `alias eohr` |
|
|
103
|
+
| Linux | bash | 在 `~/.bashrc` 写入 `alias eohr` |
|
|
104
|
+
|
|
105
|
+
**第三步:重新打开终端,验证**
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
eohr --version
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
输出:
|
|
112
|
+
```
|
|
113
|
+
1.0.0
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
> 如果不想配置快捷命令,后续所有命令把 `eohr` 替换为 `node <eohr路径>/bin/eohr.js` 即可。
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## 3. 快速开始
|
|
121
|
+
|
|
122
|
+
### 3.1 初始化(一次性)
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
cd <你的工作区路径>/ohos_hap
|
|
126
|
+
eohr init
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
输出:
|
|
130
|
+
```
|
|
131
|
+
Electron OHOS Hot-Reload v1.0.0
|
|
132
|
+
──────────────────────────────────────
|
|
133
|
+
Bundle: com.huawei.ohos_electron
|
|
134
|
+
Entry: web_engine/src/main/resources/resfile/resources/app/main.js
|
|
135
|
+
Strategy: hard
|
|
136
|
+
HAP: D:\code\...\ohos_hap
|
|
137
|
+
|
|
138
|
+
[info] 已新增 hot-reload-agent.js
|
|
139
|
+
[info] package.json main: "main.js" → "hot-reload-agent.js"
|
|
140
|
+
[info] 已生成 .eohr.config.json
|
|
141
|
+
|
|
142
|
+
✓ init 完成
|
|
143
|
+
|
|
144
|
+
改动清单:
|
|
145
|
+
+ hot-reload-agent.js (新增)
|
|
146
|
+
~ package.json (main → hot-reload-agent.js)
|
|
147
|
+
main.js (未改动)
|
|
148
|
+
|
|
149
|
+
下一步:
|
|
150
|
+
1. 重建 HAP 并安装 (仅此一次):
|
|
151
|
+
hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon
|
|
152
|
+
hdc install <hap-path>
|
|
153
|
+
|
|
154
|
+
2. 启动热加载:
|
|
155
|
+
eohr watch
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**这一步只做了两件事**:
|
|
159
|
+
1. 在 app 目录新增了 `hot-reload-agent.js`
|
|
160
|
+
2. 把 `package.json` 的 `main` 从 `"main.js"` 改成 `"hot-reload-agent.js"`
|
|
161
|
+
|
|
162
|
+
**你的 `main.js` 没有被改动。**
|
|
163
|
+
|
|
164
|
+
### 3.2 重建 HAP(仅此一次)
|
|
165
|
+
|
|
166
|
+
因为 `package.json` 改了,需要重新打包 HAP。用 DevEco Studio 打开工程,签名后构建:
|
|
167
|
+
|
|
168
|
+
**方式一:DevEco Studio 构建(推荐)**
|
|
169
|
+
|
|
170
|
+
1. DevEco Studio 打开 `ohos_hap` 工程
|
|
171
|
+
2. `File → Project Structure → Signing Configs` 勾选自动签名
|
|
172
|
+
3. `Build → Build HAP(s) → Build HAP(s)`
|
|
173
|
+
4. 构建完成后得到签名 HAP
|
|
174
|
+
|
|
175
|
+
**方式二:命令行构建**
|
|
176
|
+
|
|
177
|
+
**Windows (PowerShell)**:
|
|
178
|
+
```powershell
|
|
179
|
+
# 设置环境变量
|
|
180
|
+
$env:DEVECO_SDK_HOME = "D:\Program Files\Huawei\DevEco Studio\sdk"
|
|
181
|
+
$env:PATH = "D:\Program Files\Huawei\DevEco Studio\tools\node;D:\Program Files\Huawei\DevEco Studio\jbr\bin;" + $env:PATH
|
|
182
|
+
|
|
183
|
+
# 清缓存
|
|
184
|
+
Remove-Item ".hvigor\cache" -Recurse -Force -ErrorAction SilentlyContinue
|
|
185
|
+
Remove-Item "electron\build" -Recurse -Force -ErrorAction SilentlyContinue
|
|
186
|
+
|
|
187
|
+
# 构建
|
|
188
|
+
& "D:\Program Files\Huawei\DevEco Studio\tools\hvigor\bin\hvigorw.bat" assembleHap --mode module -p product=default -p buildMode=debug --no-daemon
|
|
189
|
+
|
|
190
|
+
# 安装
|
|
191
|
+
hdc install electron\build\default\outputs\default\electron-default-signed.hap
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**macOS**:
|
|
195
|
+
```bash
|
|
196
|
+
# 设置环境变量
|
|
197
|
+
export DEVECO_SDK_HOME="/Applications/DevEco-Studio.app/Contents/sdk"
|
|
198
|
+
export PATH="/Applications/DevEco-Studio.app/Contents/tools/node:/Applications/DevEco-Studio.app/Contents/jbr/Contents/bin:$PATH"
|
|
199
|
+
|
|
200
|
+
# 清缓存
|
|
201
|
+
rm -rf .hvigor/cache electron/build
|
|
202
|
+
|
|
203
|
+
# 构建
|
|
204
|
+
/Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon
|
|
205
|
+
|
|
206
|
+
# 安装
|
|
207
|
+
hdc install electron/build/default/outputs/default/electron-default-signed.hap
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
> 之后只要不改 ETS/原生库,再也不需要重建 HAP。
|
|
211
|
+
|
|
212
|
+
### 3.3 启动热加载
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
eohr watch
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
输出:
|
|
219
|
+
```
|
|
220
|
+
Electron OHOS Hot-Reload v1.0.0
|
|
221
|
+
──────────────────────────────────────
|
|
222
|
+
Bundle: com.huawei.ohos_electron
|
|
223
|
+
Entry: web_engine/.../app/main.js
|
|
224
|
+
Strategy: hard
|
|
225
|
+
HAP: D:\code\...\ohos_hap
|
|
226
|
+
|
|
227
|
+
[info] hdc: D:\Program Files\...\hd
|
|
228
|
+
c.exe
|
|
229
|
+
[info] 模式: manual (按 Ctrl+Shift+X 推送)
|
|
230
|
+
[info] 首次推送...
|
|
231
|
+
[bundle] esbuild... (120ms)
|
|
232
|
+
[send] hdc file send... ok
|
|
233
|
+
[reload] hard (restart)
|
|
234
|
+
● agent-ready
|
|
235
|
+
● loaded
|
|
236
|
+
[ready] manual 模式
|
|
237
|
+
──────────────────────────────────────
|
|
238
|
+
Ctrl+Shift+X 推送并重载
|
|
239
|
+
q / Ctrl+C 退出
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 3.4 修改代码,按 Ctrl+Shift+X 重载
|
|
243
|
+
|
|
244
|
+
在编辑器里改你的 `main.js`,保存。终端会显示待推送的文件:
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
[pending] main.js (按 Ctrl+Shift+X 推送)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
改完后切到终端,按 `Ctrl+Shift+X`:
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
[info] 推送 1 个文件变更: main.js
|
|
254
|
+
[bundle] esbuild... (85ms)
|
|
255
|
+
[send] ok
|
|
256
|
+
[info] 重启应用...
|
|
257
|
+
[reload] hard (restart)
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**日常循环:改代码 → 保存 → 按 Ctrl+Shift+X → 看结果。**
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## 4. 命令参考
|
|
265
|
+
|
|
266
|
+
> 以下命令均假设已按 2.3 设置了 `eohr` 快捷命令。未设置的,将 `eohr` 替换为 `node <eohr路径>/bin/eohr.js`。
|
|
267
|
+
|
|
268
|
+
### eohr setup
|
|
269
|
+
|
|
270
|
+
自动配置快捷命令。
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
node <eohr路径>/bin/eohr.js setup
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
自动检测终端类型(PowerShell / cmd / bash / zsh),自动写入配置,重新打开终端即可用 `eohr` 命令。
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
### eohr init
|
|
281
|
+
|
|
282
|
+
一次性初始化。新增 agent 文件 + 改 `package.json` 一行。
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
eohr init [--hap-root <path>] [--entry <path>]
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
| 选项 | 说明 | 默认 |
|
|
289
|
+
|------|------|------|
|
|
290
|
+
| `--hap-root` | HAP 工程根目录 | 自动探测 |
|
|
291
|
+
| `--bundle-name` | 应用包名 | 从 app.json5 读取 |
|
|
292
|
+
| `--app-dir` | app 目录 | 自动探测 |
|
|
293
|
+
| `--entry` | 入口文件 | 自动探测 |
|
|
294
|
+
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
### eohr watch
|
|
298
|
+
|
|
299
|
+
启动热加载循环(日常最常用)。
|
|
300
|
+
|
|
301
|
+
**默认手动模式**:文件监听只记录变更,不自动推送。你改完代码后按 **Ctrl+Shift+X** 触发推送+重载。
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
eohr watch
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
输出:
|
|
308
|
+
```
|
|
309
|
+
[ready] manual 模式
|
|
310
|
+
──────────────────────────────────────
|
|
311
|
+
Ctrl+Shift+X 推送并重载
|
|
312
|
+
q / Ctrl+C 退出
|
|
313
|
+
|
|
314
|
+
[pending] main.js (按 Ctrl+Shift+X 推送)
|
|
315
|
+
[pending] window.ts (按 Ctrl+Shift+X 推送)
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
按 Ctrl+Shift+X:
|
|
319
|
+
```
|
|
320
|
+
[info] 推送 2 个文件变更: main.js, window.ts
|
|
321
|
+
[bundle] esbuild... (85ms)
|
|
322
|
+
[send] ok
|
|
323
|
+
[info] 重启应用...
|
|
324
|
+
[reload] hard (restart)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
### 自定义触发键
|
|
328
|
+
|
|
329
|
+
编辑 `.eohr.config.json`:
|
|
330
|
+
|
|
331
|
+
```json
|
|
332
|
+
{
|
|
333
|
+
"triggerKey": "ctrl+r"
|
|
334
|
+
}
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
格式:修饰键用 `+` 连接,最后是主键。
|
|
338
|
+
|
|
339
|
+
| 值 | 按键 |
|
|
340
|
+
|------|------|
|
|
341
|
+
| `"ctrl+shift+x"` | Ctrl+Shift+X(默认) |
|
|
342
|
+
| `"ctrl+r"` | Ctrl+R |
|
|
343
|
+
| `"ctrl+alt+t"` | Ctrl+Alt+T |
|
|
344
|
+
| `"f5"` | F5 功能键 |
|
|
345
|
+
| `"space"` | 空格键 |
|
|
346
|
+
| `"enter"` | 回车键 |
|
|
347
|
+
|
|
348
|
+
也可以命令行指定:
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
eohr watch --trigger-key ctrl+r
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
**auto 模式**(保存即推送,无需按键):
|
|
355
|
+
|
|
356
|
+
```bash
|
|
357
|
+
eohr watch --auto
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
| 选项 | 说明 | 默认 |
|
|
361
|
+
|------|------|------|
|
|
362
|
+
| `--strategy` | 重载策略 | hard |
|
|
363
|
+
| `--entry` | 入口文件 | 从配置读取 |
|
|
364
|
+
| `--trigger-key` | 触发键 | ctrl+shift+x |
|
|
365
|
+
| `--auto` | 保存即自动推送 | 手动模式 |
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
### eohr push
|
|
370
|
+
|
|
371
|
+
单次打包推送,不启动持续监听。
|
|
372
|
+
|
|
373
|
+
```bash
|
|
374
|
+
eohr push [--file <f>] [--no-trigger] [--entry <path>]
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
输出:
|
|
378
|
+
```
|
|
379
|
+
[push] bundleName=com.huawei.ohos_electron
|
|
380
|
+
[bundle] esbuild...
|
|
381
|
+
entry: web_engine/src/main/resources/resfile/resources/app/main.js
|
|
382
|
+
[ok] bundled (508ms)
|
|
383
|
+
[send] hdc file send...
|
|
384
|
+
[ok] entry.js pushed
|
|
385
|
+
重启应用...
|
|
386
|
+
[reload] app restarted
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
| 选项 | 说明 |
|
|
390
|
+
|------|------|
|
|
391
|
+
| `--file <path>` | 推送单个文件(而非打包入口) |
|
|
392
|
+
| `--no-trigger` | 推送但不触发重载 |
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
### eohr status
|
|
397
|
+
|
|
398
|
+
查询设备 agent 状态。
|
|
399
|
+
|
|
400
|
+
```bash
|
|
401
|
+
eohr status
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
输出:
|
|
405
|
+
```
|
|
406
|
+
[status] bundleName=com.huawei.ohos_electron
|
|
407
|
+
──────────────────────────────────────
|
|
408
|
+
Device: connected
|
|
409
|
+
Status: loaded
|
|
410
|
+
PID: 61525
|
|
411
|
+
Strategy: hard
|
|
412
|
+
Entry.js: exists
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
---
|
|
416
|
+
|
|
417
|
+
### eohr strategy
|
|
418
|
+
|
|
419
|
+
查看或切换重载策略。
|
|
420
|
+
|
|
421
|
+
```bash
|
|
422
|
+
eohr strategy # 查看当前策略
|
|
423
|
+
eohr strategy hard # 硬重载(默认)
|
|
424
|
+
eohr strategy soft # 软重载
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
输出:
|
|
428
|
+
```
|
|
429
|
+
[strategy] 当前: hard
|
|
430
|
+
|
|
431
|
+
可选值:
|
|
432
|
+
soft 仅软重载 (require.cache 失效, ~1-3s)
|
|
433
|
+
hard 仅硬重载 (app.quit + restart, ~15s, 默认)
|
|
434
|
+
hard-first 软重载优先, 失败回退硬重载
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
| 策略 | 耗时 | 说明 |
|
|
438
|
+
|------|------|------|
|
|
439
|
+
| `hard` | ~15s | 杀进程重启,完全干净(默认,推荐) |
|
|
440
|
+
| `soft` | 1~3s | require.cache 失效,不重启应用(有副作用残留) |
|
|
441
|
+
| `hard-first` | 1~3s / 15s | 先 soft,失败回退 hard |
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
### eohr log
|
|
446
|
+
|
|
447
|
+
查看设备运行日志。
|
|
448
|
+
|
|
449
|
+
```bash
|
|
450
|
+
eohr log # 最近 50 行
|
|
451
|
+
eohr log 100 # 最近 100 行
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
输出:
|
|
455
|
+
```
|
|
456
|
+
[log] 最近 50 行
|
|
457
|
+
──────────────────────────────────────
|
|
458
|
+
2026-09-10T09:34:50.204Z [agent] config loaded: {"strategy":"hard","softTimeout":5000}
|
|
459
|
+
2026-09-10T09:34:50.205Z [agent] agent started, strategy=hard
|
|
460
|
+
2026-09-10T09:34:50.205Z [agent] loading entry.js from override
|
|
461
|
+
2026-09-10T09:34:50.206Z [agent] first load done
|
|
462
|
+
2026-09-10T09:34:50.206Z [agent] fs.watch active on /data/storage/el2/base/files/hot
|
|
463
|
+
2026-09-10T09:36:19.046Z [agent] watch event: change entry.js
|
|
464
|
+
2026-09-10T09:36:19.047Z [agent] hard reload: waiting for host to restart
|
|
465
|
+
2026-09-10T09:36:19.925Z [agent] config loaded: {"strategy":"hard","softTimeout":5000}
|
|
466
|
+
2026-09-10T09:36:19.925Z [agent] agent started, strategy=hard
|
|
467
|
+
2026-09-10T09:36:19.925Z [agent] loading entry.js from override
|
|
468
|
+
2026-09-10T09:36:19.926Z [agent] first load done
|
|
469
|
+
```
|
|
470
|
+
|
|
471
|
+
---
|
|
472
|
+
|
|
473
|
+
### eohr clean
|
|
474
|
+
|
|
475
|
+
恢复工程到 `eohr init` 之前的状态 + 清空设备。
|
|
476
|
+
|
|
477
|
+
```bash
|
|
478
|
+
eohr clean
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
输出:
|
|
482
|
+
```
|
|
483
|
+
[info] 开始恢复工程
|
|
484
|
+
[ok] hot-reload-agent.js 已删除
|
|
485
|
+
[ok] package.json main → "main.js"
|
|
486
|
+
[ok] .eohr.config.json 已删除
|
|
487
|
+
清空设备...
|
|
488
|
+
[ok] 设备已清空
|
|
489
|
+
|
|
490
|
+
✓ clean 完成
|
|
491
|
+
|
|
492
|
+
工程已恢复到 eohr init 之前的状态。
|
|
493
|
+
请重建 HAP 让恢复生效:
|
|
494
|
+
hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon
|
|
495
|
+
hdc install <hap>
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
做了什么:
|
|
499
|
+
1. 删除 `hot-reload-agent.js`
|
|
500
|
+
2. `package.json` 的 `main` 改回 `"main.js"`
|
|
501
|
+
3. 删除 `.eohr.config.json`
|
|
502
|
+
4. 清空设备 override 目录
|
|
503
|
+
|
|
504
|
+
跑完后工程干干净净,重建 HAP 即可恢复原始状态。
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## 5. 配置文件
|
|
509
|
+
|
|
510
|
+
### .eohr.config.json
|
|
511
|
+
|
|
512
|
+
`eohr init` 自动生成,可手动编辑:
|
|
513
|
+
|
|
514
|
+
```json
|
|
515
|
+
{
|
|
516
|
+
"bundleName": "com.huawei.ohos_electron",
|
|
517
|
+
"hapRoot": "<你的工作区路径>/ohos_hap",
|
|
518
|
+
"appDir": "<你的工作区路径>/ohos_hap/web_engine/src/main/resources/resfile/resources/app",
|
|
519
|
+
"entry": "web_engine/src/main/resources/resfile/resources/app/main.js",
|
|
520
|
+
"strategy": "hard",
|
|
521
|
+
"triggerKey": "ctrl+shift+x",
|
|
522
|
+
"watch": [
|
|
523
|
+
"web_engine/src/main/resources/resfile/resources/app/**/*.ts",
|
|
524
|
+
"web_engine/src/main/resources/resfile/resources/app/**/*.js",
|
|
525
|
+
"src/**/*.ts",
|
|
526
|
+
"src/**/*.js"
|
|
527
|
+
],
|
|
528
|
+
"ignore": ["node_modules/**", "dist/**", ".git/**"],
|
|
529
|
+
"userId": 100
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
| 字段 | 说明 | 默认 |
|
|
534
|
+
|------|------|------|
|
|
535
|
+
| `entry` | 你的应用入口文件 | 自动探测 |
|
|
536
|
+
| `strategy` | 重载策略 | hard |
|
|
537
|
+
| `triggerKey` | 触发键(手动模式) | ctrl+shift+x |
|
|
538
|
+
| `watch` | 监听的文件模式 | 自动探测(含 app 目录 + src 目录) |
|
|
539
|
+
| `userId` | OHOS 用户 ID | 100 |
|
|
540
|
+
|
|
541
|
+
### 指定入口文件
|
|
542
|
+
|
|
543
|
+
默认自动探测你的 `main.js`。也可以指定其他文件:
|
|
544
|
+
|
|
545
|
+
```bash
|
|
546
|
+
eohr init --entry src/index.ts
|
|
547
|
+
eohr watch --entry app/main.js
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
或编辑 `.eohr.config.json`:
|
|
551
|
+
```json
|
|
552
|
+
{
|
|
553
|
+
"entry": "src/index.ts"
|
|
554
|
+
}
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
---
|
|
558
|
+
|
|
559
|
+
## 6. 重载策略详解
|
|
560
|
+
|
|
561
|
+
### hard(默认,推荐)
|
|
562
|
+
|
|
563
|
+
杀进程重启应用。完全干净,无副作用残留。
|
|
564
|
+
|
|
565
|
+
这是 Electron 主进程热加载的业界标准做法。`electron-reload`、`electronmon` 等工具均采用杀进程重启方式,因为主进程的窗口、IPC、定时器等副作用无法通过清缓存完全回收。
|
|
566
|
+
|
|
567
|
+
耗时 ~15 秒。
|
|
568
|
+
|
|
569
|
+
### soft
|
|
570
|
+
|
|
571
|
+
清除 `require.cache`,重新加载。快(1~3s),应用不重启。
|
|
572
|
+
|
|
573
|
+
**限制**:不会自动关闭上一轮创建的 BrowserWindow、已注册的 protocol/ipcMain、定时器等。会出现重复窗口、重复监听等问题。仅适用于无副作用的纯逻辑模块。
|
|
574
|
+
|
|
575
|
+
### 何时切换
|
|
576
|
+
|
|
577
|
+
```bash
|
|
578
|
+
eohr strategy soft # 代码无副作用(纯逻辑),追求速度
|
|
579
|
+
eohr strategy hard # 切回默认
|
|
580
|
+
```
|
|
581
|
+
|
|
582
|
+
---
|
|
583
|
+
|
|
584
|
+
## 7. 日常开发工作流
|
|
585
|
+
|
|
586
|
+
### 标准流程
|
|
587
|
+
|
|
588
|
+
```
|
|
589
|
+
1. eohr watch (保持运行)
|
|
590
|
+
2. 编辑器里改代码(就是改你自己的 main.js 或其他文件)
|
|
591
|
+
3. 保存 (Ctrl+S) ← 终端显示 [pending]
|
|
592
|
+
4. 切到终端按 Ctrl+Shift+X ← 推送并重载
|
|
593
|
+
5. 看终端状态
|
|
594
|
+
6. 回到 2
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
> 如果你更喜欢保存即推送(不需要按键),用 `eohr watch --auto`。
|
|
598
|
+
|
|
599
|
+
### 示例
|
|
600
|
+
|
|
601
|
+
你的 `main.js`:
|
|
602
|
+
|
|
603
|
+
```javascript
|
|
604
|
+
const { app, BrowserWindow } = require('electron');
|
|
605
|
+
|
|
606
|
+
app.whenReady().then(() => {
|
|
607
|
+
const win = new BrowserWindow({ width: 800, height: 600 });
|
|
608
|
+
win.loadURL('https://cn.bing.com');
|
|
609
|
+
});
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
改成:
|
|
613
|
+
|
|
614
|
+
```javascript
|
|
615
|
+
app.whenReady().then(() => {
|
|
616
|
+
const win = new BrowserWindow({ width: 1024, height: 768 });
|
|
617
|
+
win.loadURL('https://www.baidu.com');
|
|
618
|
+
});
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
保存 → 切到终端按 Ctrl+Shift+X → 十几秒后设备上的窗口尺寸和 URL 自动更新。
|
|
622
|
+
|
|
623
|
+
### 多文件修改
|
|
624
|
+
|
|
625
|
+
同时改多个文件时,变更会攒在 `pendingChanges` 里,一次 Ctrl+Shift+X 全部推送。
|
|
626
|
+
|
|
627
|
+
---
|
|
628
|
+
|
|
629
|
+
## 8. 故障排查
|
|
630
|
+
|
|
631
|
+
### 设备未连接
|
|
632
|
+
|
|
633
|
+
```bash
|
|
634
|
+
hdc list targets
|
|
635
|
+
hdc kill
|
|
636
|
+
hdc start
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
### 找不到 hdc
|
|
640
|
+
|
|
641
|
+
**Windows (PowerShell)**:
|
|
642
|
+
```powershell
|
|
643
|
+
$env:DEVECO_SDK_HOME = "D:\Program Files\Huawei\DevEco Studio\sdk"
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
**macOS**:
|
|
647
|
+
|
|
648
|
+
在 `~/.zshrc` 中添加:
|
|
649
|
+
```bash
|
|
650
|
+
export PATH=$PATH:/Applications/DevEco-Studio.app/Contents/sdk/default/openharmony/toolchains
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
然后执行 `source ~/.zshrc`。
|
|
654
|
+
|
|
655
|
+
### HAP 安装失败(无签名)
|
|
656
|
+
|
|
657
|
+
需要通过 DevEco Studio 配置签名:
|
|
658
|
+
1. DevEco Studio 打开工程
|
|
659
|
+
2. `File → Project Structure → Signing Configs` 勾选自动签名
|
|
660
|
+
3. 重新构建 HAP
|
|
661
|
+
|
|
662
|
+
### soft 重载总是失败
|
|
663
|
+
|
|
664
|
+
```bash
|
|
665
|
+
eohr strategy hard
|
|
666
|
+
eohr push
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
### 查看设备日志
|
|
670
|
+
|
|
671
|
+
```bash
|
|
672
|
+
eohr log
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
### 恢复原始状态(取消热加载)
|
|
676
|
+
|
|
677
|
+
```bash
|
|
678
|
+
eohr clean
|
|
679
|
+
# 然后重建 HAP(用 DevEco Studio 或命令行,见 3.2 节)
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
`eohr clean` 会自动删除 agent 文件、还原 `package.json`、删除配置。你的 `main.js` 从头到尾没被动过。
|
|
683
|
+
|
|
684
|
+
---
|
|
685
|
+
|
|
686
|
+
## 9. 命令速查
|
|
687
|
+
|
|
688
|
+
| 命令 | 说明 |
|
|
689
|
+
|------|------|
|
|
690
|
+
| `eohr setup` | 自动配置快捷命令(PowerShell/cmd/bash/zsh) |
|
|
691
|
+
| `eohr init` | 一次性初始化(新增 agent + 改 package.json 一行) |
|
|
692
|
+
| `eohr watch` | 启动热加载(日常用这个,按 Ctrl+Shift+X 推送) |
|
|
693
|
+
| `eohr watch --auto` | 保存即自动推送 |
|
|
694
|
+
| `eohr push` | 单次推送 |
|
|
695
|
+
| `eohr status` | 查询设备状态 |
|
|
696
|
+
| `eohr strategy` | 查看/切换策略 |
|
|
697
|
+
| `eohr log` | 查看设备日志 |
|
|
698
|
+
| `eohr clean` | 恢复工程 + 清空设备 |
|
|
699
|
+
|
|
700
|
+
---
|
|
701
|
+
|
|
702
|
+
## 10. FAQ
|
|
703
|
+
|
|
704
|
+
**Q: eohr init 改了我的 main.js 吗?**
|
|
705
|
+
|
|
706
|
+
没有。`eohr init` 只做了两件事:新增 `hot-reload-agent.js`,把 `package.json` 的 `main` 字段指向它。你的 `main.js` 原封不动。
|
|
707
|
+
|
|
708
|
+
**Q: eohr 命令找不到怎么办?**
|
|
709
|
+
|
|
710
|
+
运行 `node <eohr路径>/bin/eohr.js setup` 自动配置快捷命令,然后重新打开终端。或者把所有 `eohr` 替换为 `node <eohr路径>/bin/eohr.js`。
|
|
711
|
+
|
|
712
|
+
**Q: npm install 报权限错误怎么办?**
|
|
713
|
+
|
|
714
|
+
不要用 `npm install -g`(全局安装),在 eohr 工具目录下用 `npm install`(本地安装)即可。
|
|
715
|
+
|
|
716
|
+
**Q: 入口文件怎么指定?**
|
|
717
|
+
|
|
718
|
+
`eohr init` 自动探测你的 `main.js`。也可以 `--entry src/index.ts` 或编辑 `.eohr.config.json`。
|
|
719
|
+
|
|
720
|
+
**Q: 可以用 TypeScript 吗?**
|
|
721
|
+
|
|
722
|
+
可以,esbuild 原生支持,无需预编译。
|
|
723
|
+
|
|
724
|
+
**Q: 我的代码依赖 npm 包怎么办?**
|
|
725
|
+
|
|
726
|
+
esbuild 会把 `node_modules` 中的依赖打进 `entry.js` 单文件。确保工程根目录有 `node_modules`。
|
|
727
|
+
|
|
728
|
+
**Q: 改了 ETS 代码怎么办?**
|
|
729
|
+
|
|
730
|
+
必须重建 HAP:
|
|
731
|
+
```bash
|
|
732
|
+
hvigorw assembleHap --mode module -p product=default -p buildMode=debug --no-daemon
|
|
733
|
+
hdc install <hap>
|
|
734
|
+
eohr watch
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
**Q: 生产 HAP 会受影响吗?**
|
|
738
|
+
|
|
739
|
+
不会。如果 override 目录没有 `entry.js`,agent 直接加载你的 `main.js`,行为与未安装 eohr 完全一致。
|
|
740
|
+
|
|
741
|
+
**Q: 触发键可以改吗?**
|
|
742
|
+
|
|
743
|
+
可以,编辑 `.eohr.config.json` 的 `triggerKey` 字段,或 `eohr watch --trigger-key ctrl+r`。
|
|
744
|
+
|
|
745
|
+
**Q: 不想每次按键,想保存就推送?**
|
|
746
|
+
|
|
747
|
+
用 `eohr watch --auto`。
|
|
748
|
+
|
|
749
|
+
**Q: 如何查看设备日志?**
|
|
750
|
+
|
|
751
|
+
```bash
|
|
752
|
+
eohr log
|
|
753
|
+
```
|
|
754
|
+
|
|
755
|
+
**Q: userId 不是 100?**
|
|
756
|
+
|
|
757
|
+
编辑 `.eohr.config.json` 的 `userId` 字段。
|
|
758
|
+
|
|
759
|
+
**Q: 不想用热加载了怎么恢复?**
|
|
760
|
+
|
|
761
|
+
```bash
|
|
762
|
+
eohr clean
|
|
763
|
+
# 重建 HAP(见 3.2 节)
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
`eohr clean` 会删除 agent、还原 `package.json`、删除配置。你的代码从头到尾没被动过。
|