Reference
API 与模板标签速查
覆盖核心类型、互操作属性、导入导出以及模板标签含义,便于在编码时快速查找。
核心类型(代码:MorkJs/ShenGu.Script)
MorkJs.cs
Parse(string script):解析脚本为可复用的MorkJs(线程安全,可缓存)。Execute(ScriptContext context):执行解析后的语法树,结果在context.Result。- 内部支持 import/export、调试断点(
debugger关键字)以及运算符重载回调(见ScriptContext.RegisterOperatorExecutor)。
ScriptContext.cs
- 变量管理:
AddValue/SetValue/RemoveValue/GetValue。 - 类型注册:
RegisterType(s)(可携带ObjectMemberFlags),Mappings/AddMappings读取[ScriptMapping]成员。 - 结果与 this:
ScriptResult(脚本对象)、Result(CLR 值)、ThisObject/ScriptThisObject。 - 执行控制:
Pause()/Continue()/IsPaused,SetCacheValue/GetCacheValue传递运行时数据。 - 导入:
ImportManager(IImportSourceManager)。
ScriptUtils.cs
RegisterType(s):预热类型成员缓存,减少运行时反射成本。Stringify:将IScriptObject转为 JSON 风格字符串。ToScriptObject/ToValue:CLR 对象与脚本对象互转,支持空值、数值、字符串、数组、字典、DataTable。Eval、ExecuteScript、ExecuteTemplate:便捷执行接口。CreateSystemMappings(bool):生成包含 Object/Array/String/Number/Date 等系统映射的成员列表。ObjectConverter:自定义ScriptObject转 CLR 的全局钩子。
.NET 成员暴露与属性(ScriptNativeObject.cs)
属性标记
[ScriptObject(MemberFlags, FirstLowerLetter)]:控制默认暴露的成员范围,支持首字母小写转换。[ObjectMember(Name, IsEnumerable)]:显式暴露字段/属性/方法,可重命名。[IgnoreMember]:从暴露列表中排除成员。[ObjectConstructor]:指定可被脚本调用的构造函数。[AddMember(Name, Script)]:在类型加载时追加脚本成员。
脚本名与代理
[ScriptMapping(Name)]:遍历并注册为全局变量/函数(context.AddMappings)。[ScriptProxy(RealType)]:为真实类型提供代理(如FormProxy替代Form)。- 内置代理:
DataTableProxy、DataRowCollectionProxy、DataRowProxy使脚本可遍历DataTable。
对象创建
ScriptNativeObject.CreateNativeObject:包装 CLR 实例为脚本对象。ScriptNativeArray:数组包装,支持索引访问与length。ScriptNativeDelegate:将委托包装为脚本函数。ScriptMappingList:通过Register手动注册键值或工厂方法(CreateScriptObjectHandler)。
模块与导入
脚本 import/export
- 解析阶段识别 ES 模块语法(
import/export/from/as/*/default)。 IImportSourceManager.GetSource返回IImportSource,可以直接提供Parser或Result(缓存的执行结果)。- 示例实现:
ImportExportExecutor使用嵌套类ImportSource从内存字符串创建MorkJs。
模板 import/export
<@import code="id" from="path"/>:生成import id from "path";。<@export code="default myComp"/>或带from的转发。TemplateImportSource:可通过CreateByTemplate/CreateByScript/CreateByResult包装模板或脚本作为 import 来源。
模板标签速查(TemplateParser.cs)
| 标签 | 用途 | 要点 |
|---|---|---|
<@if code=""> / <@else if=""/> / <@else> | 条件判断 | if 与 else 之间不能有其他内容(除空白)。 |
<@for code=""> | for 语句 | 支持 for(;;)、for...in、for...of。 |
<@while code=""> / <@do while=""> | 循环 | do...while 结束标签写为 <@do while="...">...</@do>。 |
<@switch code=""> + <@case> + <@default> | 分支 | <@case /> 或 ignoreBreak="true" 可省略自动 break。 |
<@break/> / <@continue/> | 循环控制 | 仅可出现在循环块内。 |
@{expr} / @@{expr} | 输出表达式 | @@{} 会输出 null/undefined,@{} 不会。 |
<@line code="" /> | 单行语句 | 自动在尾部追加分号。 |
<@code>...</@code> 或 <@>...</@> | 自由脚本块 | 原样写入生成的脚本。 |
<@try> / <@catch code="e"> / <@finally> | 异常处理 | 与 JavaScript try/catch/finally 对应。 |
<@function id="" code=""> | 定义函数 | 生成 function id(code) { ... }。 |
<@component ...> | 组件定义/注册 | export 导出组件;define="a,b" 仅注册标签用于调用。 |
<@slot id="" code=""> | 插槽 | 默认插槽 id 为 __default;可包含回退内容。 |
<@template id="" code=""> | 调用方提供的插槽实现 | 必须是组件节点的直接子级。 |
<@invoke id="" code="" /> | 执行指定函数 | 生成 id(code);。 |
<@import> / <@export> | 模板层的模块引入与导出 | 与脚本 import/export 语法保持一致。 |
<@nowrap> | 保留原始行 | 内部文本不输出额外换行。 |
<@debugger/> | 调试 | 插入 JavaScript debugger; 语句。 |
运行时特性
空值与布尔
ScriptUtils.IsNull:判断null/undefined。ScriptUtils.IsTrue:脚本对象是否为真值(包装类型会取内部布尔)。
执行控制
- 多线程:
MorkJs可多线程复用;ScriptContext单次执行绑定线程(见MorkJs.Execute中的线程检查)。 - 暂停:
Pause/Continue保持调用栈,适用于外部等待。 - 异常:解析/执行异常对应
ScriptParseException、ScriptExecuteException(附带行列号)。
模板执行管线
TemplateParser.Parse将模板生成脚本,可选择doCheck预先语法校验。TemplateParser.Execute使用ITemplateExecutor输出;默认实现StringTemplateExecutor直接返回字符串。- 输出函数:
__out(片段输出)、__write(值输出)可通过设置OutputFunctionName/WriteFunctionName重载。