@love-sqjm/magic 2026.4.15
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/LICENSE +674 -0
- package/README.md +93 -0
- package/app.js +51 -0
- package/doc/api/examples.md +563 -0
- package/doc/api/index.md +563 -0
- package/doc/architecture.md +322 -0
- package/doc/config-reference.md +646 -0
- package/doc/data-model.md +622 -0
- package/doc/development-guide.md +582 -0
- package/doc/magic-file/index.md +610 -0
- package/doc/user-guide/index.md +485 -0
- package/doc/workflow.md +548 -0
- package/index.js +157 -0
- package/magic.bat +2 -0
- package/magic.ps1 +5 -0
- package/package.json +44 -0
- package/script/build-project.js +16 -0
- package/script/config.js +23 -0
- package/script/create-project.js +73 -0
- package/script/global/printf.js +13 -0
- package/script/global/project-build-config.js +161 -0
- package/script/global/support-platform.js +5 -0
- package/script/module/compiler/global.js +43 -0
- package/script/module/compiler/id-generate.js +18 -0
- package/script/module/compiler/index-dom.js +78 -0
- package/script/module/compiler/macro-replace.js +22 -0
- package/script/module/compiler/macro.js +6 -0
- package/script/module/compiler/start.js +10 -0
- package/script/module/compiler/step/1.js +253 -0
- package/script/module/compiler/step/2.js +79 -0
- package/script/module/compiler/step/3.js +37 -0
- package/script/module/compiler/step/4.js +20 -0
- package/script/module/compiler/step/5.js +634 -0
- package/script/module/compiler/step/6.js +304 -0
- package/script/module/compiler/step/end.js +124 -0
- package/script/run-project.js +249 -0
- package/script/util/bun-fs.js +40 -0
- package/script/util/copy-dir.js +21 -0
- package/script/util/create-simple-dom-element.js +23 -0
- package/script/util/file-util.js +95 -0
- package/script/util/filtration-file.js +20 -0
- package/script/util/get-dir-all-file.js +28 -0
- package/script/util/get-first-object-key.js +9 -0
- package/script/util/is-empty-object.js +8 -0
- package/script/util/is-string-over-size.js +4 -0
- package/script/util/is.js +18 -0
- package/script/util/logging.js +142 -0
- package/script/util/task.js +16 -0
- package/script/util/traversal.js +28 -0
- package/template/platform-config/node-webkit +23 -0
- package/template/platform-config/web +1 -0
- package/template/project-base/app.xml +5 -0
- package/template/project-base/build.module.toml +37 -0
- package/template/project-base/build.toml +43 -0
- package/template/runtime/runtime.css +3 -0
- package/template/runtime/runtime.js +895 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
# Magic 使用指南
|
|
2
|
+
|
|
3
|
+
## 目录
|
|
4
|
+
|
|
5
|
+
1. [环境配置](#1-环境配置)
|
|
6
|
+
2. [项目创建](#2-项目创建)
|
|
7
|
+
3. [项目结构](#3-项目结构)
|
|
8
|
+
4. [开发流程](#4-开发流程)
|
|
9
|
+
5. [构建部署](#5-构建部署)
|
|
10
|
+
6. [常见问题](#6-常见问题)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. 环境配置
|
|
15
|
+
|
|
16
|
+
### 1.1 系统要求
|
|
17
|
+
|
|
18
|
+
| 要求 | 说明 |
|
|
19
|
+
|------|------|
|
|
20
|
+
| 操作系统 | Windows |
|
|
21
|
+
| 运行时 | Bun.js |
|
|
22
|
+
| Node.js | 可选(仅用于辅助工具) |
|
|
23
|
+
|
|
24
|
+
### 1.2 安装 Bun.js
|
|
25
|
+
|
|
26
|
+
Magic 基于 Bun.js 运行,必须先安装 Bun。
|
|
27
|
+
|
|
28
|
+
**方法一:使用 PowerShell(推荐)**
|
|
29
|
+
|
|
30
|
+
```powershell
|
|
31
|
+
powershell -ExecutionPolicy Bypass -Command "irm bun.sh/install.ps1 | iex"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**方法二:使用 npm**
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
npm install -g bun
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**验证安装**
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
bun --version
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 1.3 安装 Magic CLI
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
bun install -g magic-bun
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**验证安装**
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
magic --version
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 1.4 开发工具推荐
|
|
59
|
+
|
|
60
|
+
| 工具 | 说明 |
|
|
61
|
+
|------|------|
|
|
62
|
+
| VS Code | 代码编辑器 |
|
|
63
|
+
| Thunder Client | API 测试(可选) |
|
|
64
|
+
| Chrome DevTools | 浏览器调试 |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 2. 项目创建
|
|
69
|
+
|
|
70
|
+
### 2.1 创建 Web 项目
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
magic init my-web-app --web
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 2.2 创建 Node-Webkit 桌面项目
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
magic init my-desktop-app --node-webkit
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 2.3 创建模块项目
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
magic init my-module --module
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 2.4 项目初始化输出
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
my-web-app/
|
|
92
|
+
├── app/
|
|
93
|
+
│ ├── app.xml # 应用配置
|
|
94
|
+
│ └── index.m # 入口模块 (自动创建)
|
|
95
|
+
├── build.toml # 构建配置
|
|
96
|
+
└── package.json
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 2.5 创建组件文件
|
|
100
|
+
|
|
101
|
+
使用 `create-m` 命令创建新的 `.m` 组件文件:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
magic create-m button # 创建 button.m
|
|
105
|
+
magic create-m mycomponent
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
文件会创建在当前项目目录下(与 `build.toml` 同级)。
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 3. 项目结构
|
|
113
|
+
|
|
114
|
+
### 3.1 目录说明
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
project/
|
|
118
|
+
├── app/ # 源码目录
|
|
119
|
+
│ ├── app.xml # 应用配置
|
|
120
|
+
│ ├── index.m # 入口模块
|
|
121
|
+
│ ├── components/ # 组件目录
|
|
122
|
+
│ │ ├── header.m
|
|
123
|
+
│ │ └── footer.m
|
|
124
|
+
│ ├── pages/ # 页面目录
|
|
125
|
+
│ │ ├── home.m
|
|
126
|
+
│ │ └── about.m
|
|
127
|
+
│ └── assets/ # 资源目录
|
|
128
|
+
│ ├── images/
|
|
129
|
+
│ └── styles/
|
|
130
|
+
├── build/ # 构建输出目录(自动生成)
|
|
131
|
+
│ ├── index.html
|
|
132
|
+
│ ├── magic/
|
|
133
|
+
│ └── ...
|
|
134
|
+
└── build.toml # 构建配置
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 3.2 入口文件
|
|
138
|
+
|
|
139
|
+
`app/index.m` 是应用入口模块(初始化时自动创建):
|
|
140
|
+
|
|
141
|
+
```xml
|
|
142
|
+
<import
|
|
143
|
+
root=""
|
|
144
|
+
>
|
|
145
|
+
</import>
|
|
146
|
+
|
|
147
|
+
<template>
|
|
148
|
+
<h1 #id="h1">hello magic!</h1>
|
|
149
|
+
</template>
|
|
150
|
+
|
|
151
|
+
<script code="global">
|
|
152
|
+
const {
|
|
153
|
+
} = $id();
|
|
154
|
+
</script>
|
|
155
|
+
|
|
156
|
+
<script code="listen">
|
|
157
|
+
</script>
|
|
158
|
+
|
|
159
|
+
<script>
|
|
160
|
+
</script>
|
|
161
|
+
|
|
162
|
+
<script code="interface">
|
|
163
|
+
</script>
|
|
164
|
+
|
|
165
|
+
<css scope="" default-theme>
|
|
166
|
+
</css>
|
|
167
|
+
|
|
168
|
+
<css scope="#id:h1">
|
|
169
|
+
& {
|
|
170
|
+
font-size: 32px;
|
|
171
|
+
}
|
|
172
|
+
</css>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## 4. 开发流程
|
|
178
|
+
|
|
179
|
+
### 4.1 启动开发服务器
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
cd my-web-app
|
|
183
|
+
magic run
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
这将:
|
|
187
|
+
1. 启动 HTTP 服务器(默认 `http://localhost:8088`)
|
|
188
|
+
2. 自动打开浏览器
|
|
189
|
+
3. 开启热更新监听
|
|
190
|
+
|
|
191
|
+
### 4.2 编辑代码
|
|
192
|
+
|
|
193
|
+
**创建新组件**
|
|
194
|
+
|
|
195
|
+
可以使用 `create-m` 命令快速创建组件模板:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
magic create-m greeting # 创建 greeting.m
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
然后编辑生成的文件:
|
|
202
|
+
|
|
203
|
+
```xml
|
|
204
|
+
<!-- app/components/greeting.m -->
|
|
205
|
+
<template>
|
|
206
|
+
<div #id="greeting">
|
|
207
|
+
<h1 #id="message">Hello!</h1>
|
|
208
|
+
<button #id="btn" @click="sayHello">点击</button>
|
|
209
|
+
</div>
|
|
210
|
+
</template>
|
|
211
|
+
|
|
212
|
+
<script code="global">
|
|
213
|
+
const { $message, $btn } = $id();
|
|
214
|
+
</script>
|
|
215
|
+
|
|
216
|
+
<script code="event">
|
|
217
|
+
sayHello = () => {
|
|
218
|
+
$message.textContent = "Hello, Magic!";
|
|
219
|
+
}
|
|
220
|
+
</script>
|
|
221
|
+
|
|
222
|
+
<css scope="#id:greeting">
|
|
223
|
+
& {
|
|
224
|
+
text-align: center;
|
|
225
|
+
padding: 20px;
|
|
226
|
+
}
|
|
227
|
+
</css>
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
**在页面中使用组件**
|
|
231
|
+
|
|
232
|
+
```xml
|
|
233
|
+
<!-- app/pages/home.m -->
|
|
234
|
+
<import root="../components">
|
|
235
|
+
<greeting/>
|
|
236
|
+
</import>
|
|
237
|
+
|
|
238
|
+
<template>
|
|
239
|
+
<div #id="home-page">
|
|
240
|
+
<greeting/>
|
|
241
|
+
</div>
|
|
242
|
+
</template>
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### 4.3 热更新
|
|
246
|
+
|
|
247
|
+
修改 `.m` 文件后,浏览器会自动刷新页面。
|
|
248
|
+
|
|
249
|
+
**手动刷新**
|
|
250
|
+
|
|
251
|
+
如果热更新未生效,可以手动刷新浏览器或重启服务器。
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## 5. 构建部署
|
|
256
|
+
|
|
257
|
+
### 5.1 开发模式构建
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
magic build
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
输出结构:
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
build/
|
|
267
|
+
├── index.html
|
|
268
|
+
├── magic/
|
|
269
|
+
│ ├── runtime.js
|
|
270
|
+
│ ├── runtime.css
|
|
271
|
+
│ ├── index.js
|
|
272
|
+
│ └── index.css
|
|
273
|
+
└── ...(其他资源)
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### 5.2 生产模式构建
|
|
277
|
+
|
|
278
|
+
修改 `build.toml`:
|
|
279
|
+
|
|
280
|
+
```toml
|
|
281
|
+
[build]
|
|
282
|
+
model = "release"
|
|
283
|
+
|
|
284
|
+
[build.optimize.min-code]
|
|
285
|
+
js = true
|
|
286
|
+
css = true
|
|
287
|
+
html = true
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
然后执行:
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
magic build
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### 5.3 部署 Web 应用
|
|
297
|
+
|
|
298
|
+
**静态托管**
|
|
299
|
+
|
|
300
|
+
将 `build/` 目录部署到任何静态托管服务:
|
|
301
|
+
|
|
302
|
+
- Nginx
|
|
303
|
+
- Apache
|
|
304
|
+
- Vercel
|
|
305
|
+
- Netlify
|
|
306
|
+
- GitHub Pages
|
|
307
|
+
|
|
308
|
+
**Nginx 配置示例**
|
|
309
|
+
|
|
310
|
+
```nginx
|
|
311
|
+
server {
|
|
312
|
+
listen 80;
|
|
313
|
+
server_name example.com;
|
|
314
|
+
root /path/to/project/build;
|
|
315
|
+
index index.html;
|
|
316
|
+
|
|
317
|
+
location / {
|
|
318
|
+
try_files $uri $uri/ /index.html;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**Node.js 服务**
|
|
324
|
+
|
|
325
|
+
可以配置为 SPA 模式:
|
|
326
|
+
|
|
327
|
+
```javascript
|
|
328
|
+
const http = require('http');
|
|
329
|
+
const fs = require('fs');
|
|
330
|
+
const path = require('path');
|
|
331
|
+
|
|
332
|
+
const server = http.createServer((req, res) => {
|
|
333
|
+
let filePath = path.join(__dirname, 'build', req.url === '/' ? 'index.html' : req.url);
|
|
334
|
+
|
|
335
|
+
// SPA fallback
|
|
336
|
+
if (!fs.existsSync(filePath)) {
|
|
337
|
+
filePath = path.join(__dirname, 'build', 'index.html');
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const ext = path.extname(filePath);
|
|
341
|
+
const contentTypes = {
|
|
342
|
+
'.html': 'text/html',
|
|
343
|
+
'.js': 'application/javascript',
|
|
344
|
+
'.css': 'text/css',
|
|
345
|
+
'.png': 'image/png',
|
|
346
|
+
'.jpg': 'image/jpeg'
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
res.setHeader('Content-Type', contentTypes[ext] || 'text/plain');
|
|
350
|
+
fs.createReadStream(filePath).pipe(res);
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
server.listen(3000);
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## 6. 常见问题
|
|
359
|
+
|
|
360
|
+
### Q1: 报错 "不是 Bun 环境,无法使用!"
|
|
361
|
+
|
|
362
|
+
**原因:** 未安装 Bun 或不在 Bun 环境中运行。
|
|
363
|
+
|
|
364
|
+
**解决:**
|
|
365
|
+
```bash
|
|
366
|
+
# 确认 Bun 已安装
|
|
367
|
+
bun --version
|
|
368
|
+
|
|
369
|
+
# 确认使用 bun 运行
|
|
370
|
+
bun magic build
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Q2: 报错 "缺少入口文件"
|
|
374
|
+
|
|
375
|
+
**原因:** `build.toml` 中指定的入口文件不存在。
|
|
376
|
+
|
|
377
|
+
**解决:** 确保 `app/index.m` 文件存在:
|
|
378
|
+
|
|
379
|
+
```toml
|
|
380
|
+
[config]
|
|
381
|
+
main = "index"
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### Q3: 热更新不生效
|
|
385
|
+
|
|
386
|
+
**原因:** WebSocket 连接问题或文件监听失败。
|
|
387
|
+
|
|
388
|
+
**解决:**
|
|
389
|
+
1. 检查浏览器控制台是否有 WebSocket 连接错误
|
|
390
|
+
2. 重启开发服务器
|
|
391
|
+
3. 手动刷新浏览器
|
|
392
|
+
|
|
393
|
+
### Q4: 样式不生效
|
|
394
|
+
|
|
395
|
+
**原因:** CSS 作用域选择器使用错误。
|
|
396
|
+
|
|
397
|
+
**解决:** 使用正确的 `#id:xx` 语法:
|
|
398
|
+
|
|
399
|
+
```xml
|
|
400
|
+
<!-- 正确 -->
|
|
401
|
+
<css scope="#id:myComponent">
|
|
402
|
+
|
|
403
|
+
<!-- 错误 -->
|
|
404
|
+
<css scope=".myComponent">
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Q5: 模块导入失败
|
|
408
|
+
|
|
409
|
+
**原因:** 模块路径配置错误。
|
|
410
|
+
|
|
411
|
+
**解决:**
|
|
412
|
+
1. 检查 `import` 标签的 `root` 属性
|
|
413
|
+
2. 确认目标 `.m` 文件存在
|
|
414
|
+
3. 检查模块名称拼写
|
|
415
|
+
|
|
416
|
+
### Q6: 如何调试?
|
|
417
|
+
|
|
418
|
+
**方法一:浏览器控制台**
|
|
419
|
+
|
|
420
|
+
```javascript
|
|
421
|
+
console.log("Debug info:", someValue);
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**方法二:查看构建日志**
|
|
425
|
+
|
|
426
|
+
构建日志位于项目根目录的 `Magic.log`。
|
|
427
|
+
|
|
428
|
+
**方法三:debug 模式构建**
|
|
429
|
+
|
|
430
|
+
```toml
|
|
431
|
+
[build]
|
|
432
|
+
model = "debug"
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
生成未压缩的代码便于调试。
|
|
436
|
+
|
|
437
|
+
### Q7: 如何处理第三方库?
|
|
438
|
+
|
|
439
|
+
**引入 JavaScript 库**
|
|
440
|
+
|
|
441
|
+
在 `app.xml` 中引入:
|
|
442
|
+
|
|
443
|
+
```xml
|
|
444
|
+
<app lang="zh">
|
|
445
|
+
<import dir=".">
|
|
446
|
+
<js src="lib/jquery.min.js"/>
|
|
447
|
+
</import>
|
|
448
|
+
</app>
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
**引入 CSS 库**
|
|
452
|
+
|
|
453
|
+
```xml
|
|
454
|
+
<app lang="zh">
|
|
455
|
+
<import dir=".">
|
|
456
|
+
<css src="lib/bootstrap.min.css"/>
|
|
457
|
+
</import>
|
|
458
|
+
</app>
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### Q8: 如何处理图片等静态资源?
|
|
462
|
+
|
|
463
|
+
将资源放在 `app/` 目录,构建时会自动复制到 `build/` 目录:
|
|
464
|
+
|
|
465
|
+
```
|
|
466
|
+
app/
|
|
467
|
+
├── images/
|
|
468
|
+
│ └── logo.png
|
|
469
|
+
└── index.m
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
在代码中引用:
|
|
473
|
+
|
|
474
|
+
```xml
|
|
475
|
+
<img src="./images/logo.png"/>
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
---
|
|
479
|
+
|
|
480
|
+
## 下一步
|
|
481
|
+
|
|
482
|
+
- 查看 [架构文档](./architecture.md) 深入了解系统设计
|
|
483
|
+
- 查看 [.m 文件规范](./magic-file/index.md) 学习组件开发
|
|
484
|
+
- 查看 [API 参考](./api/index.md) 了解 Runtime API
|
|
485
|
+
- 查看 [配置手册](./config-reference.md) 掌握配置选项
|