nexfep 0.4.4 → 0.5.1

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/README-CN.md CHANGED
@@ -37,13 +37,13 @@ pnpm add nexfep
37
37
  ## 快速开始
38
38
 
39
39
  ```typescript
40
- import { Application } from 'nexfep';
40
+ import { Application } from "nexfep";
41
41
 
42
42
  const app = new Application();
43
43
 
44
44
  const window = await app.windows.createWindow(true, false);
45
45
 
46
- await window.loadHTML('<h1 nexfep-area-drag>Hello Nexfep!</h1>');
46
+ await window.loadHTML("<h1 nexfep-area-drag>Hello Nexfep!</h1>");
47
47
  ```
48
48
 
49
49
  ## 使用指南
@@ -53,21 +53,21 @@ await window.loadHTML('<h1 nexfep-area-drag>Hello Nexfep!</h1>');
53
53
  `Application` 是框架的主入口,负责管理应用生命周期,提供窗口、系统托盘和日志的访问。
54
54
 
55
55
  ```typescript
56
- import { Application } from 'nexfep';
56
+ import { Application } from "nexfep";
57
57
 
58
58
  const app = new Application();
59
59
  // 或指定自定义 WebView2 用户数据目录(仅 Windows 生效)
60
- const app = new Application({ WindowsWebview2UserDataFolder: 'C:\\custom\\webview2-data' });
60
+ const app = new Application({ WindowsWebview2UserDataFolder: "C:\\custom\\webview2-data" });
61
61
  // 或指定日志文件路径
62
- const app = new Application({ LogFilePath: './app.log' });
62
+ const app = new Application({ LogFilePath: "./app.log" });
63
63
  ```
64
64
 
65
65
  **构造函数参数**
66
66
 
67
- | 选项 | 类型 | 默认值 | 说明 |
68
- |------|------|--------|------|
67
+ | 选项 | 类型 | 默认值 | 说明 |
68
+ | ------------------------------- | ---------------- | ------------------------------------------------ | ----------------------------------- |
69
69
  | `WindowsWebview2UserDataFolder` | `string`(可选) | `%LOCALAPPDATA%\NexfepDevelopment.webview2-data` | WebView2 用户数据目录(仅 Windows) |
70
- | `LogFilePath` | `string`(可选) | 无 | 日志文件输出路径 |
70
+ | `LogFilePath` | `string`(可选) | 无 | 日志文件输出路径 |
71
71
 
72
72
  **属性**
73
73
 
@@ -78,6 +78,7 @@ const app = new Application({ LogFilePath: './app.log' });
78
78
  **方法**
79
79
 
80
80
  - `createTray(options)` — 创建系统托盘图标和右键菜单
81
+ - `createLocker(appName)` — 创建应用实例锁,防止多个实例运行
81
82
  - `exit()` — 退出应用
82
83
 
83
84
  ### Logger
@@ -85,21 +86,21 @@ const app = new Application({ LogFilePath: './app.log' });
85
86
  Logger 支持文件输出和彩色控制台输出,可通过 `app.logger` 访问。
86
87
 
87
88
  ```typescript
88
- app.logger.log('Hello World');
89
- app.logger.error('发生错误');
90
- app.logger.warn('警告信息');
91
- app.logger.info('提示信息');
92
- app.logger.debug('调试信息');
89
+ app.logger.log("Hello World");
90
+ app.logger.error("发生错误");
91
+ app.logger.warn("警告信息");
92
+ app.logger.info("提示信息");
93
+ app.logger.debug("调试信息");
93
94
  ```
94
95
 
95
96
  **方法**
96
97
 
97
- | 方法 | 说明 |
98
- |------|------|
99
- | `log(message)` | 记录日志 |
98
+ | 方法 | 说明 |
99
+ | ---------------- | -------------------- |
100
+ | `log(message)` | 记录日志 |
100
101
  | `error(message)` | 记录错误日志(红色) |
101
- | `warn(message)` | 记录警告日志(黄色) |
102
- | `info(message)` | 记录提示日志(蓝色) |
102
+ | `warn(message)` | 记录警告日志(黄色) |
103
+ | `info(message)` | 记录提示日志(蓝色) |
103
104
  | `debug(message)` | 记录调试日志(灰色) |
104
105
 
105
106
  每个方法接受字符串或字符串数组作为参数。
@@ -108,24 +109,55 @@ app.logger.debug('调试信息');
108
109
 
109
110
  页面中的 `console.log`、`console.error`、`console.info`、`console.warn`、`console.debug` 调用会被自动拦截并转发到主进程 Logger,输出中包含来源窗口的 ID。
110
111
 
112
+ ### 应用单例锁
113
+
114
+ 通过 `app.createLocker()` 设置应用单例锁。
115
+
116
+ ```typescript
117
+ const locker = app.createLocker("my-app");
118
+ try {
119
+ // 尝试获取应用实例锁
120
+ await locker.lock();
121
+ } catch {
122
+ // 应用实例已存在,退出应用
123
+ app.exit();
124
+ }
125
+ // 在其它实例抢锁时聚焦当前实例
126
+ locker.whenLost(() => {
127
+ if (!win.isFocused()) {
128
+ win.focus();
129
+ }
130
+ });
131
+ // 释放锁
132
+ locker.unlock();
133
+ ```
134
+
135
+ **方法**
136
+
137
+ | 方法 | 描述 |
138
+ | -------------------- | ------------------------ |
139
+ | `lock()` | 尝试获取应用实例锁 |
140
+ | `whenLost(callback)` | 当其它实例抢锁时执行回调 |
141
+ | `unlock()` | 释放锁 |
142
+
111
143
  ### 托盘图标
112
144
 
113
145
  通过 `app.createTray()` 创建和管理系统托盘图标及右键菜单。
114
146
 
115
147
  ```typescript
116
- import { readFileSync } from 'fs';
148
+ import { readFileSync } from "fs";
117
149
 
118
150
  const tray = app.createTray({
119
- id: 'my-tray',
120
- tooltip: '我的应用',
151
+ id: "my-tray",
152
+ tooltip: "我的应用",
121
153
  icon: {
122
- data: readFileSync('./icon.png'),
154
+ data: readFileSync("./icon.png"),
123
155
  width: 32,
124
156
  height: 32,
125
157
  },
126
158
  menuItems: [
127
- { id: 'show', label: '显示窗口' },
128
- { id: 'quit', label: '退出' },
159
+ { id: "show", label: "显示窗口" },
160
+ { id: "quit", label: "退出" },
129
161
  ],
130
162
  });
131
163
  ```
@@ -134,32 +166,32 @@ const tray = app.createTray({
134
166
 
135
167
  ```typescript
136
168
  interface TrayIconImage {
137
- data: Buffer; // 图片二进制数据
138
- width?: number; // 可选宽度
139
- height?: number; // 可选高度
169
+ data: Buffer; // 图片二进制数据
170
+ width?: number; // 可选宽度
171
+ height?: number; // 可选高度
140
172
  }
141
173
  ```
142
174
 
143
175
  **方法**
144
176
 
145
- | 方法 | 描述 |
146
- |---------------------------------------------|--------------------|
147
- | `addMenuItem(item)` | 添加菜单项 |
148
- | `removeMenuItem(id)` | 按 ID 删除菜单项 |
149
- | `setMenuItems(items)` | 替换所有菜单项 |
150
- | `setIcon(icon, width?, height?)` | 更改托盘图标(原始像素数据 `Uint8Array` / `number[]`) |
151
- | `setTooltip(tooltip)` | 更改悬停提示文本 |
152
- | `on(event, callback)` | 监听托盘事件(如 `'click'`) |
153
- | `show()` | 显示托盘图标 |
154
- | `hide()` | 隐藏托盘图标 |
155
- | `destroy()` | 销毁托盘图标 |
177
+ | 方法 | 描述 |
178
+ | -------------------------------- | ------------------------------------------------------ |
179
+ | `addMenuItem(item)` | 添加菜单项 |
180
+ | `removeMenuItem(id)` | 按 ID 删除菜单项 |
181
+ | `setMenuItems(items)` | 替换所有菜单项 |
182
+ | `setIcon(icon, width?, height?)` | 更改托盘图标(原始像素数据 `Uint8Array` / `number[]`) |
183
+ | `setTooltip(tooltip)` | 更改悬停提示文本 |
184
+ | `on(event, callback)` | 监听托盘事件(如 `'click'`) |
185
+ | `show()` | 显示托盘图标 |
186
+ | `hide()` | 隐藏托盘图标 |
187
+ | `destroy()` | 销毁托盘图标 |
156
188
 
157
189
  ```typescript
158
- tray.on('click', () => {
159
- console.log('托盘被点击');
190
+ tray.on("click", () => {
191
+ console.log("托盘被点击");
160
192
  });
161
- tray.addMenuItem({ id: 'about', label: '关于' });
162
- tray.setTooltip('Nexfep 应用');
193
+ tray.addMenuItem({ id: "about", label: "关于" });
194
+ tray.setTooltip("Nexfep 应用");
163
195
  ```
164
196
 
165
197
  ### 桌面通知
@@ -167,7 +199,7 @@ tray.setTooltip('Nexfep 应用');
167
199
  通过 `app.utils.notify()` 发送桌面通知。
168
200
 
169
201
  ```typescript
170
- const notification = app.utils.notify('标题', '通知内容');
202
+ const notification = app.utils.notify("标题", "通知内容");
171
203
  ```
172
204
 
173
205
  **参数**
@@ -202,7 +234,8 @@ window.hide();
202
234
  window.maximize();
203
235
  window.minimize();
204
236
  window.close();
205
- window.setTitle('新标题');
237
+ window.focus();
238
+ window.setTitle("新标题");
206
239
  window.setSize(800, 600);
207
240
  window.openDevTools();
208
241
  ```
@@ -214,7 +247,7 @@ window.openDevTools();
214
247
  在页面中通过 `window.postMessage` 发送消息:
215
248
 
216
249
  ```javascript
217
- window.postMessage({ hello: 'world' });
250
+ window.postMessage({ hello: "world" });
218
251
  ```
219
252
 
220
253
  **参数说明**
@@ -243,8 +276,8 @@ pool.onCustomMessage = (window, data) => {
243
276
  在页面中通过 `window.invoke` 触发事件:
244
277
 
245
278
  ```javascript
246
- window.invoke('hello');
247
- window.invoke('hello', 'world');
279
+ window.invoke("hello");
280
+ window.invoke("hello", "world");
248
281
  ```
249
282
 
250
283
  **参数说明**
@@ -257,8 +290,8 @@ window.invoke('hello', 'world');
257
290
  在主进程中通过 `pool.handle` 监听事件:
258
291
 
259
292
  ```typescript
260
- pool.handle('hello', (data) => {
261
- console.log('收到事件 hello:', data);
293
+ pool.handle("hello", (data) => {
294
+ console.log("收到事件 hello:", data);
262
295
  });
263
296
  ```
264
297
 
@@ -272,8 +305,8 @@ pool.handle('hello', (data) => {
272
305
  在主进程中通过 `pool.unhandle` 取消监听事件:
273
306
 
274
307
  ```typescript
275
- pool.unhandle('hello', (data) => {
276
- console.log('收到事件 hello:', data);
308
+ pool.unhandle("hello", (data) => {
309
+ console.log("收到事件 hello:", data);
277
310
  });
278
311
  ```
279
312
 
@@ -289,7 +322,7 @@ pool.unhandle('hello', (data) => {
289
322
  在页面中通过 `window.setGlobal` 设置全局变量:
290
323
 
291
324
  ```javascript
292
- window.setGlobal('hello', 'world');
325
+ window.setGlobal("hello", "world");
293
326
  ```
294
327
 
295
328
  **参数说明**
@@ -302,7 +335,7 @@ window.setGlobal('hello', 'world');
302
335
  在页面中通过 `window.getGlobal` 获取全局变量:
303
336
 
304
337
  ```javascript
305
- const value = await window.getGlobal('hello');
338
+ const value = await window.getGlobal("hello");
306
339
  ```
307
340
 
308
341
  **参数说明**
@@ -315,8 +348,8 @@ const value = await window.getGlobal('hello');
315
348
 
316
349
  ```typescript
317
350
  const globals = pool.global;
318
- globals.set('hello', 'world');
319
- const value = globals.get('hello');
351
+ globals.set("hello", "world");
352
+ const value = globals.get("hello");
320
353
  ```
321
354
 
322
355
  ### 窗口间通信
@@ -328,7 +361,7 @@ const value = globals.get('hello');
328
361
  通过 `window.broadcast` 向所有其他打开的窗口发送事件:
329
362
 
330
363
  ```javascript
331
- window.broadcast('user-login', { userId: 123 });
364
+ window.broadcast("user-login", { userId: 123 });
332
365
  ```
333
366
 
334
367
  **参数说明**
@@ -339,8 +372,8 @@ window.broadcast('user-login', { userId: 123 });
339
372
  其他窗口通过 `window.addEventListener` 监听广播事件:
340
373
 
341
374
  ```javascript
342
- window.addEventListener('user-login', (event) => {
343
- console.log('用户已登录:', event.detail);
375
+ window.addEventListener("user-login", (event) => {
376
+ console.log("用户已登录:", event.detail);
344
377
  });
345
378
  ```
346
379
 
@@ -349,7 +382,7 @@ window.addEventListener('user-login', (event) => {
349
382
  通过 `window.tell` 向指定 ID 的窗口发送消息:
350
383
 
351
384
  ```javascript
352
- window.tell(2, 'custom-message', { text: '你好,窗口2' });
385
+ window.tell(2, "custom-message", { text: "你好,窗口2" });
353
386
  ```
354
387
 
355
388
  **参数说明**
@@ -361,15 +394,15 @@ window.tell(2, 'custom-message', { text: '你好,窗口2' });
361
394
  目标窗口通过 `window.addEventListener` 接收消息:
362
395
 
363
396
  ```javascript
364
- window.addEventListener('custom-message', (event) => {
365
- console.log('收到消息:', event.detail);
397
+ window.addEventListener("custom-message", (event) => {
398
+ console.log("收到消息:", event.detail);
366
399
  });
367
400
  ```
368
401
 
369
402
  每个窗口的 ID 可通过 `window.id` 获取:
370
403
 
371
404
  ```javascript
372
- console.log('当前窗口 ID:', window.id);
405
+ console.log("当前窗口 ID:", window.id);
373
406
  ```
374
407
 
375
408
  ### 窗口控制函数
@@ -377,20 +410,20 @@ console.log('当前窗口 ID:', window.id);
377
410
  页面中可直接调用以下注入函数进行窗口控制:
378
411
 
379
412
  ```javascript
380
- window.close(); // 关闭窗口
381
- window.minimize(); // 最小化窗口
382
- window.unminimize(); // 还原最小化的窗口
383
- window.maximize(); // 最大化窗口
384
- window.unmaximize(); // 还原最大化的窗口
385
- window.setTitle('标题'); // 设置窗口标题
386
- window.openDevTools(); // 打开开发者工具
387
- window.closeDevTools(); // 关闭开发者工具
413
+ window.close(); // 关闭窗口
414
+ window.minimize(); // 最小化窗口
415
+ window.unminimize(); // 还原最小化的窗口
416
+ window.maximize(); // 最大化窗口
417
+ window.unmaximize(); // 还原最大化的窗口
418
+ window.setTitle("标题"); // 设置窗口标题
419
+ window.openDevTools(); // 打开开发者工具
420
+ window.closeDevTools(); // 关闭开发者工具
388
421
  ```
389
422
 
390
423
  页面中还可访问以下属性:
391
424
 
392
425
  ```javascript
393
- console.log(window.id); // 窗口唯一标识
426
+ console.log(window.id); // 窗口唯一标识
394
427
  console.log(window.isNexfepLoadDone); // 窗口是否已加载完成
395
428
  ```
396
429
 
@@ -449,8 +482,8 @@ console.log(window.isNexfepLoadDone); // 窗口是否已加载完成
449
482
  WebView 窗口加载完成后会触发 `nexfep-load-done` 事件:
450
483
 
451
484
  ```javascript
452
- window.addEventListener('nexfep-load-done', () => {
453
- console.log('Nexfep 窗口加载完成');
485
+ window.addEventListener("nexfep-load-done", () => {
486
+ console.log("Nexfep 窗口加载完成");
454
487
  });
455
488
  ```
456
489
 
@@ -484,17 +517,17 @@ npx nexfep build [options]
484
517
 
485
518
  #### 选项
486
519
 
487
- | 选项 | 说明 |
488
- |------|------|
489
- | `-n, --name <name>` | 应用名称(默认:来自 package.json) |
490
- | `-e, --entry <file>` | 入口文件路径(默认:来自 package.json main) |
491
- | `-o, --output <dir>` | 输出目录(默认:dist) |
492
- | `-i, --ignore <pattern>` | 要忽略的文件或目录(可多次使用) |
493
- | `-c, --console` | 在 Windows 上显示控制台窗口(默认:false) |
494
- | `-r, --reinstall` | 构建前仅重新安装生产依赖 |
495
- | `-s, --skip-clean` | 跳过清理旧的构建文件 |
496
- | `-u, --upx <level>` | 使用 UPX 压缩可执行文件,级别 0-9(默认:0) |
497
- | `-m, --meta, --metadata <file>` | 元数据文件路径(默认:无) |
520
+ | 选项 | 说明 |
521
+ | ------------------------------- | -------------------------------------------- |
522
+ | `-n, --name <name>` | 应用名称(默认:来自 package.json) |
523
+ | `-e, --entry <file>` | 入口文件路径(默认:来自 package.json main) |
524
+ | `-o, --output <dir>` | 输出目录(默认:dist) |
525
+ | `-i, --ignore <pattern>` | 要忽略的文件或目录(可多次使用) |
526
+ | `-c, --console` | 在 Windows 上显示控制台窗口(默认:false) |
527
+ | `-r, --reinstall` | 构建前仅重新安装生产依赖 |
528
+ | `-s, --skip-clean` | 跳过清理旧的构建文件 |
529
+ | `-u, --upx <level>` | 使用 UPX 压缩可执行文件,级别 0-9(默认:0) |
530
+ | `-m, --meta, --metadata <file>` | 元数据文件路径(默认:无) |
498
531
 
499
532
  #### 示例
500
533
 
@@ -529,46 +562,55 @@ nexfep build -u 7
529
562
 
530
563
  ### Application
531
564
 
532
- | 方法/属性 | 参数 | 返回值 | 说明 |
533
- |-----------|------|--------|------|
534
- | `constructor(options?)` | `{ WindowsWebview2UserDataFolder?, LogFilePath? }` | Application | 创建应用实例 |
535
- | `windows` | / | WindowPool | 窗口池实例 |
536
- | `utils` | / | \_\_Utils | 工具方法(通知) |
537
- | `logger` | / | Logger | 日志实例 |
538
- | `createTray(options)` | 见 Tray 章节 | Tray | 创建系统托盘图标 |
539
- | `exit()` | 无 | void | 退出应用 |
565
+ | 方法/属性 | 参数 | 返回值 | 说明 |
566
+ | ----------------------- | -------------------------------------------------- | ----------- | ---------------- |
567
+ | `constructor(options?)` | `{ WindowsWebview2UserDataFolder?, LogFilePath? }` | Application | 创建应用实例 |
568
+ | `windows` | / | WindowPool | 窗口池实例 |
569
+ | `utils` | / | \_\_Utils | 工具方法(通知) |
570
+ | `logger` | / | Logger | 日志实例 |
571
+ | `createTray(options)` | 见 Tray 章节 | Tray | 创建系统托盘图标 |
572
+ | `exit()` | 无 | void | 退出应用 |
540
573
 
541
574
  ### WindowPool
542
575
 
543
- | 方法/属性 | 参数 | 返回值 | 说明 |
544
- |-----------|------|--------|------|
545
- | `createWindow(isShow?, isDecorated?)` | `isShow`: boolean(默认 true), `isDecorated`: boolean(默认 true) | Promise\<Window> | 创建并获取一个窗口 |
546
- | `handle(event, callback)` | `event`: string, `callback`: (data: any) => any | 无 | 监听指定事件 |
547
- | `unhandle(event, callback)` | `event`: string, `callback`: (data: any) => any | 无 | 取消监听指定事件 |
548
- | `global` | / | Map\<string, any> | 全局变量 Map |
549
- | `closeWindow(window)` | `window`: Window | Promise\<void> | 关闭指定窗口并回收至池中 |
550
- | `onCustomMessage` | `(window: Window, data: string) => void` | 无 | 自定义消息回调函数 |
576
+ | 方法/属性 | 参数 | 返回值 | 说明 |
577
+ | ------------------------------------- | ------------------------------------------------------------------- | ----------------- | ------------------------ |
578
+ | `createWindow(isShow?, isDecorated?)` | `isShow`: boolean(默认 true), `isDecorated`: boolean(默认 true) | Promise\<Window> | 创建并获取一个窗口 |
579
+ | `handle(event, callback)` | `event`: string, `callback`: (data: any) => any | 无 | 监听指定事件 |
580
+ | `unhandle(event, callback)` | `event`: string, `callback`: (data: any) => any | 无 | 取消监听指定事件 |
581
+ | `global` | / | Map\<string, any> | 全局变量 Map |
582
+ | `closeWindow(window)` | `window`: Window | Promise\<void> | 关闭指定窗口并回收至池中 |
583
+ | `onCustomMessage` | `(window: Window, data: string) => void` | 无 | 自定义消息回调函数 |
551
584
 
552
585
  ### Window
553
586
 
554
- | 方法/属性 | 参数 | 返回值 | 说明 |
555
- |-----------|------|--------|------|
556
- | `loadURL(url)` | `url`: string — 要加载的网页地址 | Promise\<void> | 加载指定 URL |
557
- | `loadHTML(html)` | `html`: string — HTML 字符串 | Promise\<void> | 加载指定 HTML 内容 |
558
- | `show()` | 无 | void | 显示窗口 |
559
- | `hide()` | 无 | void | 隐藏窗口 |
560
- | `maximize()` | 无 | void | 最大化窗口 |
561
- | `unMaximize()` | 无 | void | 还原窗口(取消最大化) |
562
- | `minimize()` | 无 | void | 最小化窗口 |
563
- | `unMinimize()` | 无 | void | 还原窗口(取消最小化) |
564
- | `close()` | 无 | void | 关闭窗口并回收至池中 |
565
- | `setTitle(title)` | `title`: string | void | 设置窗口标题 |
566
- | `setDecorated(isDecorated)` | `isDecorated`: boolean | void | 设置窗口是否带边框和标题栏 |
567
- | `resizable(resizable)` | `resizable`: boolean | void | 设置窗口是否可调整大小 |
568
- | `setSize(width, height)` | `width`: number, `height`: number | void | 设置窗口尺寸(像素) |
569
- | `openDevTools()` | 无 | void | 打开开发者工具 |
570
- | `closeDevTools()` | 无 | void | 关闭开发者工具 |
571
- | `id` | 无 | number | 窗口唯一标识,自增编号 |
587
+ | 方法/属性 | 参数 | 返回值 | 说明 |
588
+ | --------------------------- | --------------------------------- | --------------------------------- | -------------------------- |
589
+ | `loadURL(url)` | `url`: string — 要加载的网页地址 | Promise\<void> | 加载指定 URL |
590
+ | `loadHTML(html)` | `html`: string — HTML 字符串 | Promise\<void> | 加载指定 HTML 内容 |
591
+ | `show()` | 无 | void | 显示窗口 |
592
+ | `hide()` | 无 | void | 隐藏窗口 |
593
+ | `maximize()` | 无 | void | 最大化窗口 |
594
+ | `unMaximize()` | 无 | void | 还原窗口(取消最大化) |
595
+ | `minimize()` | 无 | void | 最小化窗口 |
596
+ | `unMinimize()` | 无 | void | 还原窗口(取消最小化) |
597
+ | `close()` | 无 | void | 关闭窗口并回收至池中 |
598
+ | `setTitle(title)` | `title`: string | void | 设置窗口标题 |
599
+ | `setDecorated(isDecorated)` | `isDecorated`: boolean | void | 设置窗口是否带边框和标题栏 |
600
+ | `resizable(resizable)` | `resizable`: boolean | void | 设置窗口是否可调整大小 |
601
+ | `setSize(width, height)` | `width`: number, `height`: number | void | 设置窗口尺寸(像素) |
602
+ | `getSize()` | 无 | { width: number, height: number } | 获取窗口尺寸(像素) |
603
+ | `setPosition(x, y)` | `x`: number, `y`: number | void | 设置窗口位置(像素) |
604
+ | `getPosition()` | 无 | { x: number, y: number } | 获取窗口位置(像素) |
605
+ | `focus()` | 无 | void | 窗口获取焦点 |
606
+ | `isFocused()` | 无 | boolean | 是否有焦点 |
607
+ | `isMaximized()` | 无 | boolean | 是否最大化 |
608
+ | `isMinimized()` | 无 | boolean | 是否最小化 |
609
+ | `toggleMaximize()` | 无 | void | 切换最大化状态 |
610
+ | `toggleMinimize()` | 无 | void | 切换最小化状态 |
611
+ | `openDevTools()` | 无 | void | 打开开发者工具 |
612
+ | `closeDevTools()` | 无 | void | 关闭开发者工具 |
613
+ | `id` | 无 | number | 窗口唯一标识,自增编号 |
572
614
 
573
615
  ## 开发
574
616