@leejungkiin/awkit 1.5.5 → 1.6.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/README.md +6 -4
- package/bin/awk.js +196 -8
- package/core/GEMINI.md +24 -8
- package/core/work-modes.json +45 -0
- package/package.json +3 -3
- package/skill-packs/cocos2d/pack.json +8 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/LICENSE.txt +8 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/SKILL.md +168 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/action.md +278 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/animation.md +220 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/event.md +133 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/input.md +291 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/label.md +184 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/node-scene.md +212 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/scene.md +228 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/sprite.md +206 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/core/texture.md +186 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/about-engine.md +53 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/installation.md +203 -0
- package/skill-packs/cocos2d/skills/cocos2d-x/examples/getting-started/quick-start.md +134 -0
- package/skill-packs/electron/pack.json +9 -0
- package/skill-packs/electron/skills/electron/LICENSE.txt +202 -0
- package/skill-packs/electron/skills/electron/SKILL.md +160 -0
- package/skill-packs/electron/skills/electron/api/app.md +83 -0
- package/skill-packs/electron/skills/electron/api/browser-window.md +84 -0
- package/skill-packs/electron/skills/electron/examples/advanced/packaging.md +140 -0
- package/skill-packs/electron/skills/electron/examples/api/browser-window.md +182 -0
- package/skill-packs/electron/skills/electron/examples/api/menu.md +187 -0
- package/skill-packs/electron/skills/electron/examples/getting-started/installation.md +88 -0
- package/skill-packs/electron/skills/electron/examples/getting-started/quick-start.md +104 -0
- package/skill-packs/electron/skills/electron/examples/processes/ipc-communication.md +140 -0
- package/skill-packs/electron/skills/electron/examples/processes/main-process.md +121 -0
- package/skill-packs/electron/skills/electron/templates/main-process.md +105 -0
- package/skill-packs/electron/skills/electron/templates/preload-script.md +84 -0
- package/skill-packs/electron/skills/electron-egg/LICENSE.txt +202 -0
- package/skill-packs/electron/skills/electron-egg/SKILL.md +154 -0
- package/skill-packs/electron/skills/electron-egg/api/config-api.md +62 -0
- package/skill-packs/electron/skills/electron-egg/api/ipc-api.md +55 -0
- package/skill-packs/electron/skills/electron-egg/api/main-api.md +54 -0
- package/skill-packs/electron/skills/electron-egg/api/renderer-api.md +62 -0
- package/skill-packs/electron/skills/electron-egg/api/window-api.md +64 -0
- package/skill-packs/electron/skills/electron-egg/examples/features/ipc-communication.md +84 -0
- package/skill-packs/electron/skills/electron-egg/examples/features/main-process.md +89 -0
- package/skill-packs/electron/skills/electron-egg/examples/features/renderer-process.md +74 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/build.md +77 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/configuration.md +88 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/installation.md +66 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/intro.md +47 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/project-structure.md +73 -0
- package/skill-packs/electron/skills/electron-egg/examples/guide/quick-start.md +78 -0
- package/skill-packs/electron/skills/electron-egg/templates/configuration.md +63 -0
- package/skill-packs/electron/skills/electron-egg/templates/installation.md +42 -0
- package/skill-packs/electron/skills/electron-egg/templates/project-setup.md +75 -0
- package/skill-packs/flutter/pack.json +9 -0
- package/skill-packs/flutter/skills/flutter/LICENSE.txt +202 -0
- package/skill-packs/flutter/skills/flutter/SKILL.md +127 -0
- package/skill-packs/flutter/skills/flutter-project-creater/LICENSE.txt +202 -0
- package/skill-packs/flutter/skills/flutter-project-creater/SKILL.md +106 -0
- package/skill-packs/threejs/pack.json +25 -0
- package/skill-packs/threejs/skills/README.md +95 -0
- package/skill-packs/threejs/skills/threejs-animation/SKILL.md +86 -0
- package/skill-packs/threejs/skills/threejs-animation/examples/workflow-mixer-action.md +20 -0
- package/skill-packs/threejs/skills/threejs-animation/references/official-sections.md +19 -0
- package/skill-packs/threejs/skills/threejs-audio/SKILL.md +112 -0
- package/skill-packs/threejs/skills/threejs-audio/examples/workflow-positional-audio.md +15 -0
- package/skill-packs/threejs/skills/threejs-audio/references/official-sections.md +16 -0
- package/skill-packs/threejs/skills/threejs-camera/SKILL.md +96 -0
- package/skill-packs/threejs/skills/threejs-camera/examples/workflow-perspective-resize.md +13 -0
- package/skill-packs/threejs/skills/threejs-controls/SKILL.md +101 -0
- package/skill-packs/threejs/skills/threejs-controls/examples/workflow-orbit-damping.md +15 -0
- package/skill-packs/threejs/skills/threejs-dev-setup/SKILL.md +102 -0
- package/skill-packs/threejs/skills/threejs-dev-setup/examples/workflow-scaffold.md +24 -0
- package/skill-packs/threejs/skills/threejs-geometries/SKILL.md +108 -0
- package/skill-packs/threejs/skills/threejs-geometries/examples/workflow-extrude-shape.md +13 -0
- package/skill-packs/threejs/skills/threejs-helpers/SKILL.md +103 -0
- package/skill-packs/threejs/skills/threejs-helpers/examples/workflow-light-camera-helpers.md +13 -0
- package/skill-packs/threejs/skills/threejs-lights/SKILL.md +103 -0
- package/skill-packs/threejs/skills/threejs-lights/examples/workflow-directional-shadow.md +17 -0
- package/skill-packs/threejs/skills/threejs-loaders/SKILL.md +89 -0
- package/skill-packs/threejs/skills/threejs-loaders/examples/workflow-gltf-draco.md +22 -0
- package/skill-packs/threejs/skills/threejs-loaders/references/official-sections.md +27 -0
- package/skill-packs/threejs/skills/threejs-materials/SKILL.md +102 -0
- package/skill-packs/threejs/skills/threejs-materials/examples/workflow-pbr-transparent.md +15 -0
- package/skill-packs/threejs/skills/threejs-math/SKILL.md +102 -0
- package/skill-packs/threejs/skills/threejs-math/examples/workflow-ray-aabb.md +11 -0
- package/skill-packs/threejs/skills/threejs-node-tsl/SKILL.md +83 -0
- package/skill-packs/threejs/skills/threejs-node-tsl/examples/workflow-tsl-entry.md +13 -0
- package/skill-packs/threejs/skills/threejs-node-tsl/references/official-links.md +8 -0
- package/skill-packs/threejs/skills/threejs-node-tsl/references/tsl-vs-classic.md +23 -0
- package/skill-packs/threejs/skills/threejs-objects/SKILL.md +111 -0
- package/skill-packs/threejs/skills/threejs-objects/examples/workflow-raycaster-pick.md +17 -0
- package/skill-packs/threejs/skills/threejs-postprocessing/SKILL.md +116 -0
- package/skill-packs/threejs/skills/threejs-postprocessing/examples/workflow-composer-bloom.md +15 -0
- package/skill-packs/threejs/skills/threejs-renderers/SKILL.md +91 -0
- package/skill-packs/threejs/skills/threejs-renderers/examples/workflow-renderer-resize.md +21 -0
- package/skill-packs/threejs/skills/threejs-renderers/references/official-sections.md +14 -0
- package/skill-packs/threejs/skills/threejs-scenes/SKILL.md +90 -0
- package/skill-packs/threejs/skills/threejs-scenes/examples/workflow-fog-background.md +13 -0
- package/skill-packs/threejs/skills/threejs-textures/SKILL.md +83 -0
- package/skill-packs/threejs/skills/threejs-textures/examples/workflow-pmrem-env.md +19 -0
- package/skill-packs/threejs/skills/threejs-webxr/SKILL.md +104 -0
- package/skill-packs/threejs/skills/threejs-webxr/examples/workflow-xr-button.md +15 -0
- package/skills/CATALOG.md +44 -49
- package/skills/TRIGGER_INDEX.md +30 -0
- package/skills/awf-session-restore/SKILL.md +19 -2
- package/skills/brainstorm-agent/SKILL.md +2 -0
- package/skills/code-review/SKILL.md +2 -0
- package/skills/code-review-system-principles/SKILL.md +154 -0
- package/skills/codex-conductor/SKILL.md +6 -4
- package/skills/gemini-conductor/SKILL.md +4 -3
- package/skills/gitnexus-intelligence/SKILL.md +2 -0
- package/skills/module-spec-writer/SKILL.md +2 -0
- package/skills/nm-memory-sync/SKILL.md +10 -0
- package/skills/skill-creator/SKILL.md +2 -0
- package/skills/spec-gate/SKILL.md +2 -0
- package/skills/symphony-enforcer/SKILL.md +9 -0
- package/skills/symphony-enforcer/examples/mindful-stop.md +141 -0
- package/skills/symphony-enforcer/examples/task-completion.md +11 -2
- package/skills/symphony-enforcer/examples/trigger-points.md +7 -0
- package/skills/symphony-orchestrator/SKILL.md +2 -0
- package/skills/telegram-notify/SKILL.md +1 -0
- package/skills/trello-sync/SKILL.md +7 -0
- package/skills/verification-gate/SKILL.md +2 -0
- package/skills/visual-design-gate/SKILL.md +2 -0
- package/templates/project-identity/android.json +26 -1
- package/templates/project-identity/backend-nestjs.json +26 -1
- package/templates/project-identity/expo.json +26 -1
- package/templates/project-identity/ios.json +26 -1
- package/templates/project-identity/web-nextjs.json +26 -1
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Menu | 菜单
|
|
2
|
+
|
|
3
|
+
**官方文档**: https://www.electronjs.org/zh/docs/latest/,
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Instructions
|
|
7
|
+
|
|
8
|
+
This example demonstrates how to use Menu to create application menus and context menus.
|
|
9
|
+
|
|
10
|
+
### Key Concepts
|
|
11
|
+
|
|
12
|
+
- Application menu
|
|
13
|
+
- Context menu
|
|
14
|
+
- Menu items
|
|
15
|
+
- Menu roles
|
|
16
|
+
- Menu accelerators
|
|
17
|
+
|
|
18
|
+
### Example: Application Menu
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
const { app, Menu } = require('electron')
|
|
22
|
+
|
|
23
|
+
const template = [
|
|
24
|
+
{
|
|
25
|
+
label: 'File',
|
|
26
|
+
submenu: [
|
|
27
|
+
{
|
|
28
|
+
label: 'New',
|
|
29
|
+
accelerator: 'CmdOrCtrl+N',
|
|
30
|
+
click: () => {
|
|
31
|
+
console.log('New file')
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
label: 'Open',
|
|
36
|
+
accelerator: 'CmdOrCtrl+O',
|
|
37
|
+
click: () => {
|
|
38
|
+
console.log('Open file')
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
{ type: 'separator' },
|
|
42
|
+
{
|
|
43
|
+
label: 'Exit',
|
|
44
|
+
accelerator: process.platform === 'darwin' ? 'Cmd+Q' : 'Ctrl+Q',
|
|
45
|
+
click: () => {
|
|
46
|
+
app.quit()
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
label: 'Edit',
|
|
53
|
+
submenu: [
|
|
54
|
+
{ role: 'undo', label: 'Undo' },
|
|
55
|
+
{ role: 'redo', label: 'Redo' },
|
|
56
|
+
{ type: 'separator' },
|
|
57
|
+
{ role: 'cut', label: 'Cut' },
|
|
58
|
+
{ role: 'copy', label: 'Copy' },
|
|
59
|
+
{ role: 'paste', label: 'Paste' }
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
label: 'View',
|
|
64
|
+
submenu: [
|
|
65
|
+
{ role: 'reload', label: 'Reload' },
|
|
66
|
+
{ role: 'forceReload', label: 'Force Reload' },
|
|
67
|
+
{ role: 'toggleDevTools', label: 'Toggle Developer Tools' },
|
|
68
|
+
{ type: 'separator' },
|
|
69
|
+
{ role: 'resetZoom', label: 'Actual Size' },
|
|
70
|
+
{ role: 'zoomIn', label: 'Zoom In' },
|
|
71
|
+
{ role: 'zoomOut', label: 'Zoom Out' },
|
|
72
|
+
{ type: 'separator' },
|
|
73
|
+
{ role: 'togglefullscreen', label: 'Toggle Fullscreen' }
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
label: 'Window',
|
|
78
|
+
submenu: [
|
|
79
|
+
{ role: 'minimize', label: 'Minimize' },
|
|
80
|
+
{ role: 'close', label: 'Close' }
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
// macOS: Add app menu
|
|
86
|
+
if (process.platform === 'darwin') {
|
|
87
|
+
template.unshift({
|
|
88
|
+
label: app.getName(),
|
|
89
|
+
submenu: [
|
|
90
|
+
{ role: 'about', label: 'About' },
|
|
91
|
+
{ type: 'separator' },
|
|
92
|
+
{ role: 'services', label: 'Services' },
|
|
93
|
+
{ type: 'separator' },
|
|
94
|
+
{ role: 'hide', label: 'Hide' },
|
|
95
|
+
{ role: 'hideOthers', label: 'Hide Others' },
|
|
96
|
+
{ role: 'unhide', label: 'Show All' },
|
|
97
|
+
{ type: 'separator' },
|
|
98
|
+
{ role: 'quit', label: 'Quit' }
|
|
99
|
+
]
|
|
100
|
+
})
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const menu = Menu.buildFromTemplate(template)
|
|
104
|
+
Menu.setApplicationMenu(menu)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Example: Context Menu
|
|
108
|
+
|
|
109
|
+
```javascript
|
|
110
|
+
const { Menu, MenuItem } = require('electron')
|
|
111
|
+
|
|
112
|
+
// In preload.js
|
|
113
|
+
const { contextBridge } = require('electron')
|
|
114
|
+
|
|
115
|
+
contextBridge.exposeInMainWorld('electronAPI', {
|
|
116
|
+
showContextMenu: () => {
|
|
117
|
+
const menu = new Menu()
|
|
118
|
+
|
|
119
|
+
menu.append(new MenuItem({
|
|
120
|
+
label: 'Copy',
|
|
121
|
+
role: 'copy'
|
|
122
|
+
}))
|
|
123
|
+
|
|
124
|
+
menu.append(new MenuItem({
|
|
125
|
+
label: 'Paste',
|
|
126
|
+
role: 'paste'
|
|
127
|
+
}))
|
|
128
|
+
|
|
129
|
+
menu.append(new MenuItem({
|
|
130
|
+
type: 'separator'
|
|
131
|
+
}))
|
|
132
|
+
|
|
133
|
+
menu.append(new MenuItem({
|
|
134
|
+
label: 'Custom Action',
|
|
135
|
+
click: () => {
|
|
136
|
+
console.log('Custom action clicked')
|
|
137
|
+
}
|
|
138
|
+
}))
|
|
139
|
+
|
|
140
|
+
menu.popup()
|
|
141
|
+
}
|
|
142
|
+
})
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Example: Dynamic Menu
|
|
146
|
+
|
|
147
|
+
```javascript
|
|
148
|
+
const { Menu } = require('electron')
|
|
149
|
+
|
|
150
|
+
function updateMenu(hasFile) {
|
|
151
|
+
const template = [
|
|
152
|
+
{
|
|
153
|
+
label: 'File',
|
|
154
|
+
submenu: [
|
|
155
|
+
{
|
|
156
|
+
label: 'New',
|
|
157
|
+
enabled: true,
|
|
158
|
+
click: () => createNewFile()
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
label: 'Open',
|
|
162
|
+
enabled: true,
|
|
163
|
+
click: () => openFile()
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
label: 'Save',
|
|
167
|
+
enabled: hasFile,
|
|
168
|
+
click: () => saveFile()
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
|
|
174
|
+
const menu = Menu.buildFromTemplate(template)
|
|
175
|
+
Menu.setApplicationMenu(menu)
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Key Points
|
|
180
|
+
|
|
181
|
+
- Use Menu.buildFromTemplate() to create menus
|
|
182
|
+
- Use Menu.setApplicationMenu() for app menu
|
|
183
|
+
- Use menu.popup() for context menus
|
|
184
|
+
- Use role property for standard menu items
|
|
185
|
+
- Use accelerator for keyboard shortcuts
|
|
186
|
+
- macOS requires special app menu structure
|
|
187
|
+
- Context menus should be created in preload or main process
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Installation | 安装
|
|
2
|
+
|
|
3
|
+
**官方文档**: https://www.electronjs.org/zh/docs/latest/,
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Instructions
|
|
7
|
+
|
|
8
|
+
This example demonstrates how to install Electron and set up a basic project.
|
|
9
|
+
|
|
10
|
+
### Key Concepts
|
|
11
|
+
|
|
12
|
+
- Installing Electron
|
|
13
|
+
- Project structure
|
|
14
|
+
- package.json configuration
|
|
15
|
+
- Running Electron app
|
|
16
|
+
|
|
17
|
+
### Example: Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Using npm
|
|
21
|
+
npm install electron --save-dev
|
|
22
|
+
|
|
23
|
+
# Using yarn
|
|
24
|
+
yarn add electron --dev
|
|
25
|
+
|
|
26
|
+
# Using pnpm
|
|
27
|
+
pnpm add electron --save-dev
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Example: Basic package.json
|
|
31
|
+
|
|
32
|
+
```json
|
|
33
|
+
{
|
|
34
|
+
"name": "my-electron-app",
|
|
35
|
+
"version": "1.0.0",
|
|
36
|
+
"description": "My Electron app",
|
|
37
|
+
"main": "main.js",
|
|
38
|
+
"scripts": {
|
|
39
|
+
"start": "electron .",
|
|
40
|
+
"dev": "electron ."
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"electron": "^latest"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Example: Project Structure
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
my-electron-app/
|
|
52
|
+
├── main.js # Main process entry point
|
|
53
|
+
├── preload.js # Preload script (optional)
|
|
54
|
+
├── renderer/
|
|
55
|
+
│ ├── index.html # Renderer HTML
|
|
56
|
+
│ └── renderer.js # Renderer script
|
|
57
|
+
├── package.json
|
|
58
|
+
└── README.md
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Example: Running the App
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Start the app
|
|
65
|
+
npm start
|
|
66
|
+
|
|
67
|
+
# Or directly
|
|
68
|
+
npx electron .
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Example: Using Electron Forge
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
# Create new project with Electron Forge
|
|
75
|
+
npm create electron-app@latest my-app
|
|
76
|
+
|
|
77
|
+
# Or add to existing project
|
|
78
|
+
npx @electron-forge/cli import
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Key Points
|
|
82
|
+
|
|
83
|
+
- Install Electron as dev dependency
|
|
84
|
+
- Set `main` field in package.json to main process file
|
|
85
|
+
- Use `electron .` to run the app
|
|
86
|
+
- Main process file (main.js) is required
|
|
87
|
+
- Electron Forge can scaffold projects automatically
|
|
88
|
+
- Works on Windows, macOS, and Linux
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Quick Start | 快速开始
|
|
2
|
+
|
|
3
|
+
**官方文档**: https://www.electronjs.org/zh/docs/latest/,
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Instructions
|
|
7
|
+
|
|
8
|
+
This example demonstrates how to create a basic Electron application.
|
|
9
|
+
|
|
10
|
+
### Key Concepts
|
|
11
|
+
|
|
12
|
+
- Main process setup
|
|
13
|
+
- Creating BrowserWindow
|
|
14
|
+
- Loading HTML content
|
|
15
|
+
- App lifecycle
|
|
16
|
+
|
|
17
|
+
### Example: Basic main.js
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
// main.js
|
|
21
|
+
const { app, BrowserWindow } = require('electron')
|
|
22
|
+
const path = require('path')
|
|
23
|
+
|
|
24
|
+
function createWindow() {
|
|
25
|
+
const win = new BrowserWindow({
|
|
26
|
+
width: 800,
|
|
27
|
+
height: 600,
|
|
28
|
+
webPreferences: {
|
|
29
|
+
preload: path.join(__dirname, 'preload.js')
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
win.loadFile('index.html')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
app.whenReady().then(() => {
|
|
37
|
+
createWindow()
|
|
38
|
+
|
|
39
|
+
app.on('activate', () => {
|
|
40
|
+
if (BrowserWindow.getAllWindows().length === 0) {
|
|
41
|
+
createWindow()
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
app.on('window-all-closed', () => {
|
|
47
|
+
if (process.platform !== 'darwin') {
|
|
48
|
+
app.quit()
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Example: Basic index.html
|
|
54
|
+
|
|
55
|
+
```html
|
|
56
|
+
<!DOCTYPE html>
|
|
57
|
+
<html>
|
|
58
|
+
<head>
|
|
59
|
+
<meta charset="UTF-8">
|
|
60
|
+
<title>Hello Electron</title>
|
|
61
|
+
</head>
|
|
62
|
+
<body>
|
|
63
|
+
<h1>Hello Electron!</h1>
|
|
64
|
+
<p>Welcome to Electron</p>
|
|
65
|
+
<script src="renderer.js"></script>
|
|
66
|
+
</body>
|
|
67
|
+
</html>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Example: Basic preload.js
|
|
71
|
+
|
|
72
|
+
```javascript
|
|
73
|
+
// preload.js
|
|
74
|
+
const { contextBridge, ipcRenderer } = require('electron')
|
|
75
|
+
|
|
76
|
+
// Expose protected methods that allow the renderer process to use
|
|
77
|
+
// the ipcRenderer without exposing the entire object
|
|
78
|
+
contextBridge.exposeInMainWorld('electronAPI', {
|
|
79
|
+
openFile: () => ipcRenderer.invoke('dialog:openFile')
|
|
80
|
+
})
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Example: Basic renderer.js
|
|
84
|
+
|
|
85
|
+
```javascript
|
|
86
|
+
// renderer.js
|
|
87
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
88
|
+
console.log('Renderer process loaded')
|
|
89
|
+
|
|
90
|
+
// Use exposed API from preload
|
|
91
|
+
window.electronAPI.openFile().then(result => {
|
|
92
|
+
console.log('File selected:', result)
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Key Points
|
|
98
|
+
|
|
99
|
+
- Main process (main.js) controls app lifecycle
|
|
100
|
+
- BrowserWindow creates application windows
|
|
101
|
+
- loadFile() loads local HTML files
|
|
102
|
+
- Preload scripts bridge main and renderer safely
|
|
103
|
+
- Renderer process runs web content
|
|
104
|
+
- Use contextBridge for secure IPC exposure
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# IPC Communication | IPC 通信
|
|
2
|
+
|
|
3
|
+
**官方文档**: https://www.electronjs.org/zh/docs/latest/,
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Instructions
|
|
7
|
+
|
|
8
|
+
This example demonstrates IPC (Inter-Process Communication) between main and renderer processes.
|
|
9
|
+
|
|
10
|
+
### Key Concepts
|
|
11
|
+
|
|
12
|
+
- ipcMain in main process
|
|
13
|
+
- ipcRenderer in renderer process
|
|
14
|
+
- contextBridge for secure exposure
|
|
15
|
+
- Two-way communication
|
|
16
|
+
|
|
17
|
+
### Example: Basic IPC Setup
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
// main.js
|
|
21
|
+
const { app, BrowserWindow, ipcMain } = require('electron')
|
|
22
|
+
const path = require('path')
|
|
23
|
+
|
|
24
|
+
let mainWindow
|
|
25
|
+
|
|
26
|
+
function createWindow() {
|
|
27
|
+
mainWindow = new BrowserWindow({
|
|
28
|
+
width: 800,
|
|
29
|
+
height: 600,
|
|
30
|
+
webPreferences: {
|
|
31
|
+
preload: path.join(__dirname, 'preload.js'),
|
|
32
|
+
contextIsolation: true,
|
|
33
|
+
nodeIntegration: false
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
mainWindow.loadFile('index.html')
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Handle IPC from renderer
|
|
41
|
+
ipcMain.handle('get-app-version', () => {
|
|
42
|
+
return app.getVersion()
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
ipcMain.on('window-minimize', () => {
|
|
46
|
+
mainWindow.minimize()
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
app.whenReady().then(() => {
|
|
50
|
+
createWindow()
|
|
51
|
+
})
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Example: Preload Script
|
|
55
|
+
|
|
56
|
+
```javascript
|
|
57
|
+
// preload.js
|
|
58
|
+
const { contextBridge, ipcRenderer } = require('electron')
|
|
59
|
+
|
|
60
|
+
// Expose safe API to renderer
|
|
61
|
+
contextBridge.exposeInMainWorld('electronAPI', {
|
|
62
|
+
getVersion: () => ipcRenderer.invoke('get-app-version'),
|
|
63
|
+
minimizeWindow: () => ipcRenderer.send('window-minimize'),
|
|
64
|
+
|
|
65
|
+
// Two-way communication
|
|
66
|
+
openFile: () => ipcRenderer.invoke('dialog:openFile'),
|
|
67
|
+
|
|
68
|
+
// Listen to main process
|
|
69
|
+
onUpdateAvailable: (callback) => {
|
|
70
|
+
ipcRenderer.on('update-available', (event, data) => callback(data))
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Example: Renderer Process
|
|
76
|
+
|
|
77
|
+
```javascript
|
|
78
|
+
// renderer.js
|
|
79
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
80
|
+
// Get app version
|
|
81
|
+
window.electronAPI.getVersion().then(version => {
|
|
82
|
+
console.log('App version:', version)
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
// Minimize window
|
|
86
|
+
document.getElementById('minimize-btn').addEventListener('click', () => {
|
|
87
|
+
window.electronAPI.minimizeWindow()
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
// Open file dialog
|
|
91
|
+
document.getElementById('open-file-btn').addEventListener('click', async () => {
|
|
92
|
+
const result = await window.electronAPI.openFile()
|
|
93
|
+
console.log('Selected file:', result)
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
// Listen for updates
|
|
97
|
+
window.electronAPI.onUpdateAvailable((data) => {
|
|
98
|
+
console.log('Update available:', data)
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Example: Advanced IPC Patterns
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
// main.js
|
|
107
|
+
const { ipcMain, dialog } = require('electron')
|
|
108
|
+
|
|
109
|
+
// Handle with async response
|
|
110
|
+
ipcMain.handle('dialog:openFile', async () => {
|
|
111
|
+
const { canceled, filePaths } = await dialog.showOpenDialog({
|
|
112
|
+
properties: ['openFile']
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
if (!canceled) {
|
|
116
|
+
return filePaths[0]
|
|
117
|
+
}
|
|
118
|
+
return null
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
// Send to renderer
|
|
122
|
+
ipcMain.on('check-updates', () => {
|
|
123
|
+
// Simulate update check
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
mainWindow.webContents.send('update-available', {
|
|
126
|
+
version: '1.0.1',
|
|
127
|
+
url: 'https://example.com/update'
|
|
128
|
+
})
|
|
129
|
+
}, 2000)
|
|
130
|
+
})
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Key Points
|
|
134
|
+
|
|
135
|
+
- Use ipcMain.handle() for request-response pattern
|
|
136
|
+
- Use ipcMain.on() for one-way communication
|
|
137
|
+
- Use contextBridge.exposeInMainWorld() for secure API exposure
|
|
138
|
+
- Never expose ipcRenderer directly to renderer
|
|
139
|
+
- Use contextIsolation: true and nodeIntegration: false
|
|
140
|
+
- IPC enables safe communication between processes
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Main Process | 主进程
|
|
2
|
+
|
|
3
|
+
**官方文档**: https://www.electronjs.org/zh/docs/latest/,
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
## Instructions
|
|
7
|
+
|
|
8
|
+
This example demonstrates main process concepts and usage in Electron.
|
|
9
|
+
|
|
10
|
+
### Key Concepts
|
|
11
|
+
|
|
12
|
+
- Main process role
|
|
13
|
+
- App lifecycle events
|
|
14
|
+
- Creating windows
|
|
15
|
+
- Managing application state
|
|
16
|
+
|
|
17
|
+
### Example: App Lifecycle
|
|
18
|
+
|
|
19
|
+
```javascript
|
|
20
|
+
// main.js
|
|
21
|
+
const { app, BrowserWindow } = require('electron')
|
|
22
|
+
|
|
23
|
+
let mainWindow
|
|
24
|
+
|
|
25
|
+
function createWindow() {
|
|
26
|
+
mainWindow = new BrowserWindow({
|
|
27
|
+
width: 800,
|
|
28
|
+
height: 600,
|
|
29
|
+
webPreferences: {
|
|
30
|
+
nodeIntegration: false,
|
|
31
|
+
contextIsolation: true,
|
|
32
|
+
preload: path.join(__dirname, 'preload.js')
|
|
33
|
+
}
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
mainWindow.loadFile('index.html')
|
|
37
|
+
|
|
38
|
+
mainWindow.on('closed', () => {
|
|
39
|
+
mainWindow = null
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// App ready
|
|
44
|
+
app.whenReady().then(() => {
|
|
45
|
+
createWindow()
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
// macOS: Re-open window when dock icon is clicked
|
|
49
|
+
app.on('activate', () => {
|
|
50
|
+
if (BrowserWindow.getAllWindows().length === 0) {
|
|
51
|
+
createWindow()
|
|
52
|
+
}
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
// Quit when all windows are closed (except macOS)
|
|
56
|
+
app.on('window-all-closed', () => {
|
|
57
|
+
if (process.platform !== 'darwin') {
|
|
58
|
+
app.quit()
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Example: App Events
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
const { app } = require('electron')
|
|
67
|
+
|
|
68
|
+
// Before app quits
|
|
69
|
+
app.on('before-quit', (event) => {
|
|
70
|
+
console.log('App is about to quit')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// Will quit
|
|
74
|
+
app.on('will-quit', (event) => {
|
|
75
|
+
console.log('App will quit')
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
// Quit
|
|
79
|
+
app.on('quit', () => {
|
|
80
|
+
console.log('App quit')
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
// Second instance
|
|
84
|
+
app.on('second-instance', () => {
|
|
85
|
+
// Focus existing window
|
|
86
|
+
if (mainWindow) {
|
|
87
|
+
if (mainWindow.isMinimized()) mainWindow.restore()
|
|
88
|
+
mainWindow.focus()
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Example: Single Instance App
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
const { app } = require('electron')
|
|
97
|
+
|
|
98
|
+
const gotTheLock = app.requestSingleInstanceLock()
|
|
99
|
+
|
|
100
|
+
if (!gotTheLock) {
|
|
101
|
+
app.quit()
|
|
102
|
+
} else {
|
|
103
|
+
app.on('second-instance', () => {
|
|
104
|
+
// Handle second instance
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
// Continue with app initialization
|
|
108
|
+
app.whenReady().then(() => {
|
|
109
|
+
createWindow()
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Key Points
|
|
115
|
+
|
|
116
|
+
- Main process manages app lifecycle
|
|
117
|
+
- Use app.whenReady() before creating windows
|
|
118
|
+
- Handle window-all-closed for proper quit behavior
|
|
119
|
+
- macOS requires special handling for dock icon
|
|
120
|
+
- Use requestSingleInstanceLock() for single instance apps
|
|
121
|
+
- Main process has full Node.js access
|