外掛模組設定檔說明¶
外掛模組開發完成後,需要透過多個 JSON 設定檔告訴 UOF X 如何載入和使用您的外掛模組。
本指南將詳細說明每個設定檔的用途和維護方式
設定檔結構¶
外掛模組的設定檔固定放在以下位置,不可任意更動:¶
設定檔目錄結構
└─ src
├─ assets
| └─ configs
| ├─ fields-design.json # 欄位設計時顯示設定
| ├─ fields-runtime.json # 欄位執行時載入設定
| ├─ panels-design.json # 面板設計設定
| ├─ panels-runtime.json # 面板執行設定
| └─ routes.json # 頁面路由與選單設定
├─ plugin.manifest.json # 外掛基本資訊
└─ plugin.versions.json # 版本與相容性設定
Schema 驗證支援
所有設定檔都支援 $schema
屬性,在 VS Code 中可以:
- 自動完成輸入提示
- 語法錯誤檢查
- 屬性說明顯示
根據開發項目選擇需要的設定檔¶
不是所有設定檔都需要維護,請根據您的開發項目選擇:
設定類型 | 檔案名稱 | 必要性 | 用途 |
---|---|---|---|
共用設定 | |||
plugin.manifest.json |
✅ 必要 | 外掛模組識別資訊 | |
plugin.versions.json |
✅ 必要 | 版本與相容性設定 | |
外掛欄位 (Web、App) | |||
fields-design.json |
✅ 欄位必要 | 欄位設計時顯示設定 | |
fields-runtime.json |
✅ 欄位必要 | 欄位執行時載入設定 | |
外掛面板 (Web、App 於 2025R4支援) | |||
panels-design.json |
✅ 面板必要 | 面板設計設定 | |
panels-runtime.json |
✅ 面板必要 | 面板執行時載入設定 | |
外掛頁面 (Web、App) | |||
routes.json |
✅ 頁面必要 | 頁面路由與選單設定 |
共用資訊設定¶
plugin.manifest.json - 外掛模組識別資訊¶
這個檔案定義外掛的基本資訊,就像是外掛的「身分證」。
plugin.manifest.json
{
"$schema": "../node_modules/@uofx/plugin/schema/plugin-manifest.schema.json",
"schemaVersion": "112",
"name": "一等一外掛模組範例",
"code": "Ede.Sample.Plugin",
"description": "新一代 UOF X 外掛模組",
"manufacturerCode": "Ede",
"manufacturer": "一等一科技",
"production": false
}
屬性說明
屬性 | 說明 | 注意事項 |
---|---|---|
schemaVersion |
設定檔格式版本 | 必須與安裝的 @uofx/plugin 套件版本一致 |
name |
外掛模組顯示名稱 | 會顯示在 UOF X 的 Plugin 管理清單中 |
code |
外掛模組唯一代號 | 僅能使用英文、數字、點號,最多 50 字元 |
production |
是否為正式版 | false 時會顯示「重載設定檔」功能 |
plugin.versions.json - 版本與相容性設定¶
管理外掛的版本更新與相容性
plugin.versions.json
{
"$schema": "../node_modules/@uofx/plugin/schema/plugin-versions.schema.json",
"versions": [
{
"version": "3.0",
"minimumUOFXVersion": "2.94.0",
"changelog": [
"新增了2個欄位",
"修正了一些錯誤"
]
},
{
"version": "2.0",
"minimumUOFXVersion": "2.90.0",
"changelog": [
"本次更新除掉了幾條蟲"
]
}
]
}
版本排序規則
UOF X 會從上到下讀取版本設定,所以請:
- 版本由大到小排列(3.0 → 2.0 → 1.0)
- 新版本放在最上面
- 確保
minimumUOFXVersion
設定正確
與 Nginx 設定的對應關係:
nginx.conf 版本路徑設定
# version "1.0" 對應 /1_0/
location /1_0/ {
proxy_pass http://Remote/;
}
# version "2.0" 對應 /2_0/
location /2_0/ {
proxy_pass http://Remote/;
}
依照開發類型維護設定檔¶
fields-design.json - 欄位設計時設定¶
在表單設計時,左方可用的欄位類型,依照自訂的 group 進行分類。
fields-design.json
{
"$schema": "../../../node_modules/@uofx/plugin/schema/fields-design.schema.json",
"fieldGroups": [
{
"code": "group1",
"name": "群組一"
}
],
"fields": [
{
"group": "group1",
"code": "sampleField",
"name": "sample欄位",
"icon": "assets/icons/u-plugin-form.svg",
"sizeConfig": {
"defaultCols": 2,
"defaultRows": 1,
"minCols": 1,
"minRows": 1
}
},
{
"group": "group1",
"code": "anotherField",
"name": "進階欄位",
"icon": "assets/icons/u-plugin-form.svg",
"sizeConfig": {
"defaultCols": 8,
"defaultRows": 2,
"minCols": 8,
"minRows": 2
}
}
]
}
設定重點
fieldGroups.code
與fields.group
必須對應fields.code
必須與fields-runtime.json
中的設定對應icon
路徑會自動加上版本前綴,如:http://plugin/1_0/assets/icons/u-plugin-form.svg
fields-runtime.json - 欄位執行時設定檔¶
這個設定檔用來定義「表單在開啟時,要載入哪些外掛欄位」。 無論是 Web 或 App 的外掛欄位,都集中在這個檔案設定。
APP 外掛欄位開發特別注意
如果您有開發 APP 外掛欄位,必須在此設定檔中加上 APP 外掛欄位設定:
- ✅ 必須加上
app
設定區塊 - ✅ APP 模組名稱通常與 Web 不同
- ❌ 只設定 Web 平台,APP 將無法載入外掛欄位
fields-runtime.json
{
"$schema": "../../../node_modules/@uofx/plugin/schema/fields-runtime.schema.json",
"sampleField": {
// 🌐 Web 外掛欄位設定
"exposedModule": "./HelloWorld", // Web 平台的模組路徑
"moduleName": "HelloWorldModule", // Web 平台使用的模組名稱
// 📱 APP 外掛欄位設定
"app": {
"exposedModule": "./HelloWorld", // APP 平台的模組路徑
"moduleName": "FieldHelloWorldAppModule" // APP 平台使用的模組名稱
}
},
"anotherField": {
// 🌐 Web 外掛欄位設定
"exposedModule": "./AdvancedField", // Web 平台的模組路徑
"moduleName": "AdvancedFieldModule", // Web 平台使用的模組名稱
// 📱 APP 外掛欄位設定
"app": {
"exposedModule": "./AdvancedField", // APP 平台的模組路徑
"moduleName": "FieldAdvancedAppModule" // APP 平台使用的模組名稱
}
}
}
panels-design.json - 面板設計設定¶
設定首頁儀表板可以使用的面板類型。
panels-design.json
{
"$schema": "../../../node_modules/@uofx/plugin/schema/panels-design.schema.json",
"admin": [
{
"code": "adminSample",
"name": "管理面板",
"sizeConfig": {
"defaultCols": 6,
"defaultRows": 2
}
}
],
"user": [
{
"code": "userSample",
"name": "使用者面板",
"sizeConfig": {
"defaultCols": 6,
"defaultRows": 2
}
}
]
}
panels-runtime.json - 面板執行設定¶
panels-runtime.json
{
"$schema": "../../../node_modules/@uofx/plugin/schema/panels-runtime.schema.json",
"adminSample": {
"exposedModule": "./Panel/Admin",
"moduleName": "HelloWorldPanelComponent"
},
"userSample": {
"exposedModule": "./Panel/User",
"moduleName": "UserPanelComponent"
}
}
面板是 Standalone Component
面板使用 Angular 的 Standalone Component 架構,所以 moduleName
填寫的是 Component 類別名稱,不是 Module 名稱。
routes.json - 選單與路由設定¶
設定外掛頁面在 UOF X 選單中的顯示方式和路由路徑。
menu.icon
與children.icon
請參考 共用規則。menu.name
為主選單名稱。funcId
必須是 唯一值,無論是 admin、user 還是 app,都 不能重複使用 。- 命名時請統一使用 全大寫字母搭配底線 作為分隔。此欄位的用途與 Plugin Page 權限設定相關,詳細請參考:設定 Plugin 頁面權限
path
為路由路徑,設定內容請參考 開始 Web 外掛頁面>路由設定
routes.json
{
"$schema": "../../../node_modules/@uofx/plugin/schema/routes.schema.json",
"admin": {
"menu": {
"name": "EDE 外掛模組",
"icon": "assets/icons/pets.png",
"children": [
{
"funcId": "CONTAINER",
"name": "內容置中",
"icon": "assets/icons/home.png",
"path": "container"
},
{
"funcId": "SUBLAYOUT",
"name": "有TAB的頁面",
"icon": "assets/icons/settings.png",
"path": "sub"
},
{
"funcId": "SUBLAYOUT_SIDER",
"name": "有側邊欄的頁面",
"icon": "assets/icons/security.png",
"path": "sub/sider"
}
]
}
},
"user": {
"menu": {
"name": "EDE 外掛模組",
"icon": "assets/icons/pets.png",
"children": [
{
"funcId": "USERFULL",
"name": "滿版的頁面",
"icon": "assets/icons/house.png",
"path": "full"
},
{
"funcId": "USERTAB",
"name": "有TAB的頁面",
"icon": "assets/icons/rocket_launch.png",
"path": "tab"
}
]
}
},
"app": {
"menu": {
"name": "EDE 外掛模組",
"children": [
{
"funcId": "APP_LOBBY",
"name": "大廳",
"icon": "assets/icons/house.png",
"path": "lobby"
}
]
}
}
}
選單顯示效果:



常見問題排解¶
設定檔無法載入¶
欄位無法顯示在設計器中¶
- 檢查設定檔對應關係
fields-design.json
中的fields.code
-
fields-runtime.json
中的對應設定 -
檢查檔案路徑
- 確認
exposedModule
路徑正確 - 確認
moduleName
名稱正確
選單無法顯示¶
- 檢查權限設定 - 確認 Plugin 頁面權限已正確設定
- 檢查 funcId 唯一性 - 確保沒有重複的 funcId
下一步¶
設定檔完成後,您可以: