MScriptsVS Code 扩展,用于高效编辑 MCGS Web 4.0 工程配置中的 MScript 脚本。 MScript 是一种基于 JavaScript 的轻量级脚本语言,专用于配置化场景。工程数据以 JSON 存储,其中的脚本以
功能特性
工作原理工程 JSON 中脚本以 Base64 内嵌,直接阅读与编辑困难。插件在两种格式间转换:
打开:解码 Base64 → 转换 双向转换规则
使用方式1. 打开 MScript 编辑器在任意启用的 JSON 文件(默认
编辑器标题形如 2.
|
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
mcgscript.fileTypes |
string[] |
["json"] |
启用 MScript 功能的文件类型(VS Code 语言标识符) |
mcgscript.ignoreError |
boolean |
false |
为 true 时,即使编辑器中存在错误也允许直接保存 |
mcgscript.Utils |
object |
{} |
Runtime 工具类(类型定义),用于代码补全 |
mcgscript.Nodes |
object |
{} |
节点类型定义,用于 @路径 补全 |
Utils/Nodes留空时使用内置默认值(见src/config/defaults.ts)。
项目级配置(.mscript/config.json)
在工作区根放置 .mscript/config.json 可覆盖扩展设置,优先级高于 VS Code 设置:
{
"ignoreError": true,
"options": {
"Utils": { "MyUtil": { "detail": "自定义工具类" } }, // 非空则整体替换内置定义
"Nodes": { "MyWidget": { "detail": "自定义节点", "extends": ["VObject"] } }
},
"exoptions": {
"Utils": { "MyUtil": { "detail": "追加/覆盖单个工具类" } }, // 在已解析基础上合并
"Nodes": { "MyWidget": { "detail": "追加/覆盖单个节点定义" } }
}
}
合并语义:
options—— 替换:非空则完全替代默认值/扩展设置;exoptions—— 合并:在已解析的Utils/Nodes基础上追加或覆盖具体条目;ignoreError—— 项目配置 > 扩展配置 > 默认false。
注:旧版本的
entry字段已废弃(改为动态解析),配置文件中的entry将被忽略,可安全删除。
配置文件变更(VS Code 设置或 .mscript/config.json)会被自动监听并热刷新。
MScript 语法速查
存储格式
data:script;[参数名: 参数类型, ...];base64,<Base64 编码的脚本内容>
参数类型支持:TBoolean TInt TFloat TString TArray TStruct TColor TDate TScript TAny。
编辑格式语法
允许:
- 行注释
//(不允许块注释/* */) - 变量声明与赋值:
let x = ...、x = ...,支持+=-=*=/=等运算符 - 条件:
if/else if/else(可嵌套) - 特殊循环:
for (let [key, value, index, length] of iterable) {},支持continue/break - 断点调试:
debugger - 三元表达式、字符串拼接、值比较
Runtime运行时类及其工具类/方法@路径访问(get / set / call)
禁止:
- 函数定义:
function、new Function、() => {} - 块注释
/* */ - 调用
window下的原生对象/方法
条件判断与循环控制的嵌套最多三层。
示例
// 从参数获取 isRow
let isRow = Runtime.ctx.row
// 获取父节点的 ActiveLayout(@ 路径 get)
let layout = @../mActiveLayout
if (isRow) {
// 调用方法(@ 路径 call)
let rows = layout.fnRowHeights()
for (let [key, value, indxRow, length] of rows) {
let widget = @./fnGetValue("row_" + indxRow)
widget.size.mText = value == "max-content" ? "auto" : value
}
} else {
let cols = layout.fnColumnWidths()
for (let [key, value, indxCol] of cols) {
let widget = @./fnGetValue("col_" + indxCol)
widget.size.mText = value == "max-content" ? "auto" : value
}
}
数据结构
工程以 VObject 树组织,根节点为 Central(存储于 index.json):
type VOption = {
mGsid?: string
mType: string // 节点类型:Central / VModule / MWindow / Widget / WidgetWindow ...
properties?: Record<string, any> // 节点属性;VModule 的 mBasePath / mChildList / mExtName 亦在此
linkprop?: Record<string, Record<string, MScript>> // 属性订阅(数据变更触发脚本)
onevents?: Record<string, MScript> // 内置事件脚本
uievents?: Record<string, MScript> // UI 事件脚本(click / mousedown / keydown ...)
exevents?: Record<string, MScript> // 用户自定义事件脚本
exvariants?: Record<string, { type: string; value: any; readonly?: boolean }> // 自定义变量
children?: Record<string, VOption> // 子节点(内联或独立文件)
}
节点类型层级:
| 类型 | 继承 | 职责 |
|---|---|---|
VObject |
— | 框架基类:数据存储、订阅监听、事件脚本、自定义属性/事件、子节点 |
VModule |
VObject |
模块通用加载/存储;数据型业务模块,可独立文件存储 |
Central |
VModule |
工程根节点,管控工程加载与数据订阅代理中转 |
MWindow |
VModule |
UI 窗口管理:加载、渲染、路由 |
Widget |
VObject |
UI 组件基类:渲染、属性动态更新、UI 事件绑定 |
WidgetWindow |
Widget |
窗口组件,仅作 MWindow 直接子节点:布局、生命周期事件 |
独立文件存储:VModule 的 properties.mBasePath 非空时,其子节点数据存于 <mBasePath>/<childId>.<mExtName>(默认 json)。根节点必须存于 index.json,加载时依据 mBasePath + mChildList 递归构建树形结构。
许可证
MIT