好家伙,

 demo-general项目运行后主界面如下

 

解析阿里低开引擎中的初始化方法init

拆解项目来自阿里的lowcode engine目录下的 demo general项目

0.找到入口文件

可以看到整个项目用到的插件非常之多

于是

  1. init: init 方法用于初始化低代码引擎,负责加载各种插件并配置引擎的运行环境。

  2. plugins: plugins 是一个插件集合,包含了多个插件,用于扩展低代码引擎的功能。

  3. createFetchHandler: createFetchHandler 方法用于创建一个数据源的处理器,用于处理数据源相关的操作。

  4. EditorInitPlugin: 编辑器初始化插件,用于初始化低代码引擎的编辑器。

  5. UndoRedoPlugin: 撤销重做插件,提供撤销和重做操作的功能。

  6. ZhEnPlugin: 中英文切换插件,用于实现界面语言的切换。

  7. CodeGenPlugin: 代码生成插件,用于生成代码。

  8. DataSourcePanePlugin: 数据源面板插件,用于管理数据源。

  9. SchemaPlugin: Schema 插件,用于处理数据模型的定义和管理。

  10. CodeEditorPlugin: 代码编辑器插件,用于提供代码编辑功能。

  11. ManualPlugin: 手册插件,提供用户手册和帮助文档。

  12. InjectPlugin: 注入插件,用于注入特定功能或代码。

  13. SimulatorResizerPlugin: 模拟器调整插件,用于调整模拟器的大小。

  14. ComponentPanelPlugin: 组件面板插件,用于管理可用组件。

  15. DefaultSettersRegistryPlugin: 默认设置注册插件,用于注册默认设置。

  16. LoadIncrementalAssetsWidgetPlugin: 加载增量资源小部件插件,用于加载增量资源。

  17. SaveSamplePlugin: 保存示例插件,用于保存示例代码。

  18. PreviewSamplePlugin: 预览示例插件,用于预览示例代码。

  19. CustomSetterSamplePlugin: 自定义设置示例插件,用于自定义设置示例。

  20. SetRefPropPlugin: 设置引用属性插件,用于设置引用属性。

  21. LogoSamplePlugin: Logo 示例插件,用于展示 Logo 示例。

  22. SimulatorLocalePlugin: 模拟器语言插件,用于设置模拟器的语言。

  23. lowcodePlugin: 低代码组件插件,用于提供低代码组件功能。

  24. appHelper: 应用程序辅助方法,可能包含一些辅助函数或工具函数。

  25. global.scss: 全局样式文件,定义了全局的样式规则

那么把我们主要要解析的文件拿出来

就这行

import { init, plugins } from '@alilc/lowcode-engine';

1.官方文档定位包位置

 

2.在lowcode-engine中寻找init方法

 直接找到

engine-core引擎核心,是他没错了

 

我们来看看这段代码到底在做什么?

//engine-core.ts
export async function init(
container?: HTMLElement,
options?: IPublicTypeEngineOptions,
pluginPreference?: PluginPreference,
) {
await destroy();
let engineOptions = null;
if (isPlainObject(container)) {
engineOptions = container;
engineContainer = document.createElement('div');
engineContainer.id = 'engine';
document.body.appendChild(engineContainer);
} else {
engineOptions = options;
engineContainer = container;
if (!container) {
engineContainer = document.createElement('div');
engineContainer.id = 'engine';
document.body.appendChild(engineContainer);
}
}
engineConfig.setEngineOptions(engineOptions as any); const { Workbench } = common.skeletonCabin;
if (options && options.enableWorkspaceMode) {
const disposeFun = await pluginPromise;
disposeFun && disposeFun();
render(
createElement(WorkSpaceWorkbench, {
workspace: innerWorkspace,
// skeleton: workspace.skeleton,
className: 'engine-main',
topAreaItemClassName: 'engine-actionitem',
}),
engineContainer,
);
innerWorkspace.enableAutoOpenFirstWindow = engineConfig.get('enableAutoOpenFirstWindow', true);
innerWorkspace.setActive(true);
innerWorkspace.initWindow();
innerHotkey.activate(false);
await innerWorkspace.plugins.init(pluginPreference);
return;
} await plugins.init(pluginPreference as any); render(
createElement(Workbench, {
skeleton: innerSkeleton,
className: 'engine-main',
topAreaItemClassName: 'engine-actionitem',
}),
engineContainer,
);
}

 

回到前面demo-general项目中中初始化部分

//index.tx
(async function main() {
await registerPlugins(); init(document.getElementById('lce-container')!, {
locale: 'zh-CN',
enableCondition: true,
enableCanvasLock: true,
// 默认绑定变量
supportVariableGlobally: true,
requestHandlersMap: {
fetch: createFetchHandler(),
},
appHelper,
});
})();

 

3.解释init()

export async function init(
container?: HTMLElement, // 初始化函数参数:容器元素,可选
options?: IPublicTypeEngineOptions, // 初始化函数参数:引擎选项,可选
pluginPreference?: PluginPreference, // 初始化函数参数:插件偏好设置,可选
) {
await destroy(); // 销毁之前的状态,确保初始化干净 let engineOptions = null; // 初始化引擎选项变量 if (isPlainObject(container)) { // 如果容器是一个普通对象
engineOptions = container; // 将容器作为引擎选项
engineContainer = document.createElement('div'); // 创建一个新的 div 元素作为引擎容器
engineContainer.id = 'engine'; // 设置容器的 id 为 'engine'
document.body.appendChild(engineContainer); // 将容器添加到 body 中
} else {
engineOptions = options; // 使用传入的引擎选项
engineContainer = container; // 使用传入的容器
if (!container) { // 如果容器不存在
engineContainer = document.createElement('div'); // 创建一个新的 div 元素作为引擎容器
engineContainer.id = 'engine'; // 设置容器的 id 为 'engine'
document.body.appendChild(engineContainer); // 将容器添加到文档的 body 中
}
} engineConfig.setEngineOptions(engineOptions as any); // 设置引擎配置的选项 const { Workbench } = common.skeletonCabin; // 从骨架中解构出 Workbench 组件 if (options && options.enableWorkspaceMode) { // 如果启用工作区模式
const disposeFun = await pluginPromise; // 等待插件 Promise 的解析
disposeFun && disposeFun(); // 如果存在 disposeFun 函数,则执行 render( // 渲染工作区工作台组件
createElement(WorkSpaceWorkbench, {
workspace: innerWorkspace, // 传入内部工作区
className: 'engine-main', // 设置类名
topAreaItemClassName: 'engine-actionitem', // 设置顶部区域项的类名
}),
engineContainer, // 渲染到引擎容器中
); innerWorkspace.enableAutoOpenFirstWindow = engineConfig.get('enableAutoOpenFirstWindow', true); // 设置内部工作区自动打开第一个窗口的属性
innerWorkspace.setActive(true); // 设置工作区为活动状态
innerWorkspace.initWindow(); // 初始化窗口
innerHotkey.activate(false); // 激活快捷键
await innerWorkspace.plugins.init(pluginPreference); // 初始化工作区插件
return; // 返回
} await plugins.init(pluginPreference as any); // 初始化插件 render( // 渲染工作台组件
createElement(Workbench, {
skeleton: innerSkeleton, // 传入内部骨架
className: 'engine-main', // 设置类名
topAreaItemClassName: 'engine-actionitem', // 设置顶部区域项的类名
}),
engineContainer, // 渲染到引擎容器中
);
}

再来找

 

 最后,来到workbench.tsx中

4.workbench.tsx

export class Workbench extends Component<{
workspace: Workspace; // 工作空间对象
config?: EditorConfig; // 编辑器配置(可选)
components?: PluginClassSet; // 插件类集合
className?: string; // 类名
topAreaItemClassName?: string; // 顶部区域项的类名
}, {
workspaceEmptyComponent: any; // 工作空间为空时的组件
theme?: string; // 主题
}> {
constructor(props: any) {
super(props);
const { config, components, workspace } = this.props;
const { skeleton } = workspace;
skeleton.buildFromConfig(config, components); // 从配置和组件构建骨架
engineConfig.onGot('theme', (theme) => {
this.setState({
theme,
});
});
engineConfig.onGot('workspaceEmptyComponent', (workspaceEmptyComponent) => {
this.setState({
workspaceEmptyComponent,
});
});
this.state = {
workspaceEmptyComponent: engineConfig.get('workspaceEmptyComponent'), // 获取工作空间为空时的组件
theme: engineConfig.get('theme'), // 获取主题
};
} render() {
const { workspace, className, topAreaItemClassName } = this.props;
const { skeleton } = workspace;
const { workspaceEmptyComponent: WorkspaceEmptyComponent, theme } = this.state; return (
<div className={classNames('lc-workspace-workbench', className, theme)}>
<SkeletonContext.Provider value={skeleton}>
<TopArea className="lc-workspace-top-area" area={skeleton.topArea} itemClassName={topAreaItemClassName} /> {/* 渲染顶部区域 */}
<div className="lc-workspace-workbench-body">
<LeftArea className="lc-workspace-left-area lc-left-area" area={skeleton.leftArea} /> {/* 渲染左侧区域 */}
<LeftFloatPane area={skeleton.leftFloatArea} /> {/* 渲染左侧浮动区域 */}
<LeftFixedPane area={skeleton.leftFixedArea} /> {/* 渲染左侧固定区域 */}
<div className="lc-workspace-workbench-center">
<div className="lc-workspace-workbench-center-content">
<SubTopArea area={skeleton.subTopArea} itemClassName={topAreaItemClassName} /> {/* 渲染中上区域 */}
<div className="lc-workspace-workbench-window">
{
workspace.windows.map(d => (
<WindowView
active={d.id === workspace.window?.id} // 判断窗口是否激活
window={d}
key={d.id}
/>
))
} {
!workspace.windows.length && WorkspaceEmptyComponent ? <WorkspaceEmptyComponent /> : null // 根据条件渲染工作空间为空时的组件
}
</div>
</div>
<MainArea area={skeleton.mainArea} /> {/* 渲染主区域 */}
<BottomArea area={skeleton.bottomArea} /> {/* 渲染底部区域 */}
</div>
{/* <RightArea area={skeleton.rightArea} /> */}
</div>
<TipContainer /> {/* 渲染提示容器 */}
</SkeletonContext.Provider>
</div>
);
}
}

5.main-area.tsx

export default class MainArea extends Component<{ area: Area<any, Panel | Widget> }> {
render() {
const { area } = this.props;
return (
<div className={classNames('lc-main-area engine-workspacepane')}>
{area.container.items.map((item) => item.content)}
</div>
);
}
}

以上代码,

将area.container.items数组中每个元素的content属性渲染到页面上,展示在MainArea组件所代表的区域内。

至此,低开引擎的初始化完成

第144篇:阿里低开项目 init方法的更多相关文章

  1. 项目启动一直死循环 DruidDataSource.init 方法

    今日项目启动遇到一个问题: 项目启动一直死循环 DruidDataSource.init 方法, 代码和同事相同,环境也一致 最后通过maven  clean 然后重新install ,再次启动正常了 ...

  2. Swift开发第十篇——可变参数函数&初始化方法顺序

    本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...

  3. iOS开发拓展篇——如何把项目托管到GitHub

    iOS开发拓展篇——如何把项目托管到GitHub 说明:本文主要介绍如何把一个OC项目托管到Github,重操作轻理论. 第一步:先注册一个Github的账号,这是必须的 注册地址:Github官网注 ...

  4. OC小实例关于init方法不小心的错误

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  5. Tomcat 多项目部署方法整理

    Tomcat 多项目部署方法整理 说明:tomcat-deploy-aaa和tomcat-deploy-bbb是两个不同的web项目,为了方便以下简称aaa和bbb,请先自行创建并跑通 导航: NO1 ...

  6. SharePoint利用HttpModule的Init方法实现全局初始化

    接上篇 我们知道,HttpRuntime中会对每一个Request创建一个HttpApplication对象(HttpApplicationFactory从一个HttpApplication池来拿). ...

  7. OC小实例关于init 方法不小心的错误

    OC小实例关于init 方法不小心的错误  正视遇到的每一个错误 在一个遥控器类操控小车玩具的小实例项目中,我采用组合的方式,将遥控器拥有小汽车对象(has a)关系,而不是继承(is a)关系. 想 ...

  8. cocos2dx基础篇(1) Cocos2D-X项目创建

    已经入行工作半年多时间了,以前都是把这些东西记录在有道云上面的,现在抽出些时间把以前的笔记腾过来. 具体的环境配置就不用说了,因为现在已经是2018年,只需要下载对应版本解压后就能使用,不用再像多年前 ...

  9. iOS开发init方法解析

    自定义的init方法,都必须调用父类的init方法. 一般情况下为: - (id)init {      [super init];      xxx = xxx; }   通常情况下,这种模式可以满 ...

  10. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

随机推荐

  1. Kafka-数据出现积压的原因以及如何解决积压问题?

    Kafka数据积压的原因有很多,比如消费端处理能力不足.生产端消息发送速度过快等.解决方法也有很多,以下是一些常见的解决方法 : 增加分区数:如果数据量很大,合理的增加Kafka分区数是关键.但是分区 ...

  2. MySQL 8 查询优化新工具 Explain Analyze

    1. Explain Analyze 介绍 Explain 是我们常用的查询分析工具,可以对查询语句的执行方式进行评估,给出很多有用的线索.但他仅仅是评估,不是实际的执行情况,比如结果中的 rows, ...

  3. webpack学习笔记(二)核心概念理解及基础配置

    上一篇文章 记录了 webpack 初次安装与基础使用,本篇则是记录一下如何使用webpack构建一个比较完整,基础的项目 1. webpack 的4个核心概念 入口(entry):选择项目构建的入口 ...

  4. CF590C Three States

    题目链接 题目 见链接. 题解 知识点:BFS. 这道题求连接三个国家的最短路径长度.如果枚举每个点进行bfs,显然不可行,换种思路,从三个国家开始分别进行bfs是可以的. 注意一开始初始化两个距离数 ...

  5. springboot集成腾讯cos实现文件上传

    腾讯对象存储介绍 对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性.低成本.可靠安全等优点.通过控制台.API.SDK 和工具等 ...

  6. c2工具sliver 执行木马命令后会弹窗一闪而过

    向木马发出指令后, 如果是cmd命令会有一个黑窗口一闪而灭, 不利于木马隐藏, 需要将executeHandler从handlers.go拷贝到handlers_windows.go里,核心代码为 c ...

  7. 初级算法 - C++反转链表

    顾名思义, 就是将链表的所有结点反转. 解释见:[剑指offer]反转链表,C++实现(链表) 代码: #include <iostream> struct NodeList { int ...

  8. golang中协程&管道&锁

    进程和线程 进程(Process)就是程序在操作系统中的一次执行过程,是系统进行资源分配和调度的基 本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进 程都有一个自己的地 ...

  9. centos7 安装vmware tool 遇到遇到 kernel-headers 问题修复

    安装 vmware tool 步骤 1. cp VMwareTools-10.3.25-20206839.tar.gz 到 用户目录下 2. tar zxf VMwareTools-10.3.25-2 ...

  10. 常用SQL语句备查

    查询表中某一列是否有重复值 SELECT bizType, COUNT(bizType) FROM Res GROUP BY bizType HAVING COUNT(bizType) > 1 ...