ms-vite-plugin 1.1.2 → 1.1.3

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 (94) hide show
  1. package/dist/build.js +6 -0
  2. package/dist/cli.js +91 -1
  3. package/dist/mcp/device-config.d.ts +55 -0
  4. package/dist/mcp/device-config.js +183 -0
  5. package/dist/mcp/docs-service.d.ts +65 -0
  6. package/dist/mcp/docs-service.js +168 -0
  7. package/dist/mcp/project.d.ts +16 -0
  8. package/dist/mcp/project.js +74 -0
  9. package/dist/mcp/tools.d.ts +18 -0
  10. package/dist/mcp/tools.js +825 -0
  11. package/dist/mcp/types.d.ts +32 -0
  12. package/dist/mcp/types.js +11 -0
  13. package/dist/mcp-server.d.ts +2 -0
  14. package/dist/mcp-server.js +86 -0
  15. package/dist/project.d.ts +89 -0
  16. package/dist/project.js +306 -0
  17. package/dist/version.d.ts +12 -0
  18. package/dist/version.js +63 -0
  19. package/docs/api/action.md +922 -0
  20. package/docs/api/appleocr.md +229 -0
  21. package/docs/api/config.md +122 -0
  22. package/docs/api/cryptoUtils.md +232 -0
  23. package/docs/api/device.md +374 -0
  24. package/docs/api/file.md +516 -0
  25. package/docs/api/global.md +617 -0
  26. package/docs/api/hid.md +1032 -0
  27. package/docs/api/hotUpdate.md +166 -0
  28. package/docs/api/http.md +548 -0
  29. package/docs/api/image.md +907 -0
  30. package/docs/api/ime.md +290 -0
  31. package/docs/api/logger.md +324 -0
  32. package/docs/api/media.md +248 -0
  33. package/docs/api/mysql.md +441 -0
  34. package/docs/api/netCard.md +200 -0
  35. package/docs/api/node.md +353 -0
  36. package/docs/api/paddleocr.md +246 -0
  37. package/docs/api/pip.md +242 -0
  38. package/docs/api/system.md +572 -0
  39. package/docs/api/thread.md +269 -0
  40. package/docs/api/tomatoocr.md +425 -0
  41. package/docs/api/tts.md +334 -0
  42. package/docs/api/ui.md +947 -0
  43. package/docs/api/utils.md +265 -0
  44. package/docs/api/yolo.md +310 -0
  45. package/docs/apicn/action.md +919 -0
  46. package/docs/apicn/appleocr.md +233 -0
  47. package/docs/apicn/config.md +120 -0
  48. package/docs/apicn/device.md +385 -0
  49. package/docs/apicn/file.md +511 -0
  50. package/docs/apicn/global.md +613 -0
  51. package/docs/apicn/hid.md +1033 -0
  52. package/docs/apicn/hotUpdate.md +170 -0
  53. package/docs/apicn/http.md +672 -0
  54. package/docs/apicn/image.md +924 -0
  55. package/docs/apicn/ime.md +290 -0
  56. package/docs/apicn/logger.md +332 -0
  57. package/docs/apicn/media.md +252 -0
  58. package/docs/apicn/mysql.md +445 -0
  59. package/docs/apicn/netCard.md +200 -0
  60. package/docs/apicn/node.md +362 -0
  61. package/docs/apicn/paddleocr.md +255 -0
  62. package/docs/apicn/pip.md +242 -0
  63. package/docs/apicn/system.md +575 -0
  64. package/docs/apicn/thread.md +269 -0
  65. package/docs/apicn/tts.md +338 -0
  66. package/docs/apicn/ui.md +933 -0
  67. package/docs/apicn/utils.md +265 -0
  68. package/docs/apicn/yolo.md +314 -0
  69. package/docs/apipython/action.md +901 -0
  70. package/docs/apipython/appleocr.md +226 -0
  71. package/docs/apipython/config.md +126 -0
  72. package/docs/apipython/cryptoUtils.md +246 -0
  73. package/docs/apipython/device.md +365 -0
  74. package/docs/apipython/file.md +476 -0
  75. package/docs/apipython/g.md +154 -0
  76. package/docs/apipython/hid.md +1059 -0
  77. package/docs/apipython/hotUpdate.md +154 -0
  78. package/docs/apipython/image.md +938 -0
  79. package/docs/apipython/ime.md +306 -0
  80. package/docs/apipython/logger.md +330 -0
  81. package/docs/apipython/media.md +221 -0
  82. package/docs/apipython/mysql.md +432 -0
  83. package/docs/apipython/netCard.md +219 -0
  84. package/docs/apipython/node.md +331 -0
  85. package/docs/apipython/overview.md +66 -0
  86. package/docs/apipython/paddleocr.md +211 -0
  87. package/docs/apipython/pip.md +231 -0
  88. package/docs/apipython/system.md +458 -0
  89. package/docs/apipython/tomatoocr.md +444 -0
  90. package/docs/apipython/tts.md +331 -0
  91. package/docs/apipython/ui.md +949 -0
  92. package/docs/apipython/utils.md +284 -0
  93. package/docs/apipython/yolo.md +281 -0
  94. package/package.json +8 -4
@@ -0,0 +1,219 @@
1
+ # 卡密模块 (NetCard)
2
+
3
+ 卡密模块提供了卡密验证、备注设置以及键值对存储功能,用于管理网络卡密相关的操作。
4
+
5
+ ## 功能概览
6
+
7
+ - **卡密验证**: 验证卡密的有效性
8
+ - **备注管理**: 设置和管理卡密备注信息
9
+ - **云变量存储**: 提供键值对形式的数据存储和读取功能
10
+
11
+ ## 注意事项
12
+
13
+ 1. **卡密安全**: 卡密信息应当妥善保管,避免在日志中明文输出
14
+ 2. **API 调用顺序**: 验证卡密后,其他 api 才能调用
15
+
16
+ ## API 参考
17
+
18
+ ### 卡密验证
19
+
20
+ #### verify - 验证卡密
21
+
22
+ ```python
23
+ def verify(cardNo: str) -> bool
24
+ ```
25
+
26
+ **参数说明:**
27
+
28
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
29
+ | -------- | ---- | -------- | ------ | -------------------- |
30
+ | `cardNo` | str | 是 | | 需要验证的卡密字符串 |
31
+
32
+ **返回值:**
33
+
34
+ | 类型 | 描述 |
35
+ | ------ | ----------------------------------------------- |
36
+ | `bool` | 验证结果,True 表示验证成功,False 表示验证失败 |
37
+
38
+ **示例 1:**
39
+
40
+ ```python
41
+ from kuaijs import netcard, logger
42
+ import sys
43
+
44
+ # 验证卡密
45
+ cardNo = "ABC123456789"
46
+ isValid = netcard.verify(cardNo)
47
+
48
+ if isValid:
49
+ logger.info("卡密验证成功")
50
+ else:
51
+ logger.error("卡密验证失败")
52
+ # 注意卡密验证失败退出程序
53
+ sys.exit(0)
54
+ ```
55
+
56
+ **示例 2:**
57
+
58
+ ```python
59
+ from kuaijs import netcard, logger, config
60
+ import sys
61
+
62
+ # 验证卡密 从配置中获取卡密
63
+ cardNo = config.get("cardNo")
64
+ isValid = netcard.verify(cardNo)
65
+
66
+ if isValid:
67
+ logger.info("卡密验证成功")
68
+ else:
69
+ logger.error("卡密验证失败")
70
+ # 注意卡密验证失败退出程序
71
+ sys.exit(0)
72
+ ```
73
+
74
+ ### 获取卡密信息
75
+
76
+ #### getCardInfo - 获取卡密信息
77
+
78
+ ```python
79
+ from typing import TypedDict, Optional
80
+
81
+ class CardInfo(TypedDict):
82
+ cardNo: str
83
+ batchCard: str
84
+ remark: str
85
+ activeTime: int
86
+ expireTime: int
87
+
88
+ def getCardInfo() -> Optional[CardInfo]
89
+ ```
90
+
91
+ **返回值:**
92
+
93
+ | 类型 | 描述 |
94
+ | ---------- | ------------------------------------ |
95
+ | `CardInfo` | 卡密信息对象,包含卡密及备注和时间等 |
96
+
97
+ `CardInfo` 字段:
98
+
99
+ - `cardNo`: 卡密号码
100
+ - `batchCard`: 批量码
101
+ - `remark`: 备注
102
+ - `activeTime`: 激活时间
103
+ - `expireTime`: 过期时间
104
+
105
+ **示例:**
106
+
107
+ ```python
108
+ from kuaijs import netcard, logger
109
+
110
+ # 获取卡密信息
111
+ cardInfo = netcard.getCardInfo()
112
+ if cardInfo:
113
+ logger.info(f"卡密信息: {cardInfo}")
114
+ ```
115
+
116
+ ### 备注管理
117
+
118
+ #### setCardRemark - 设置卡密备注
119
+
120
+ ```python
121
+ def setCardRemark(remark: str) -> bool
122
+ ```
123
+
124
+ **参数说明:**
125
+
126
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
127
+ | -------- | ---- | -------- | ------ | -------------- |
128
+ | `remark` | str | 是 | | 备注信息字符串 |
129
+
130
+ **返回值:**
131
+
132
+ | 类型 | 描述 |
133
+ | ------ | ----------------------------------------------- |
134
+ | `bool` | 设置结果,True 表示设置成功,False 表示设置失败 |
135
+
136
+ **示例:**
137
+
138
+ ```python
139
+ from kuaijs import netcard, logger
140
+
141
+ # 设置卡密备注
142
+ remark = "测试用户卡密"
143
+ success = netcard.setCardRemark(remark)
144
+
145
+ if success:
146
+ logger.info("备注设置成功")
147
+ else:
148
+ logger.error("备注设置失败")
149
+ ```
150
+
151
+ ### 云变量
152
+
153
+ #### setValue - 设置键值对
154
+
155
+ ```python
156
+ def setValue(key: str, value: str) -> str
157
+ ```
158
+
159
+ **参数说明:**
160
+
161
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
162
+ | ------- | ---- | -------- | ------ | ---------- |
163
+ | `key` | str | 是 | | 存储的键名 |
164
+ | `value` | str | 是 | | 存储的值 |
165
+
166
+ **返回值:**
167
+
168
+ | 类型 | 描述 |
169
+ | ----- | --------------------------------------------- |
170
+ | `str` | 成功时返回设置的 value 值,失败时返回空字符串 |
171
+
172
+ **示例:**
173
+
174
+ ```python
175
+ from kuaijs import netcard, logger
176
+
177
+ # 设置键值对
178
+ key = "userConfig"
179
+ value = "enableNotification"
180
+ result = netcard.setValue(key, value)
181
+
182
+ if result == value:
183
+ logger.info(f"成功设置 {key}: {value}")
184
+ else:
185
+ logger.error("设置失败")
186
+ ```
187
+
188
+ #### getValue - 获取键值对
189
+
190
+ ```python
191
+ def getValue(key: str) -> str
192
+ ```
193
+
194
+ **参数说明:**
195
+
196
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
197
+ | ------ | ---- | -------- | ------ | ------------ |
198
+ | `key` | str | 是 | | 要获取的键名 |
199
+
200
+ **返回值:**
201
+
202
+ | 类型 | 描述 |
203
+ | ----- | ------------------------------------------------ |
204
+ | `str` | 成功时返回对应的值,失败或键不存在时返回空字符串 |
205
+
206
+ **示例:**
207
+
208
+ ```python
209
+ from kuaijs import netcard, logger
210
+
211
+ # 获取键值对
212
+ key = "userConfig"
213
+ value = netcard.getValue(key)
214
+
215
+ if value:
216
+ logger.info(f"获取到配置: {key} = {value}")
217
+ else:
218
+ logger.warn(f"配置 {key} 不存在或获取失败")
219
+ ```
@@ -0,0 +1,331 @@
1
+ # 节点模块 (Node)
2
+
3
+ 节点模块提供了强大的 UI 元素访问和操作功能,可以通过各种条件选择和操作界面元素。
4
+
5
+ **注意事项**
6
+
7
+ - 此模块仅支持 快点 Agent 模式使用
8
+
9
+ ## 类型定义
10
+
11
+ ```python
12
+ from typing import List, Literal, Optional, TypedDict, Union
13
+
14
+ class NodeBounds:
15
+ x: int
16
+ y: int
17
+ width: int
18
+ height: int
19
+ centerX: int
20
+ centerY: int
21
+
22
+ class NodeInfo:
23
+ id: str
24
+ identifier: str
25
+ label: str
26
+ type: str
27
+ value: str
28
+ placeholderValue: str
29
+ title: str
30
+ visible: bool
31
+ enabled: bool
32
+ bounds: NodeBounds
33
+ depth: int
34
+ index: int
35
+ parentId: str
36
+ childCount: int
37
+
38
+ def clickCenter(self) -> bool: ...
39
+ def clickRandom(self) -> bool: ...
40
+ def hittable(self) -> bool: ...
41
+ def parent(self) -> Optional["NodeInfo"]: ...
42
+ def child(self, index: int) -> Optional["NodeInfo"]: ...
43
+ def allChildren(self) -> List["NodeInfo"]: ...
44
+ def siblings(self) -> List["NodeInfo"]: ...
45
+ def previousSiblings(self) -> List["NodeInfo"]: ...
46
+ def nextSiblings(self) -> List["NodeInfo"]: ...
47
+
48
+ class NodeSelectorOptions(TypedDict, total=False):
49
+ maxDepth: int # 最大层级深度,默认 50
50
+ ```
51
+
52
+ ## 节点选择器 (NodeSelector)
53
+
54
+ 节点选择器是访问 UI 元素的核心工具,提供了灵活的筛选和查找机制。
55
+
56
+ ### 创建节点选择器
57
+
58
+ #### `createNodeSelector` - 创建节点选择器
59
+
60
+ 创建一个新的节点选择器实例。
61
+
62
+ ```python
63
+ def createNodeSelector(params: Optional[NodeSelectorOptions] = None) -> NodeSelector
64
+ ```
65
+
66
+ **参数说明:**
67
+
68
+ | 参数名 | 类型 | 是否必填 | 默认值 | 描述 |
69
+ | ---------- | ---- | -------- | ------ | --------------------- |
70
+ | `maxDepth` | int | 否 | 50 | 最大层级深度,默认 50 |
71
+
72
+ **返回值:** `NodeSelector`
73
+
74
+ **示例:**
75
+
76
+ ```python
77
+ from kuaijs import node
78
+
79
+ # 创建选择器
80
+ selector = node.createNodeSelector({
81
+ "maxDepth": 20 # 最大20层深度
82
+ })
83
+ ```
84
+
85
+ ### 选择器方法
86
+
87
+ #### 获取节点
88
+
89
+ ```python
90
+ # 获取当前页面的 XML 字符串
91
+ def xml(timeout: int = 5000) -> Optional[str]
92
+
93
+ # 获取多个节点
94
+ def getNodeInfo(timeout: int = 5000) -> List[NodeInfo]
95
+
96
+ # 获取单个节点
97
+ def getOneNodeInfo(timeout: int = 5000) -> Optional[NodeInfo]
98
+
99
+ # 加载节点数据(通常内部自动调用)
100
+ def loadNode(timeout: int = 5000) -> NodeSelector
101
+
102
+ # 清除所有选择条件
103
+ def clearSelector() -> NodeSelector
104
+ ```
105
+
106
+ **示例:**
107
+
108
+ ```python
109
+ from kuaijs import node
110
+
111
+ selector = node.createNodeSelector()
112
+
113
+ # 获取所有匹配的节点
114
+ all_nodes = selector.getNodeInfo(5000)
115
+ print(f"找到 {len(all_nodes)} 个节点")
116
+
117
+ # 获取第一个匹配的节点
118
+ first_node = selector.getOneNodeInfo(3000)
119
+ if first_node:
120
+ print(f"节点标签: {first_node.label}")
121
+ ```
122
+
123
+ #### 条件筛选
124
+
125
+ ##### 文本相关
126
+
127
+ ```python
128
+ # 精确匹配标签
129
+ def label(text: str) -> NodeSelector
130
+
131
+ # 标签模糊匹配
132
+ def labelMatch(pattern: str) -> NodeSelector
133
+
134
+ # 精确匹配名称
135
+ def title(text: str) -> NodeSelector
136
+
137
+ # 名称模糊匹配
138
+ def titleMatch(pattern: str) -> NodeSelector
139
+
140
+ # 精确匹配标识符
141
+ def identifier(text: str) -> NodeSelector
142
+
143
+ # 标识符模糊匹配
144
+ def identifierMatch(pattern: str) -> NodeSelector
145
+
146
+ # 精确匹配值
147
+ def value(text: str) -> NodeSelector
148
+
149
+ # 值模糊匹配
150
+ def valueMatch(pattern: str) -> NodeSelector
151
+ ```
152
+
153
+ **示例:**
154
+
155
+ ```python
156
+ # 查找标签为"确定"的按钮
157
+ confirm_button = selector.label("确定").getOneNodeInfo(3000)
158
+
159
+ # 查找包含"登录"的元素
160
+ login_elements = selector.labelMatch(".*登录.*").getNodeInfo(3000)
161
+
162
+ # 查找名称包含"button"的元素
163
+ buttons = selector.titleMatch("button").getNodeInfo(3000)
164
+
165
+ # 查找值为"submit"的元素
166
+ submit_element = selector.value("submit").getOneNodeInfo(2000)
167
+
168
+ # 通过标识符查找
169
+ el_by_id = selector.identifier("login_btn").getOneNodeInfo(2000)
170
+ fuzzy = selector.identifierMatch("^login_.*").getNodeInfo(3000)
171
+ ```
172
+
173
+ ##### 类型与属性
174
+
175
+ ```python
176
+ # 精确匹配类型
177
+ def type(type_title: str) -> NodeSelector
178
+
179
+ # 类型模糊匹配
180
+ def typeMatch(pattern: str) -> NodeSelector
181
+
182
+ # 启用状态
183
+ def enabled(flag: bool) -> NodeSelector
184
+
185
+ # 可见性
186
+ def visible(flag: bool) -> NodeSelector
187
+ ```
188
+
189
+ **示例:**
190
+
191
+ ```python
192
+ from kuaijs import node
193
+
194
+ selector = node.createNodeSelector()
195
+
196
+ # 查找所有按钮
197
+ all_buttons = selector.type("XCUIElementTypeButton").getNodeInfo(3000)
198
+
199
+ # 查找所有文本框
200
+ text_fields = selector.typeMatch("XCUIElementTypeTextField").getNodeInfo(3000)
201
+
202
+ # 查找启用的元素
203
+ enabled_elements = selector.enabled(True).getNodeInfo(3000)
204
+ ```
205
+
206
+ ##### 位置与结构
207
+
208
+ ```python
209
+ # 索引位置
210
+ def index(idx: int) -> NodeSelector
211
+
212
+ # 层级深度
213
+ def depth(d: int) -> NodeSelector
214
+
215
+ # 子节点数量(支持表达式,如 ">0")
216
+ def childCount(expr: Union[int, str]) -> NodeSelector
217
+
218
+ # 边界范围
219
+ def bounds(x: int, y: int, width: int, height: int) -> NodeSelector
220
+
221
+ # XPath 路径
222
+ def xpath(path: str) -> NodeSelector
223
+ ```
224
+
225
+ **说明:** `*_match` 支持正则/模糊匹配;`childCount` 支持表达式(如 `>0`)。
226
+
227
+ **示例:**
228
+
229
+ ```python
230
+ from kuaijs import node
231
+
232
+ selector = node.createNodeSelector()
233
+
234
+ # 查找第一个元素
235
+ first_element = selector.index(0).getOneNodeInfo(2000)
236
+
237
+ # 查找特定深度的元素
238
+ level3_elements = selector.depth(3).getNodeInfo(3000)
239
+
240
+ # 查找有子节点的元素
241
+ parent_elements = selector.childCount(">0").getNodeInfo(3000)
242
+
243
+ # 查找特定区域的元素
244
+ region_elements = selector.bounds(100, 100, 200, 50).getNodeInfo(3000)
245
+
246
+ # 使用 XPath 查找
247
+ xpath_elements = selector.xpath("//*[@title='快点JS']").getNodeInfo(3000)
248
+ ```
249
+
250
+ ## 节点操作
251
+
252
+ `NodeSelector` 查找得到的 `NodeInfo` 支持直接调用操作方法(点击、无障碍手势等)。
253
+
254
+ ### 点击操作
255
+
256
+ ```python
257
+ # 点击节点中心
258
+ def clickCenter() -> bool
259
+
260
+ # 随机点击节点区域
261
+ def clickRandom() -> bool
262
+
263
+ # 节点是否可接收事件(用于判断是否显示在屏幕上)
264
+ def hittable() -> bool
265
+ ```
266
+
267
+ **示例:**
268
+
269
+ ```python
270
+ from kuaijs import node
271
+
272
+ selector = node.createNodeSelector()
273
+
274
+ # 查找并点击确定按钮
275
+ confirm_btn = selector.label("确定").type("XCUIElementTypeButton").getOneNodeInfo(3000)
276
+
277
+ if confirm_btn:
278
+ print(f"是否可接收事件: {confirm_btn.hittable()}")
279
+
280
+ clicked = confirm_btn.clickCenter()
281
+ if clicked:
282
+ print("成功点击确定按钮")
283
+
284
+ # 随机点击避免检测
285
+ confirm_btn.clickRandom()
286
+ ```
287
+
288
+ ### 节点导航
289
+
290
+ ```python
291
+ # 获取父节点
292
+ def parent() -> Optional[NodeInfo]
293
+
294
+ # 获取指定索引的子节点
295
+ def child(index: int) -> Optional[NodeInfo]
296
+
297
+ # 获取所有子节点
298
+ def allChildren() -> List[NodeInfo]
299
+
300
+ # 获取兄弟节点
301
+ def siblings() -> List[NodeInfo]
302
+
303
+ # 获取前面的兄弟节点
304
+ def previousSiblings() -> List[NodeInfo]
305
+
306
+ # 获取后面的兄弟节点
307
+ def nextSiblings() -> List[NodeInfo]
308
+ ```
309
+
310
+ **示例:**
311
+
312
+ ```python
313
+ from kuaijs import node
314
+
315
+ selector = node.createNodeSelector()
316
+
317
+ # 查找输入框并获取其父容器
318
+ text_field = selector.type("XCUIElementTypeTextField").getOneNodeInfo(3000)
319
+
320
+ if text_field:
321
+ container = text_field.parent()
322
+ if container:
323
+ print(f"容器类型: {container.type}")
324
+
325
+ # 获取容器的所有子元素
326
+ children = container.allChildren()
327
+ print(f"容器包含 {len(children)} 个子元素")
328
+
329
+ # 查找同级的按钮
330
+ sibling_buttons = [n for n in children if n.type == "XCUIElementTypeButton"]
331
+ ```
@@ -0,0 +1,66 @@
1
+ # Python API 使用教程
2
+
3
+ - `快点JS` 在 Python 环境中提供与 JS API 对齐的模块,模块名与 JS 保持一致。
4
+
5
+ - 导入方式:
6
+
7
+ ```python
8
+ from kuaijs import action, hid, image, appleocr, paddleocr, yolo, system, device, file, mysql, netcard, ime, media, hotupdate, tomatoocr, tts, ui, utils, node, pip, logger
9
+ ```
10
+
11
+ ## 下载资源
12
+
13
+ - 官方网盘下载:[链接](https://pan.kuai.js.cn/#/_/%E5%BF%AB%E7%82%B9JS)
14
+
15
+ ## nodejs 环境
16
+
17
+ `快点JS` 开发工具基于 nodejs 环境,因此需要先安装 nodejs 环境。
18
+
19
+ ## python 环境
20
+
21
+ `快点JS` - Python 基于 Python3.14 版本,因此需要先安装 Python3.14 环境。
22
+
23
+ 自行安装:`pip install kuaijs-ios` 以获取代码提示
24
+
25
+ ## IDE 配置
26
+
27
+ ### Visual Studio Code
28
+
29
+ `快点JS` 使用 Visual Studio Code 作为主要开发工具,并安装以下扩展:
30
+
31
+ #### 必需扩展
32
+
33
+ - **`快点JS开发工具`** - 提供 `快点JS` 相关功能,如创建项目、代码补全、图色工具、节点查找、打包软件包 等
34
+
35
+ #### 安装步骤
36
+
37
+ 1. 打开 Visual Studio Code
38
+ 2. 点击左侧扩展图标(或使用快捷键 `Ctrl+Shift+X`)
39
+ 3. 在搜索框中输入 `快点JS开发工具`
40
+ <img src="/img/DevPlugin.jpg" width="800" alt="安装快点JS开发工具">
41
+ 4. 点击安装按钮安装扩展
42
+ 5. 安装完成后,重新启动 Visual Studio Code
43
+
44
+ ## 创建项目
45
+
46
+ - 参照[创建 JS 项目](../quick/createProject.md)创建项目
47
+
48
+ - 创建项目时选择 `Python` 作为项目类型
49
+
50
+ ## 标准库
51
+
52
+ Python 的标准库大部分都是支持的.
53
+
54
+ multiprocessing: ios 的沙盒模式限制.不能多次开辟进程.
55
+
56
+ ## 第三方库
57
+
58
+ 除了标准库外,我们也增加了一些常用的第三方库
59
+
60
+ ```
61
+ "numpy==2.5.0",
62
+ "opencv-python==4.14.0"
63
+ "requests",
64
+ "websockets",
65
+ "PyMySQL"
66
+ ```