@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.
Files changed (56) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +93 -0
  3. package/app.js +51 -0
  4. package/doc/api/examples.md +563 -0
  5. package/doc/api/index.md +563 -0
  6. package/doc/architecture.md +322 -0
  7. package/doc/config-reference.md +646 -0
  8. package/doc/data-model.md +622 -0
  9. package/doc/development-guide.md +582 -0
  10. package/doc/magic-file/index.md +610 -0
  11. package/doc/user-guide/index.md +485 -0
  12. package/doc/workflow.md +548 -0
  13. package/index.js +157 -0
  14. package/magic.bat +2 -0
  15. package/magic.ps1 +5 -0
  16. package/package.json +44 -0
  17. package/script/build-project.js +16 -0
  18. package/script/config.js +23 -0
  19. package/script/create-project.js +73 -0
  20. package/script/global/printf.js +13 -0
  21. package/script/global/project-build-config.js +161 -0
  22. package/script/global/support-platform.js +5 -0
  23. package/script/module/compiler/global.js +43 -0
  24. package/script/module/compiler/id-generate.js +18 -0
  25. package/script/module/compiler/index-dom.js +78 -0
  26. package/script/module/compiler/macro-replace.js +22 -0
  27. package/script/module/compiler/macro.js +6 -0
  28. package/script/module/compiler/start.js +10 -0
  29. package/script/module/compiler/step/1.js +253 -0
  30. package/script/module/compiler/step/2.js +79 -0
  31. package/script/module/compiler/step/3.js +37 -0
  32. package/script/module/compiler/step/4.js +20 -0
  33. package/script/module/compiler/step/5.js +634 -0
  34. package/script/module/compiler/step/6.js +304 -0
  35. package/script/module/compiler/step/end.js +124 -0
  36. package/script/run-project.js +249 -0
  37. package/script/util/bun-fs.js +40 -0
  38. package/script/util/copy-dir.js +21 -0
  39. package/script/util/create-simple-dom-element.js +23 -0
  40. package/script/util/file-util.js +95 -0
  41. package/script/util/filtration-file.js +20 -0
  42. package/script/util/get-dir-all-file.js +28 -0
  43. package/script/util/get-first-object-key.js +9 -0
  44. package/script/util/is-empty-object.js +8 -0
  45. package/script/util/is-string-over-size.js +4 -0
  46. package/script/util/is.js +18 -0
  47. package/script/util/logging.js +142 -0
  48. package/script/util/task.js +16 -0
  49. package/script/util/traversal.js +28 -0
  50. package/template/platform-config/node-webkit +23 -0
  51. package/template/platform-config/web +1 -0
  52. package/template/project-base/app.xml +5 -0
  53. package/template/project-base/build.module.toml +37 -0
  54. package/template/project-base/build.toml +43 -0
  55. package/template/runtime/runtime.css +3 -0
  56. 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) 掌握配置选项