低代码阿里lowcode使用教程

  1. 0.常用
    github地址: https://github.com/alibaba/lowcode-engine
    演示demo github地址:https://github.com/alibaba/lowcode-demo
    文档地址: https://www.yuque.com/lce/doc/ 语雀文档 https://www.yuque.com/lce/usage 语雀文档 使用文档
    https://lowcode-engine.cn/site/docs/guide/quickStart/intro
    lowcode文档
    演示地址:https://lowcode-engine.cn/demo/demo-general/index.html
    官方二次开发组件演示项目地址:https://www.bilibili.com/read/cv17552091/?spm_id_from=333.999.0.0
    官方物料项目github地址: https://github.com/alibaba/lowcode-materials
    fusion UI : https://fusion.design/pc/
    npm官网: https://www.npmjs.com/
    推包参考: https://blog.csdn.net/weixin_46682277/article/details/123009648
    参考:搭建及自定义组件:http://www.icodebang.com/article/309921.html
    制作表格: https://lowcode-engine.cn/site/docs/demoUsage/makeStuff/table
    lowcode增删改查: https://www.cnblogs.com/hoager/p/16758303.html

    页面管理开发视频:https://www.bilibili.com/video/BV17a411i73f/
    https://lowcode-engine.cn/site/docs/guide/expand/editor/pluginWidget#panel
    修改数据源面板:
    https://lowcode-engine.cn/site/docs/demoUsage/panels/datasource
    开发自定义组件并发布 : https://www.icodebang.com/article/309921.html

  2. 1.项目启动
    安装cnpm
    npm install -g cnpm
    (npm建议使用 18 版本) 下载项目并运行 git clone https://github.com/alibaba/lowcode-demo.git cd demo-general cnpm
    install --force cnpm i @alilc/lowcode-utils cnpm i lodash cnpm
    install regenerator-runtime
    cnpm install html-webpack-plugin@3 或者4 cnpm install webpack@4 --save-dev cnpm install --save axios npm run start

2.项目结构介绍

  • plugins 目录,存放的都是示例插件,方便用户从中看到一个插件是如何实现的
  • services 目录,模拟数据请求、提供默认 schema、默认资产包等,此目录下内容在真实项目中应替换成真实的与服务端交互的服务
  • 预览页面入口文件 preview.tsx
    3.新增插件介绍
    三种方式 ;1.在lowcode-demo中使用插件创建(3.1) (此种方式不推荐),
    2.创建组件库编辑项目material 在material项目中编辑和创建 (3.2)(推荐此种方式,适合单组件开发,但新手建议使用第3种)
    3. 在低代码组件库继续开发自己的组件。(4.修改已有物料)
    (推荐此种方式,最优, 有写好的其他组件做参考。当想 发布一个组件时,可写好自己的组件后,注释其他组件。
    建议使用其中的antdesign组件)
    3.1. 在lowcode-demo中使用插件创建
    3.1.1.安装 build-scripts 和它的低代码开发插件:
    npm install -D @alifd/build-plugin-lowcode @alib/build-scripts --save-dev
    3.1.2.新增 build-scripts 配置文件:build.lowcode.js
    const { library } = require(‘./build.json’);
    module.exports = {
    alias: {
    ‘@’: ‘./src’,
    },
    plugins: [
    [
    “@alifd/build-plugin-lowcode”,
    {
    engineScope: ‘@alilc’,
    }
    ]
    ],
    };
    3.1.3.在 package.json 中scripts定义低代码开发相关命令
    “lowcode:dev”: “build-scripts start --config ./build.lowcode.js”,
    “lowcode:build”: “build-scripts build --config ./build.lowcode.js”,
    3.1.4.开发调试

启动低代码开发调试环境

npm run lowcode:dev

构建低代码产物

npm run lowcode:build

发布组件
npm publish //自己用本项目就不用发布
问题:windows下启动报错: https://zhuanlan.zhihu.com/p/503131420

3.2.创建物料编辑项目并创建物料   (此种方法是发布到npm, 需要有npm账号)
          3.2.1.创建物料项目

安装cnpm
npm install cnpm
先安装官方的命令行工具
cnpm install -g @alilc/create-element@latest
cnpm init @alilc/element lowcode-app-material // lowcode-app-material项目名称
选1 组件/物料 2中间默认值 3 react-组件库

cnpm i
cnpm i @alilc/lowcode-react-renderer
cnpm i @alilc/lowcode-utils
cnpm i @alilc/lowcode-types
cnpm i lodash
cnpm install webpack@4 --save-dev
cnpm install style-loader@1 --save-dev
cnpm install template-component-demo
cnpm install regenerator-runtime
cnpm install react-scripts --save-dev
cnpm install react
export NODE_OPTIONS=–openssl-legacy-provider //如果使用的 node npm版本较新 命令行输入此命令 (使用旧版的openssl),不行则使用node版本17以下的版本重试,windows下 export改成 set
如果不好使 在项目的 package.json 的 scripts中 dumi 和 dumi:build 都添加变量 NODE_OPTIONS=–openssl-legacy-provider
例如: “dumi”: “cross-env APP_ROOT=docs NODE_OPTIONS=–openssl-legacy-provider dumi dev”,
“dumi:build”: “cross-env APP_ROOT=docs NODE_OPTIONS=–openssl-legacy-provider dumi build”,

尝试启动
npm run lowcode:dev
备注:
// npm audit fix --force 强制解决所有安全漏洞
// npm cache clean --force 清理缓存
成功启动的package备注: 启动不起来时参考此package版本进行修改
“dependencies”: {
“@alifd/next”: “^1.24.14”,
“@alilc/lowcode-react-renderer”: “^1.3.1”,
“@alilc/lowcode-types”: “^1.3.1”,
“@alilc/lowcode-utils”: “^1.3.1”,
“@babel/runtime”: “^7.0.0”,
“@types/react”: “^16.14.0”,
“big.js”: “^6.2.1”,
“classnames”: “^2.5.1”,
“lodash”: “^4.17.21”,
“moment”: “^2.29.4”,
“regenerator-runtime”: “^0.14.1”,
“template-component-demo”: “^2.0.5”
},
“devDependencies”: {
“@alib/build-scripts”: “^0.1.23”,
“@alifd/build-plugin-lowcode”: “^0.4.1”,
“@alifd/theme-2”: “^0.4.4”,
“@types/big.js”: “^6.1.6”,
“@types/lodash”: “^4.14.191”,
“build-plugin-component”: “^1.3.3”,
“build-plugin-fusion”: “^0.1.3”,
“build-plugin-moment-locales”: “^0.1.0”,
“moment”: “^2.20.1”,
“react”: “^16.14.0”,
“react-dom”: “^16.14.0”,
“style-loader”: “^1.3.0”,
“typescript”: “^3.9.3”,
“webpack”: “^4.47.0”
},
3.3.2.开发步骤
# 启动 lowcode 环境进行调试预览
npm run lowcode:dev
备注:新增一个组件后,需要重新执行命令:
npm run lowcode:dev 否则看不到效果
# 构建低代码产物
npm run lowcode:build
(删除demo文件夹下的所有.md文件) 否则可能发布不成功
3.2.3.物料开发说明
( 使用fusionUI开发时在src下添加组件, 执行npm run lowcode:build 后会自动在lowcode目录下生成低代码代码,然后修改其中的代码
使用fusionUI开发时在src下添加组件, 执行npm run lowcode:build 后会不会自动在lowcode目录下生成低代码,
只会在其他目录添加环境, 需自己在lowcode目录下添加文件并编写
)
3.2.3.1.组件开发:在src的components下新建 组件文件夹进行开发。
在组件文件夹下新建 组件名.tsx 文件进行编写代码,
新建 index.tsx文件 导出编辑的组件。
UI语法参照 fusion: https://fusion.design/pc/component
其他详细设置参照创建项目时给出的2个组件colorful-button 和 colorful-input。
react语法参考: https://www.runoob.com/react/
react函数组件参考: https://blog.csdn.net/weixin_73577920/article/details/128537767
React—函数组件与类组件区别:
https://blog.csdn.net/weixin_68160847/article/details/128647799
React.FC使用说明: https://blog.csdn.net/qq_52421092/article/details/127628465
react 的 forwardRef 用法: https://www.cnblogs.com/operate/p/16190141.html
官方自带例子说明:如下代码,创建 ColorfulInput变量 =一个函数,
入参是 ColorfulInputProps类型
最后导出这个函数。
const ColorfulInput: React.FC = function ColorfulInput({//定义一个函数变量
color,
style = {},
…otherProps
}) {
const _style = style || {};
if (color) {
_style.backgroundColor = color;
}
const _otherProps = otherProps || {};
_otherProps.style = _style;
return (
<Input { …_otherProps } />
);
};
export interface ColorfulInputProps {//入参
color?: string;
style?: object;
}
export default ColorfulInput; //导出
fusionUI在代码中使用说明:
fusion官方的按钮组件示例代码
import { Button, Box } from ‘@alifd/next’;
const props = {
component: “a”,
href: “http://www.alibaba.com”,
target: “_blank”
};

ReactDOM.render(

<Button {…props} type=“primary”>
alibaba.com

<Button {…props} type=“secondary”>
alibaba.com

<Button {…props} type=“normal”>
alibaba.com

<Button {…props} loading>
alibaba.com loading

,
mountNode
);
将其用于低代码前做如下转换:将上面的代码转换成 class的形式 起名叫 Test
import React from ‘react’;
import ReactDOM from ‘react-dom’;
import { Button, Box } from ‘@alifd/next’;

const props = {
component: “a”,
href: “http://www.alibaba.com”,
target: “_blank”
};

class Test extends React.Component {
render(
) {
return (

<Button {…props} type=“primary”>
alibaba.com

<Button {…props} type=“secondary”>
alibaba.com

<Button {…props} type=“normal”>
alibaba.com

<Button {…props} loading>
alibaba.com loading


);
}
}

ReactDOM.render(, mountNode);
然后最后一句ReactDOM.render去掉,其余部分复制到 低代码组件中。
最后一句添加 export default Test; //导出 添加 index.tsx文件 导出编辑的组件即可。
(详情参照给出的两个例子colorful-input,和colorful-button)
然后npm run lowcode:dev
(写完新组件后,需杀到命令行,重新执行npm run lowcode:dev 才会生效,
才会在lowcode文件夹下生成对应的低代码)
修改 lowcode 中的json.
备注:删除组件时,需删除 src的组件文件夹,
删除在lowcode中生成组件文件夹,
删除在lowcode_es目录下的 meta.js中的组件相关变量
删除在lowcode_lib目录下的 meta.js中的组件相关变量
antdesignUI在代码中使用说明:
例如在新创建的项目中使用官方物料中提供的button,
复制 button目录到 自己创建的项目中
然后执行 cnpm install antd ,
cnpm i @ant-design/icons
cnpm i typescript
(如使用的组件 import 了其他工具,请自行 cnpm i xx 进行安装)
执行 npm run lowcode:build 会报错 ,
The above error occurred in the <ForwardRef(AntButton1)>
component: xxx 组件渲染异常, 异常原因:
createElement is not defined%s
这是由于没有正确转换JSX语法导致的。
在React中使用JSX语法需要先将其编译为JavaScript代码才能在浏览器中运行,
安装Type转换插件即可
cnpm install tsconfig-paths-webpack-plugin --save-dev
在执行 执行 npm run lowcode:build 时
即使文件中没有引入 import { createElement } from ‘react’; 也不会发生报错了。
此时npm run lowcode:dev 继续启动调试即可。
3.2.3.2.组件setter和快照修改: 创建完组件后执行 npm run lowcode:dev 或 npm run lowcode:build 后,
会在根目录下生成一个lowcode,组件的setter和快照会以json描述文件的形式保存
修改对应组件的json描述文件,进行相应开发。
json描述语法参照:
https://lowcode-engine.cn/site/docs/guide/expand/editor/metaSpec
3.2.4.发布
新创建的组件库在本地调试过后,需要发布到 npm 上之后才能集成到项目中。
npm publish 发布组件 //material项目 和 lowcode-demo两个项目需使用相同的npm

  如果是首次publish需先执行 
  登陆  npm login      // souhu_npm      souhu_npm_password   邮箱: wh736749722@163.com
  //根据提示输入用户名密码 邮箱 ,会提示输入一次性密码,查看邮箱中的一次性号码
  //如果报错是淘宝镜像则执行命令换回:  npm config set registry https://registry.npmjs.org/
  //清理缓存    npm cache clean --force
  //发布成功后登陆npm官网      https://www.npmjs.com/      查看
  //如果命令行登录不上,浏览器登录npm成功后重新尝试
  //在 package.json 的private字段   "private": true, // true为私有   false为公有
  //  npm logout  登出
  //私有npm: 可以使用的命令为`npm login --registry=https://your_private_npm_address [username] [password]`。如果需要,可以在命令中使用`--registry`参数指定私有npm地址。
  //npm 一直登录和发包失败: npm config set registry https://registry.npmjs.com/         org 改成com
    参考:npm发布步骤 参考:https://blog.csdn.net/Beconcentrated/article/details/132043259
               发包修改版本和加@名称 参考:https://blog.csdn.net/an_julia/article/details/134777407    
               如何引用拖出来默认展示项 snippets 参考: https://blog.csdn.net/wangqiaojie/article/details/126227741
               npm登录失败,发布失败 参考: https://www.jianshu.com/p/2642aff6b9ff

3.2.5.使用
在lowcode-demo的 assets.json 中
在npm网站上 ,npm发布的包下 翻到code标签 点击build 文件夹, 再点击 lowcode文件夹,找到 assets-prod.json 文件
将其中的配置 ,要倒入的 需要改 packages、 components , 把要导入组件的packages部分和 components 复制合并过来 ,
然后将 倒入的内容中的你发的包 https://alifd.alicdn.com/npm/替换成 https://unpkg.com 即可
修改示例:(合并时可将 https://alifd.alicdn.com/npm/替换成 https://unpkg.com,
否则 加载不出来 ,因为你发的包是发到 https://unpkg.com 而不是阿里的地址)
{
“version”: “1.1.13”,
“packages”: [
//新添加 里面是组件
{
“title”: “我的自定义组件”,
“package”: “mini-elements”,
“version”: “0.1.1”,
“library”: “MiniElements”,
“urls”: [
“https://unpkg.com/mini-elements@0.1.1/build/lowcode/view.js”,
“https://unpkg.com/mini-elements@0.1.1/build/lowcode/view.css”
]
}
],
“components”: [
//新添加 里面是描述 setter、默认设置 等。
{
“exportName”: “MiniElementsMeta”,
“npm”: {
“package”: “mini-elements”,
“version”: “0.1.1”
},
“url”: “https://unpkg.com/mini-elements@0.1.1/build/lowcode/meta.js”,
“urls”: {
“default”: “https://unpkg.com/mini-elements@0.1.1/build/lowcode/meta.js”
}
}
],
“componentList”: [? //没效果
{
“title”: “我的自定义组件”,
“icon”: “”,
“children”: [
{
“componentName”: “ChartDemo”,
“library”: “MiniElements”,
“title”: “图表Demo”,
“icon”: “”
},
{
“componentName”: “ColorfulButton”,
“title”: “多彩按钮”,
“description”: “这里是多彩按钮的介绍”,
“library”: “MiniElements”
},
{
“componentName”: “ColorfulInput”,
“title”: “多彩Input”,
“description”: “这里是多彩按钮ColorfulInput的介绍”,
“library”: “MiniElements”
}
]
},
]
}
参考:自定义物料1 参考: http://www.icodebang.com/article/309921.html
自定义物料2 参考: http://www.zlprogram.com/Show/19/DDBA9F42.shtml
自定义物料3 参考: https://blog.csdn.net/wangqiaojie/article/details/126227741
4.修改已有物料
4.1. 下载 官方物料项目, github地址: https://github.com/alibaba/lowcode-materials
4.1.0.在根目录
package.json 的 dependencies 下添加 “moment”: “^2.29.1”
执行 cnpm i --force
4.1.1.例如修改fusion组件
cd 进入 packages
cd fusion-lowcode-materials
cnpm i --force
cnpm i @alilc/lowcode-react-renderer
cnpm i @alilc/lowcode-utils
cnpm i @alilc/lowcode-types
cnpm i lodash
cnpm install webpack@4 --save-dev
cnpm install style-loader@1 --save-dev
cnpm install template-component-demo
cnpm install regenerator-runtime
cnpm i classnames
npm run build //在 lowcode:build 前执行,否则执行lowcode:build时会报错
npm run lowcode:build
尝试启动
npm run lowcode:dev
(在src下添加组件, 执行npm run lowcode:build 后会自动在lowcode目录下生成低代码代码,然后修改其中的代码)
4.1.2.如果使用antdesign组件则
cd 进入 packages
cd antd-lowcode-materials
cnpm i --force
cnpm i @alilc/lowcode-react-renderer
cnpm i @alilc/lowcode-utils
cnpm i @alilc/lowcode-types
cnpm i lodash
修改组件 menu ,这个组件有bug 需要使用备份中的menu做替换。
尝试启动
npm run lowcode:dev
添加组件
(在src下添加组件, 执行npm run lowcode:build 后会不会自动在lowcode目录下生成低代码,
只会在其他目录添加环境, 需自己在lowcode目录下添加文件并编写)
备注:如遇到 (undefined)ERR! ./.tmp/view.js 等 from 'D:\4.work_project
临时解决1:修改对应view.js 中的 \ 改成 \ 即可 ,不要重新执行npm run lowcode:dev 否则会重置 (不推荐使用)
临时解决2:\node_modules@alifd\build-plugin-lowcode\src\index.js是生成view.js的逻辑 (推荐使用)
如下代码:(注释那两行是需要修改的地方) 找到下面的代码并修改 viewJsPath 在849行。
let viewJsPath = path.resolve(rootDir, ${lowcodeDir}/${componentNameFolder}/view); // const改为let
viewJsPath = viewJsPath.replace(/\/g, ‘\\’); // 添加此行
临时解决异步setter问题: @alifd/build-plugin-lowcode 这个包下 src /templates/index.jsx 加 (metanew文件的路径)
import { addcomponentMetas } from 'import { addcomponentMetas } from ‘…/lowcode/utils/metanew.js’

                                            async init() {方法里加这个         黄色原有,绿色新加。
                                            if (typeof setterMap === 'object' && Object.keys(setterMap).length) {
                                                   setters.registerSetter(setterMap); 
                                           }
                                           const componentMetas1 = await addcomponentMetas();
                                           console.log("componentMetas1 ",componentMetas1); 
                                          assets.components=componentMetas1.components; 
                                          assets.componentList=componentMetas1.componentList;

其中metanew.js为.tmp下的meta.js 放在文尾部备注处
在官方demo中引用时 ,修改 src/plugins/plugin-lowcode-component/index.ts 找到 async init方法
async init() {
const { material } = ctx;
const newAssets= material.getAssets();
let componentsArr = newAssets.components;
for (let i = 0; i < componentsArr.length; i++) {
let items = componentsArr[i];
if (Promise.resolve(items.snippets) === items.snippets) {
console.log(“Table2Meta.snippets is a Promise object”,items);
const resultsnippets = await items.snippets;
items.snippets=resultsnippets;
console.log(“items.snippets :”,items.snippets);
}
}
console.log(“componentsArr ----”, componentsArr);
let componentList = generateComponentList(componentsArr);
console.log(“componentList ----”, componentList);
newAssets.components=componentsArr;
newAssets.componentList=componentList;
material.setAssets(newAssets);
console.log(“material ----”, material);
material.loadIncrementalAssets({
4.2. 组件开发
项目src 下component 下为对应的组件 修改组件代码即可
修改后 重新执行 npm run lowcode:dev ,在项目的lowcode目录下会生成对应的组件 。(fusionUI会,ant需手动创建)
使用该组件即可
删除组件 需修改最外层index.tsx ,把相应组件的 export删除 ,需同时删除lowcode下的生成的组件文件夹
npm run lowcode:build
常用开发文档:
react官方文档: https://react.docschina.org/learn
react 菜鸟教程: https://www.runoob.com/react/react-install.html
fusion UI : https://fusion.design/pc/
antdesignUI react : https://4x.ant.design/docs/react/introduce-cn/
4.3.发布
同 3.2.4.发布
4.4.使用
同 3.2.5.使用
5.物料开发生成说明
1.生成的json只描述 页面组件之间的结构关系 还有哪个字段使用那种setter
2.页面js,组件dom仍然保留在react页面里
3. 自带的setter: MixedSetter (多种设置器,下面是一个数组,选择使用哪种setter)
StringSetter (字符串setter)
ArraySetter (数组setter)
SlotSetter(插槽setter,可往里面拖拽组件)
JsonSetter (弹出对话框输入 json)
ExpressionSetter(表达式setter)
BoolSetter(二选一开关setter)
RadioGroupSetter (单选框setter)
CheckboxGroupSetter (多选框setter)
FunctionSetter (函数setter) 变量输入setter 自带 VariableSetter
参考:setter设置 -以及联动 : https://www.yuque.com/lce/doc/cl03wo_nmhznb
4.使用已有属性设置参考物料项目 next-table 中的代码 大部分无需手动编写 ,
导入后修改暴露的属性 // import { ColumnProps, TableProps } from ‘@alifd/next/types/table’;
参考:低代码协议文档 https://lowcode-engine.cn/site/docs/specs/lowcode-spec

备注处
import AffixMeta from ‘…/affix/meta’
import AlertMeta from ‘…/alert/meta’
import AnchorlinkMeta from ‘…/anchor.link/meta’
import AutoCompleteMeta from ‘…/auto-complete/meta’
import AvatarMeta from ‘…/avatar/meta’
import BackTopMeta from ‘…/back-top/meta’
import BadgeMeta from ‘…/badge/meta’
import BreadcrumbMeta from ‘…/breadcrumb/meta’
import ButtonMeta from ‘…/button/meta’
import CalendarMeta from ‘…/calendar/meta’
import CardMeta from ‘…/card/meta’
import CarouselMeta from ‘…/carousel/meta’
import CascaderMeta from ‘…/cascader/meta’
import CheckboxgroupMeta from ‘…/checkbox.group/meta’
import CheckboxMeta from ‘…/checkbox/meta’
import CollapsepaneMeta from ‘…/collapse.pane/meta’
import CollapseMeta from ‘…/collapse/meta’
import CommentMeta from ‘…/comment/meta’
import ConfigProviderMeta from ‘…/config-provider/meta’
import CrudtableMeta from ‘…/crudtable/meta’
import DatePickerrangePickerMeta from ‘…/date-picker.range-picker/meta’
import DatePickerMeta from ‘…/date-picker/meta’
import DescriptionsitemMeta from ‘…/descriptions.item/meta’
import DescriptionsMeta from ‘…/descriptions/meta’
import DividerMeta from ‘…/divider/meta’
import DrawerMeta from ‘…/drawer/meta’
import DropdownMeta from ‘…/dropdown/meta’
import EmptyMeta from ‘…/empty/meta’
import FormitemMeta from ‘…/form.item/meta’
import FormlistMeta from ‘…/form.list/meta’
import FormMeta from ‘…/form/meta’
import GridcolMeta from ‘…/grid.col/meta’
import GridrowMeta from ‘…/grid.row/meta’
import IconMeta from ‘…/icon/meta’
import ImageMeta from ‘…/image/meta’
import InputNumberMeta from ‘…/input-number/meta’
import InputgroupMeta from ‘…/input.group/meta’
import InputpasswordMeta from ‘…/input.password/meta’
import InputsearchMeta from ‘…/input.search/meta’
import InputtextAreaMeta from ‘…/input.text-area/meta’
import InputMeta from ‘…/input/meta’
import ListitemmetaMeta from ‘…/list.item.meta/meta’
import ListitemMeta from ‘…/list.item/meta’
import ListMeta from ‘…/list/meta’
import ManagersMeta from ‘…/managers/meta’
import MentionsMeta from ‘…/mentions/meta’
import MenuitemGroupMeta from ‘…/menu.item-group/meta’
import MenuitemMeta from ‘…/menu.item/meta’
import MenusubMenuMeta from ‘…/menu.sub-menu/meta’
import MenuMeta from ‘…/menu/meta’
import ModalMeta from ‘…/modal/meta’
import PageHeaderMeta from ‘…/page-header/meta’
import PaginationMeta from ‘…/pagination/meta’
import PopconfirmMeta from ‘…/popconfirm/meta’
import PopoverMeta from ‘…/popover/meta’
import ProgressMeta from ‘…/progress/meta’
import RadiogroupMeta from ‘…/radio.group/meta’
import RadioMeta from ‘…/radio/meta’
import RateMeta from ‘…/rate/meta’
import ResultMeta from ‘…/result/meta’
import SelectMeta from ‘…/select/meta’
import SkeletonMeta from ‘…/skeleton/meta’
import SliderMeta from ‘…/slider/meta’
import SlotMeta from ‘…/slot/meta’
import SpaceMeta from ‘…/space/meta’
import SpinMeta from ‘…/spin/meta’
import StatisticMeta from ‘…/statistic/meta’
import StepsstepMeta from ‘…/steps.step/meta’
import StepsMeta from ‘…/steps/meta’
import SwitchMeta from ‘…/switch/meta’
import TableMeta from ‘…/table/meta’
import Table2Meta from ‘…/table2/meta’
import TabstabPaneMeta from ‘…/tabs.tab-pane/meta’
import TabsMeta from ‘…/tabs/meta’
import TagMeta from ‘…/tag/meta’
import TestMenuMeta from ‘…/test-menu/meta’
import TimePickerMeta from ‘…/time-picker/meta’
import TimelineitemMeta from ‘…/timeline.item/meta’
import TimelineMeta from ‘…/timeline/meta’
import TooltipMeta from ‘…/tooltip/meta’
import TransferMeta from ‘…/transfer/meta’
import TreeSelectMeta from ‘…/tree-select/meta’
import TreeMeta from ‘…/tree/meta’
import TypographylinkMeta from ‘…/typography.link/meta’
import TypographyparagraphMeta from ‘…/typography.paragraph/meta’
import TypographytextMeta from ‘…/typography.text/meta’
import TypographytitleMeta from ‘…/typography.title/meta’
import UploadMeta from ‘…/upload/meta’

const componentCategorySort = {};
[“通用”,“导航”,“信息输入”,“信息展示”,“信息反馈”]
.reverse()
.forEach((item, index) => {
componentCategorySort[item] = ++index;
});

function generateComponentList(components) {
const componentList = [
{
title: ‘常用’,
icon: ‘’,
children: [],
},
{
title: ‘容器’,
icon: ‘’,
children: [],
},
{
title: ‘导航’,
icon: ‘’,
children: [],
},
{
title: ‘内容’,
icon: ‘’,
children: [],
},
{
title: ‘Feedback 反馈’,
icon: ‘’,
children: [],
},
];

const groupMap = {
原子组件: true,
};
const compGroup = {};

components.forEach((comp) => {
const category = comp.category || ‘其他’;
if (comp.group && !compGroup[comp.componentName]) {
compGroup[comp.componentName] = comp.group;
}
if (comp.group && !groupMap[comp.group]) {
groupMap[comp.group] = true;
}
let target = componentList.find((item) => item.title === category);
if (!target) {
target = {
title: category,
icon: ‘’,
children: [],
};

  componentList.push(target);
}

if (comp.snippets && comp.snippets.length) {
  target.children.push({
    componentName: comp.componentName,
    title: comp.title || comp.componentName,
    sort: {
      category: target.title,
      group: compGroup[comp.componentName] || '原子组件',
      priority: componentCategorySort[target.title] || 0,
    },
    icon: '',
    package: comp.npm.pkg,
    snippets: comp.snippets || [],
  });
}

});
return componentList;
}

function fillRealVersion(meta, packageName = ‘sohu001-antd-lowcode-materials-online’, version = ‘1.1.9’, basicLibraryVersion={“@alifd/next”:“1.25.23”,“@alifd/meet”:“2.6.3”,“antd”:“4.17.3”}) {
if (!meta || !version) {
return meta;
}
const { npm } = meta;
if (!npm) {
return meta;
}
if (typeof basicLibraryVersion === ‘object’ && basicLibraryVersion[npm.package]) {
meta.npm = {
…npm,
version: basicLibraryVersion[npm.package]
};
} else if (npm.package === packageName) {
meta.npm = {
…npm,
version
};
}
return meta;
}

export async function addcomponentMetas() {

  const componentMetas = [AffixMeta,AlertMeta,AnchorlinkMeta,AutoCompleteMeta,AvatarMeta,BackTopMeta,BadgeMeta,BreadcrumbMeta,ButtonMeta,CalendarMeta,CardMeta,CarouselMeta,CascaderMeta,CheckboxgroupMeta,CheckboxMeta,CollapsepaneMeta,CollapseMeta,CommentMeta,ConfigProviderMeta,CrudtableMeta,DatePickerrangePickerMeta,DatePickerMeta,DescriptionsitemMeta,DescriptionsMeta,DividerMeta,DrawerMeta,DropdownMeta,EmptyMeta,FormitemMeta,FormlistMeta,FormMeta,GridcolMeta,GridrowMeta,IconMeta,ImageMeta,InputNumberMeta,InputgroupMeta,InputpasswordMeta,InputsearchMeta,InputtextAreaMeta,InputMeta,ListitemmetaMeta,ListitemMeta,ListMeta,ManagersMeta,MentionsMeta,MenuitemGroupMeta,MenuitemMeta,MenusubMenuMeta,MenuMeta,ModalMeta,PageHeaderMeta,PaginationMeta,PopconfirmMeta,PopoverMeta,ProgressMeta,RadiogroupMeta,RadioMeta,RateMeta,ResultMeta,SelectMeta,SkeletonMeta,SliderMeta,SlotMeta,SpaceMeta,SpinMeta,StatisticMeta,StepsstepMeta,StepsMeta,SwitchMeta,TableMeta,Table2Meta,TabstabPaneMeta,TabsMeta,TagMeta,TestMenuMeta,TimePickerMeta,TimelineitemMeta,TimelineMeta,TooltipMeta,TransferMeta,TreeSelectMeta,TreeMeta,TypographylinkMeta,TypographyparagraphMeta,TypographytextMeta,TypographytitleMeta,UploadMeta];

  //把有Promise的对象变成正常对象
  for(var itemMetas of componentMetas){
    if (Promise.resolve(itemMetas.snippets) === itemMetas.snippets) {
      console.log("Table2Meta.snippets is a Promise object");
      const resultsnippets = await itemMetas.snippets;
      itemMetas.snippets=resultsnippets;
    }
  }
  console.log("componentMetas new ",componentMetas);


  const components = [];
  const npmInfo = {"package":"sohu001-antd-lowcode-materials-online","version":"1.1.9"};
  componentMetas.forEach(meta => {
    if (Array.isArray(meta)) {
      components.push(
        ...meta.map((item) => {
          if (!item.npm) {
            const { componentName } = item;
            const names = componentName.split('.');
            const [exportName, subName] = names;
            item.npm = {
              exportName: exportName,
              main: '',
              destructuring: true,
              subName: names.length > 1 ? componentName.slice(componentName.indexOf('.') + 1) : subName,
            };
          }
          item.npm = { ...npmInfo, ...(item.npm || {}) };
          return fillRealVersion(item);
        }),
      );
    } else if (meta.components) {
      components.push(
        ...meta.components.map((item) => {
          if (!item.npm) {
            const { componentName } = item;
            const names = componentName.split('.');
            const [exportName, subName] = names;
            item.npm = {
              exportName: exportName,
              main: '',
              destructuring: true,
              subName: names.length > 1 ? componentName.slice(componentName.indexOf('.') + 1) : subName,
            };
          }
          item.npm = { ...npmInfo, ...(item.npm || {}) };
          return fillRealVersion(item);
        }),
      );
    } else {
      if (!meta.npm) {
        const { componentName } = meta;
        const names = componentName.split('.');
        const [exportName, subName] = names;
        meta.npm = {
          exportName: exportName,
          main: '',
          destructuring: true,
          subName: names.length > 1 ? componentName.slice(componentName.indexOf('.') + 1) : subName,
        };
      }
      meta.npm = { ...npmInfo, ...(meta.npm || {}) };
      components.push(fillRealVersion(meta));
    }
  });

  const componentList = generateComponentList(components);

  

  const execCompile = !!false;

  if (!execCompile) {
    window.Sohu001AntdLowcodeMaterialsOnlineMeta = { components, componentList };
  }

  return { "components":components, "componentList":componentList };

}

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值