2023-01-11 16:03:25 +08:00

199 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 低代码生态脚手架 & 调试机制
sidebar_position: 8
---
## 脚手架简述
在 fork 低代码编辑器 demo 项目后,您可以直接在项目中任意扩展低代码编辑器。如果您想要将自己的组件/插件/设置器封装成一个独立的 npm 包并提供给社区,您可以使用我们的低代码脚手架建立低代码扩展。
> Windows 开发者请在 WSL 环境下使用开发工具
>
> WSL 中文 doc[https://docs.microsoft.com/zh-cn/windows/wsl/install](https://docs.microsoft.com/zh-cn/windows/wsl/install)
>
> 中文教程:[https://blog.csdn.net/weixin_45027467/article/details/106862520](https://blog.csdn.net/weixin_45027467/article/details/106862520)
## 脚手架功能
### 脚手架初始化
```bash
npm init @alilc/element your-element-name
```
不写 your-element-name 的情况下,则在当前目录创建。
> 注 1如遇错误提示 `sh: create-element: command not found` 可先执行下述命令
```bash
npm install -g @alilc/create-element
```
> 注 2觉得安装速度比较慢的同学可以设置 npm 国内镜像,如
```bash
npm init @alilc/element your-element-name --registry=https://registry.npmmirror.com
```
选择对应的元素类型,并填写对应的问题,即可完成创建。
![image.png](https://img.alicdn.com/imgextra/i3/O1CN01LAaw2R1veHDYUzGB1_!!6000000006197-2-tps-676-142.png)
### 脚手架本地环境调试
```bash
cd your-element-name
npm install
npm start
```
### 脚手架构建
```bash
npm run build
```
### 脚手架发布
修改版本号后,执行如下指令即可:
```bash
npm publish
```
## 🔥🔥🔥 在低代码项目中调试物料/插件/设置器
> 📢📢📢 低代码生态脚手架提供的调试利器,在启动 setter/插件/物料 项目后,直接在已有的低代码平台就可以调试,不需要 npm link / 手改 npm main 入口等传统方式,轻松上手,强烈推荐使用!!
### 组件/插件/Setter 侧
1. 插件/setter 在原有 alt 的配置中添加相关的调试配置
```json
// build.json 中
{
"plugins": [
[
"@alilc/build-plugin-alt",
{
"type": "plugin",
"inject": true, // 开启注入调试
// 配置要打开的页面,在注入调试模式下,不配置此项的话不会打开浏览器
// 支持直接使用官方 demo 项目https://lowcode-engine.cn/demo/index.html
"openUrl": "https://lowcode-engine.cn/demo/index.html?debug"
}
],
]
}
```
2. 组件需先安装 @alilc/build-plugin-alt再将组件内的 `build.lowcode.js`文件修改如下
```javascript
const { library } = require('./build.json');
module.exports = {
alias: {
'@': './src',
},
plugins: [
[
// lowcode 的配置保持不变,这里仅为示意。
'@alifd/build-plugin-lowcode',
{
library,
engineScope: "@alilc"
},
],
[
'@alilc/build-plugin-alt',
{
type: 'component',
inject: true,
library,
// 配置要打开的页面,在注入调试模式下,不配置此项的话不会打开浏览器
// 支持直接使用官方 demo 项目https://lowcode-engine.cn/demo/index.html
openUrl: "https://lowcode-engine.cn/demo/index.html?debug"
}
]],
};
```
3. 本地组件/插件/Setter正常启动调试在项目的访问地址增加 debug即可开启注入调试。
```url
https://lowcode-engine.cn/demo/demo-general/index.html?debug
```
### 项目侧的准备
> 如果你的低代码项目 fork 自官方 demo那么项目侧的准备已经就绪不用再看以下内容~
1. 安装 @alilc/lowcode-plugin-inject
```bash
npm i @alilc/lowcode-plugin-inject --save-dev
```
2. 在引擎初始化侧引入插件
```typescript
import Inject, { injectAssets } from '@alilc/lowcode-plugin-inject';
import { IPublicModelPluginContext } from '@alilc/lowcode-types';
export default async () => {
// 注意 Inject 插件必须在其他插件前注册,且所有插件的注册必须 await
await plugins.register(Inject);
await plugins.register(OtherPlugin);
await plugins.register((ctx: IPublicModelPluginContext) => {
return {
name: "editor-init",
async init() {
// 设置物料描述前,使用插件提供的 injectAssets 进行处理
const { material, project } = ctx;
material.setAssets(await injectAssets(assets));
},
};
});
}
```
3. 在 saveSchema 时过滤掉插入的 url避免影响渲染态
```typescript
import { filterPackages } from '@alilc/lowcode-plugin-inject';
export const saveSchema = async () => {
// ...
const packages = await filterPackages(editor.get('assets').packages);
window.localStorage.setItem(
'packages',
JSON.stringify(packages),
);
// ...
};
```
4. 如果希望预览态也可以注入调试组件,则需要在 preview 逻辑里插入组件
```javascript
import { injectComponents } from '@alilc/lowcode-plugin-inject';
async function init() {
// 在传递给 ReactRenderer 前,先通过 injectComponents 进行处理
const components = await injectComponents(buildComponents(libraryMap, componentsMap));
// ...
}
```
注:若控制台出现如下错误,直接访问一次该 url 即可~
![image.png](https://img.alicdn.com/imgextra/i1/O1CN01cvKmeK1saCqpIxbLW_!!6000000005782-2-tps-1418-226.png)
## Meta 信息
meta 信息是放在生态元素 package.json 中的一小段 json用户可以通过 meta 了解到这个元素的一些基本信息,如元素类型,一些入口信息等。
```typescript
interface LcMeta {
type: 'plugin' | 'setter' | 'component'; // 元素类型,尚未实现
pluginName: string; // 插件名,仅插件包含
meta: {
dependencies: string[]; // 插件依赖的其他插件列表,仅插件包含
engines: {
lowcodeEngine: string; // 适配的引擎版本
}
prototype: string; // 物料描述入口,仅组件包含,尚未实现
prototypeView: string; // 物料设计态入口,仅组件包含,尚未实现
}
}
```