Appearance
此为我项目 mbler 的子仓库,请了解mbler用法再来文档 mcx可见仓库Github 项目仓库
mcx介绍可见Mcx文档
先简单概括 mcx
mcx可以让你的mcbe行为包不需要复杂的物品、配方等的JSON,还能让你的事件注册不需要繁琐的操作原生和背方法名。
先看示例
将 mbler.config.json 里面的 script.main 设为 index.js (可选),然后在bp的ascripts文件夹里面 index.js
javascript
import App from "./app.mcx";
import * as Server from "@minecraft/server";
import * as ScriptUi from "@minecraft/server-ui";
import { createApp } from "@mbler/mcx";
createApp(App).mout(SErver, ScriptUi);app.mcx
<script>
import Event from "./event.mcx";
import Component from "./component.mcx";
// 由于是要编译成静态json的,是个宏,所以不能重复调用
Component.use();
// 整个事件里面的事件全部注册,也可以用unsubscibe全部取消,也可以传入对应事件名称操作指定事件
Event.subscibe();event.mcx
<Event @after>
PlayerJoin=eventHandler
</Event>
<script>
exports.PlayerJoin = function(event) {
event.player.sendMessage("欢迎进入游戏")
}
</script>component.mcx
<Component>
<items> <!--注册物品-->
<item id=test>subscribe</item>
</items>
</Component>
<script>
import {
ItemComponent
} from "@mbler/mcx"
export.subscribe = new ItemComponent({
id: "mbler_test:test",
opt: {
stacked_by_data: true,
max_stack_size: true,
display_name: "测试物品",
allow_off_hand: true,
hand_equipped: true,
foil: true,
glint: true
}
})
</script>这是一个示例mcx项目,当然还未实现mcx,欢迎代码贡献(mcx在mbler源码目录 lib/mcx )
所以...我们该如何写mcx?
首先,因为要用到ast,ast的各种结构手记很麻烦,于是,我选用 typescript 来编写解析器
然后,流程大概就如下
- 获取入口文件源码
- 使用babel生成入口文件的ast
- 遍历ast
- 静态导入 : 删除节点,把import的源和导入项信息提取到
this.buildCache.import,export也一样,提取到this.buildCache.export - 将总的ast提取到一个function,然后用babel node的格式在这个ast的开头添加类似
const xxx = ___Module.import(modulePath, __Module.dirname),因为要实现合并,这里大部分直接操作ast生成,内置Module类由template文件夹存储 - 导出就提取到末尾,例如
__Module.export = ...,后续Module提取导出项 - Module类的init方法由ast修改,插入类似
this.modules[modulePath / name] = this.HandlerModule(function(__Module){...模块实现})的结构