# agile-core
**Repository Path**: nandy007/agile-core
## Basic Information
- **Project Name**: agile-core
- **Description**: agile+vite+vue3=组件式微前端框架
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-08-05
- **Last Updated**: 2025-09-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Agile框架使用指南
## 概述
`Agile`框架结合`Vite`和`VUE`的技术栈+自定义组件模块(基于`Web Component`),形成一个组件式的`微前端`框架。该框架旨在实现跨框架调用的`微前端组件`定义和使用。
使用`Agile`框架创建的组件称为`AUI`组件,该组件可以在框架内使用,也可以打包后在任意框架中通过引入js的方式使用,包括任何标准的DOM操作方式调用和样式设置。
## 特性
### 🚀 跨框架兼容
- **原生DOM组件**:基于Web Components标准,编译后的组件是原生HTMLElement扩展
- **多框架支持**:可在Vue、React、Angular等任意框架中使用
- **标准DOM操作**:支持`document.createElement`、`innerHTML`等标准DOM操作方式
- **双模式调用**:框架内可使用Vue组件语法和原生DOM方式,框架外使用原生DOM方式
### 💡 继承VITE+VUE开发体验
- **Vue语法兼容**:`.aui.vue`文件格式,保持Vue开发习惯
- **TypeScript支持**:完整的类型定义和智能提示
- **热更新支持**:基于Vite的现代化开发工具链
- **性能优化**:基于Vue3的性能优化
### 🔧 企业级场景设计
- **全粒度开发**:可以用于组件库、模块、插件、应用等任何粒度开发
- **Hook扩展机制**:为不同客户通过定制化组件实现差异功能
- **技术栈异构**:主应用和子应用使用不同前端框架
- **独立部署**:组件库独立发布,各应用按需引入
- **渐进式集成**:现有微前端项目可逐步引入AUI组件
## 规范
1. AUI组件必须以`.aui.vue`作为文件后缀
2. 组件名是唯一的,同一个组件名对应的实现只有一个,组件可以重复定义,但是后面定义的会覆盖前面的,其中有个名为`auix`的prop属性用于扩展属性
3. 组件名称必须是帕斯卡命名法(Pascal Case),即每个单词的首字母都是大写,单词之间没有分隔符
4. 组件名一般显式的在组件中通过name来定义,否则将取当前文件名的名称作为组件名
## 接口
### 1. AUI初始化事件
当组件`mounted`结束会执行两个动作:
1. 触发`aui-init`事件,事件的detail为`{code: 0}`。(该事件作用在原生DOM上,所以框架内和外都可以监听)
2. 执行组件内部的`auiInit`函数(如果存在),该函数与mounted同级。
### 2. 通用组件间函数调用
函数定义:async $call(name: string, ...args: any[]) : any
该函数是通用的组件间函数调用的定义,AUI原生DOM调用VUE组件函数或者VUE组件调用AUI原生DOM的函数都是使用这个方法。
其中,`name`可以是组件里`暴露`的`函数名`或者`属性名`(支持多级属性访问),前提是这些函数或属性要暴露,当为函数时为执行函数并返回结果;当为属性时,如果没有args则返回属性值,如果有args,将取args的第一个元素赋值给属性,返回null;当匹配不到任何函数和属性将返回一个Error对象。
1. 原生DOM调用VUE组件,则组件内使用`this.$call`调用,框架外使用`el.$call`。
```js
// $call是原生DOM上的扩展函数,用于组件外部调用内部的函数或者取值/赋值之用
const el = document.querySelector('aui-my-com');
const value = await el.$call('echo', 111); // value 为111
```
2. VUE组件调用原生DOM,则组件内使用`this.$call`调用
```js
// $call也是VUE组件的扩展函数,用于组件内调用原生DOM的函数或者取值/赋值之用
export default {
...
methods: {
setDomStyle() {
this.$call('setAttribute', 'style', 'color: red;');
}
}
...
}
```
### 3. MVVM使用
由于AUI组件本身是`原生DOM`,所以都是通过value值作为MVVM绑定的依据(注意区分通过setAttribute设置的value属性,非同一个意思)。
VUE组件扩展了两个重要的方法:`$value`和`$anyToArray`。
`$value`: 该方法用于获取或设置组件的原生DOM的value值,主要用于MVVM绑定值传递给原生DOM。
`$anyToArray`: 该方法用于将任意类型的值转换为数组类型,主要用于处理多选场景。
使用方式如下:
```html
```
在组件内部需要绑定一个额外的变量做内部的MVVM,并同时监听value值和该变量的变化,如下:
```js
{
...
data() {
return {
localValue: ''
}
},
watch: {
value(v) {
// 当原生DOM的value值变化,同时更新内部变量
this.localValue = v;
},
localValue(v) {
// 当内部变量变化,同时设置原生DOM的value值
this.$value(v);
},
}
...
}
```
注意:
1. 如果绑定的是多选类型,比如checkbox或者multiple类型的select以及一些自定义的组件,则内部变量的值必须是数组,而其他的则为字符串
2. value值默认是String类型,所以通过el.value获取到的值都是string类型,并且在设置value时也会被转为字符串,在多选场景下,如果希望直接获取到数组,可以在组件里为value添加prop,并设置type为Array即可
3. 如果多选场景没有单独设置value的type为Array,则需要自行在watch监听value变化的时候将字符串转为数组。VUE的`methods`上已经扩展里`$anyToArray`函数来转数组,比如:
```js
{
...
watch: {
value(v) {
this.localArray = this.$anyToArray(v);
},
localArray(v) {
this.$value(v);
}
},
...
}
```
### 4. slot插槽使用
由于AUI组件是原生DOM,所以使用上跟VUE本身的插槽使用方式有所不同。类似于DIV等标签,理论上所有子节点都是默认插槽的内容,而没有具名插槽,为了扩展具名插槽,AUI组件内部使用了`aui-slot`元素来实现具名插槽。
使用规范:
1. `aui-slot`仅在通过原生DOM方式时使用,通过标准VUE组件则仍使用`template`。
2. `aui-slot`元素使用for属性指定需要插入的插槽名称。
3. `aui-slot`不支持VUE插槽的高级用法。
比如:
```html
这是header
这是header
```
### 5. 其他
在框架内部调用组件,可以直接使用标签名(`aui-comp-name`)方式调用,也可以使用Vue风格的组件调用方式,如果是在框架外调用则只能通过标准的DOM操作方式调用,比如:
```html
```
```js
// 通过标准创建原生DOM方式在框架内和框架外都可使用
const el = document.createElement('aui-my-comp');
document.body.append(el);
// 通过标准插入代码片段方式在框架内和框架外都可使用
document.body.innerHTML = ''
```
## 使用
Agile3.0框架目前只支持在`Vite`项目中开发,但是编译后可以在任何框架中使用。
版本要求:
1. node22+
2. vite7+
3. vue3+
[->直达示例](https://gitee.com/nandy007/agile-vite-vue)
### 第一步:安装模块
```bash
npm install agile-core
```
安装完成会在当前工程的`types`目录生成必要的代码模块定义,如果没有生成,可以到已安装的模块的`types`目录下把所有`d.ts`文件拷贝到项目的types目录,并且设置项目自身的tsconfig.json文件,添加`types`目录到`include`节点下
### 第二步:在Vite.config.ts配置中添加aui插件
```js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { getAuiConfig } from 'agile-core'
import { mergeConfig } from 'vite'
// 引入aui插件
const { userConfig, isCustomElement } = getAuiConfig();
const baseConfig = {
plugins: [vue({
template: {
compilerOptions: {
// 设置以aui开头的原生DOM为自定义元素
isCustomElement
}
}
})],
}
// https://vite.dev/config/
export default defineConfig(async () => {
// 合并aui配置到vite配置中
return mergeConfig(baseConfig, userConfig)
})
```
### 第三步:在项目中使用.aui.vue文件
所有aui组件都需要以.aui.vue文件的格式进行定义,ExampleComp.aui.vue文件:
```html
```
组件内容与`VUE`组件规范一致,但是需要遵循前面提到的`规范`。
注:如果是在框架内使用,在import一个`.aui.vue`文件时可能会报错,需要添加类型定义,即在合适的`d.ts`文件中添加:
```ts
// vite-env.d.ts文件内容
///
declare module '*.aui.vue' {
import { DefineComponent } from 'vue';
const component: DefineComponent<{}, {}, any>;
export default component;
}
```
## 插件
### 介绍
AUI组件可通过插件机制对原组件的定义进行修改,或者对组件重新进行定义。
需要注意的是,对组件更新只有在组件创建前有效,请注意时机。
```js
// 引入AUI核心
import { default as auiCore, type Component } from 'agile-core';
```
### 组件HOOK
组件hook即对组件内部的行为进行变更,主要通过函数`hookStructure(tagName: string, handle: HookHandler): void;`实现
其中:
`tagName`是组件的完整标签名,比如:aui-my-comp
`handle`是一个函数,用于对组件内部的行为进行变更,函数的参数为组件的定义,返回值为变更后的组件定义,也可以不返回。
比如:
```js
auiCore.hookStructure('aui-example-comp', function (structure: Component) {
const originMounted = structure.mounted;
structure.mounted = function () {
console.log('from hook aui-example-comp');
originMounted?.call(this);
}
console.log('hook aui-example-comp');
});
```
### 组件定义
组件定义即对AUI组件进行定义,主要通过函数`define(v: Component, force?: boolean): Component;`实现。
其中:
`v`为组件的定义
`force`为是否强制定义,默认值为false。仅在当组件已经被定义时生效,true则会覆盖定义,false则本次定义无效
比如:
```js
auiCore.define({
name: 'ExampleComp',
props: {
myMsg: {
type: String,
default: ''
}
},
render() {
return h('div', { class: 'container' }, ['这是强制定义的组件', h('div', this.myMsg)]);
}
}, true);
```