weaver-e10-builder 1.5.16 → 1.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/dist/commands/auth.d.ts.map +1 -1
  2. package/dist/commands/auth.js +4 -2
  3. package/dist/commands/auth.js.map +1 -1
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +109 -51
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/form-attachment-setting.d.ts +3 -0
  8. package/dist/commands/form-attachment-setting.d.ts.map +1 -0
  9. package/dist/commands/form-attachment-setting.js +422 -0
  10. package/dist/commands/form-attachment-setting.js.map +1 -0
  11. package/dist/commands/form-data.d.ts.map +1 -1
  12. package/dist/commands/form-data.js +49 -1
  13. package/dist/commands/form-data.js.map +1 -1
  14. package/dist/commands/form-ebuilder-scope.d.ts +21 -0
  15. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -1
  16. package/dist/commands/form-ebuilder-scope.js +41 -8
  17. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  18. package/dist/commands/form-field-linkage.d.ts +6 -1
  19. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  20. package/dist/commands/form-field-linkage.js +138 -31
  21. package/dist/commands/form-field-linkage.js.map +1 -1
  22. package/dist/commands/form-layout-code-reviewed.d.ts +3 -0
  23. package/dist/commands/form-layout-code-reviewed.d.ts.map +1 -0
  24. package/dist/commands/form-layout-code-reviewed.js +61 -0
  25. package/dist/commands/form-layout-code-reviewed.js.map +1 -0
  26. package/dist/commands/form-layout-describe.d.ts +3 -0
  27. package/dist/commands/form-layout-describe.d.ts.map +1 -0
  28. package/dist/commands/form-layout-describe.js +58 -0
  29. package/dist/commands/form-layout-describe.js.map +1 -0
  30. package/dist/commands/form-layout-diff.d.ts +3 -0
  31. package/dist/commands/form-layout-diff.d.ts.map +1 -0
  32. package/dist/commands/form-layout-diff.js +48 -0
  33. package/dist/commands/form-layout-diff.js.map +1 -0
  34. package/dist/commands/form-layout-document.d.ts +3 -0
  35. package/dist/commands/form-layout-document.d.ts.map +1 -0
  36. package/dist/commands/form-layout-document.js +81 -0
  37. package/dist/commands/form-layout-document.js.map +1 -0
  38. package/dist/commands/form-layout-edit.d.ts +3 -0
  39. package/dist/commands/form-layout-edit.d.ts.map +1 -0
  40. package/dist/commands/form-layout-edit.js +51 -0
  41. package/dist/commands/form-layout-edit.js.map +1 -0
  42. package/dist/commands/form-layout-init-reviewed.d.ts +3 -0
  43. package/dist/commands/form-layout-init-reviewed.d.ts.map +1 -0
  44. package/dist/commands/form-layout-init-reviewed.js +78 -0
  45. package/dist/commands/form-layout-init-reviewed.js.map +1 -0
  46. package/dist/commands/form-layout-restore.d.ts.map +1 -1
  47. package/dist/commands/form-layout-restore.js +23 -0
  48. package/dist/commands/form-layout-restore.js.map +1 -1
  49. package/dist/commands/form-layout-template-catalog.d.ts +3 -0
  50. package/dist/commands/form-layout-template-catalog.d.ts.map +1 -0
  51. package/dist/commands/form-layout-template-catalog.js +45 -0
  52. package/dist/commands/form-layout-template-catalog.js.map +1 -0
  53. package/dist/commands/form.d.ts.map +1 -1
  54. package/dist/commands/form.js +80 -5
  55. package/dist/commands/form.js.map +1 -1
  56. package/dist/commands/project.d.ts.map +1 -1
  57. package/dist/commands/project.js +39 -6
  58. package/dist/commands/project.js.map +1 -1
  59. package/dist/index.js +15 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
  62. package/dist/services/actionflow/components/action_eb_add.js +12 -5
  63. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  64. package/dist/services/actionflow/components/action_eb_add_compiler.d.ts.map +1 -1
  65. package/dist/services/actionflow/components/action_eb_add_compiler.js +5 -0
  66. package/dist/services/actionflow/components/action_eb_add_compiler.js.map +1 -1
  67. package/dist/services/actionflow/components/action_eb_delete.d.ts +6 -1
  68. package/dist/services/actionflow/components/action_eb_delete.d.ts.map +1 -1
  69. package/dist/services/actionflow/components/action_eb_delete.js +23 -5
  70. package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
  71. package/dist/services/actionflow/components/action_eb_delete_compiler.d.ts.map +1 -1
  72. package/dist/services/actionflow/components/action_eb_delete_compiler.js +22 -0
  73. package/dist/services/actionflow/components/action_eb_delete_compiler.js.map +1 -1
  74. package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
  75. package/dist/services/actionflow/components/action_eb_update.js +13 -4
  76. package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
  77. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  78. package/dist/services/actionflow/components/action_eb_update_compiler.js +9 -2
  79. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  80. package/dist/services/actionflow/components/date_trigger.js +2 -2
  81. package/dist/services/actionflow/components/date_trigger.js.map +1 -1
  82. package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
  83. package/dist/services/actionflow/components/enquiry_form.js +11 -10
  84. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  85. package/dist/services/actionflow/components/event_button.js +1 -1
  86. package/dist/services/actionflow/components/event_button.js.map +1 -1
  87. package/dist/services/actionflow/components/form_data_builder.d.ts +29 -1
  88. package/dist/services/actionflow/components/form_data_builder.d.ts.map +1 -1
  89. package/dist/services/actionflow/components/form_data_builder.js +67 -3
  90. package/dist/services/actionflow/components/form_data_builder.js.map +1 -1
  91. package/dist/services/actionflow/components/time_batch_trigger.js +2 -2
  92. package/dist/services/actionflow/components/time_batch_trigger.js.map +1 -1
  93. package/dist/services/actionflow/form_source.d.ts +44 -1
  94. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  95. package/dist/services/actionflow/form_source.js +231 -5
  96. package/dist/services/actionflow/form_source.js.map +1 -1
  97. package/dist/services/actionflow/preflight_service.d.ts +8 -0
  98. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  99. package/dist/services/actionflow/preflight_service.js +120 -14
  100. package/dist/services/actionflow/preflight_service.js.map +1 -1
  101. package/dist/services/actionflow/system_params.d.ts.map +1 -1
  102. package/dist/services/actionflow/system_params.js +4 -1
  103. package/dist/services/actionflow/system_params.js.map +1 -1
  104. package/dist/services/actionflow/trigger_common.d.ts.map +1 -1
  105. package/dist/services/actionflow/trigger_common.js +12 -3
  106. package/dist/services/actionflow/trigger_common.js.map +1 -1
  107. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  108. package/dist/services/actionflow/workflow_compiler.js +117 -40
  109. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  110. package/dist/services/form-attachment-settings.d.ts +110 -0
  111. package/dist/services/form-attachment-settings.d.ts.map +1 -0
  112. package/dist/services/form-attachment-settings.js +332 -0
  113. package/dist/services/form-attachment-settings.js.map +1 -0
  114. package/dist/services/form-attachment-upload.d.ts +30 -0
  115. package/dist/services/form-attachment-upload.d.ts.map +1 -0
  116. package/dist/services/form-attachment-upload.js +76 -0
  117. package/dist/services/form-attachment-upload.js.map +1 -0
  118. package/dist/services/form-data-openapi.d.ts +2 -0
  119. package/dist/services/form-data-openapi.d.ts.map +1 -1
  120. package/dist/services/form-data-openapi.js +1 -0
  121. package/dist/services/form-data-openapi.js.map +1 -1
  122. package/dist/services/form-layout-code-reviewed.d.ts +32 -0
  123. package/dist/services/form-layout-code-reviewed.d.ts.map +1 -0
  124. package/dist/services/form-layout-code-reviewed.js +101 -0
  125. package/dist/services/form-layout-code-reviewed.js.map +1 -0
  126. package/dist/services/form-layout-describe.d.ts +4 -0
  127. package/dist/services/form-layout-describe.d.ts.map +1 -0
  128. package/dist/services/form-layout-describe.js +107 -0
  129. package/dist/services/form-layout-describe.js.map +1 -0
  130. package/dist/services/form-layout-diff.d.ts +37 -0
  131. package/dist/services/form-layout-diff.d.ts.map +1 -0
  132. package/dist/services/form-layout-diff.js +232 -0
  133. package/dist/services/form-layout-diff.js.map +1 -0
  134. package/dist/services/form-layout-document-apply.d.ts +23 -0
  135. package/dist/services/form-layout-document-apply.d.ts.map +1 -0
  136. package/dist/services/form-layout-document-apply.js +82 -0
  137. package/dist/services/form-layout-document-apply.js.map +1 -0
  138. package/dist/services/form-layout-document.d.ts +13 -0
  139. package/dist/services/form-layout-document.d.ts.map +1 -0
  140. package/dist/services/form-layout-document.js +228 -0
  141. package/dist/services/form-layout-document.js.map +1 -0
  142. package/dist/services/form-layout-edit.d.ts +21 -0
  143. package/dist/services/form-layout-edit.d.ts.map +1 -0
  144. package/dist/services/form-layout-edit.js +103 -0
  145. package/dist/services/form-layout-edit.js.map +1 -0
  146. package/dist/services/form-layout-init-plan.d.ts +54 -0
  147. package/dist/services/form-layout-init-plan.d.ts.map +1 -0
  148. package/dist/services/form-layout-init-plan.js +211 -0
  149. package/dist/services/form-layout-init-plan.js.map +1 -0
  150. package/dist/services/form-layout-source/review.d.ts +4 -0
  151. package/dist/services/form-layout-source/review.d.ts.map +1 -0
  152. package/dist/services/form-layout-source/review.js +54 -0
  153. package/dist/services/form-layout-source/review.js.map +1 -0
  154. package/dist/services/form-layout-template-advanced.d.ts +5 -0
  155. package/dist/services/form-layout-template-advanced.d.ts.map +1 -1
  156. package/dist/services/form-layout-template-advanced.js +17 -1
  157. package/dist/services/form-layout-template-advanced.js.map +1 -1
  158. package/dist/services/form-layout-template-catalog.d.ts +13 -0
  159. package/dist/services/form-layout-template-catalog.d.ts.map +1 -0
  160. package/dist/services/form-layout-template-catalog.js +27 -0
  161. package/dist/services/form-layout-template-catalog.js.map +1 -0
  162. package/dist/services/form-layout-template-flow.d.ts +1 -1
  163. package/dist/services/form-layout-template-flow.d.ts.map +1 -1
  164. package/dist/services/form-layout-template-flow.js.map +1 -1
  165. package/dist/services/form-layout-template-verification.d.ts +34 -0
  166. package/dist/services/form-layout-template-verification.d.ts.map +1 -0
  167. package/dist/services/form-layout-template-verification.js +124 -0
  168. package/dist/services/form-layout-template-verification.js.map +1 -0
  169. package/dist/services/form-style-template.d.ts +3 -3
  170. package/dist/services/form-style-template.d.ts.map +1 -1
  171. package/dist/services/form-style-template.js +18 -13
  172. package/dist/services/form-style-template.js.map +1 -1
  173. package/package.json +1 -1
  174. package/skill-docs/SKILL.md +163 -155
  175. package/skill-docs/_catalog.md +110 -106
  176. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +60 -3
  177. package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +35 -33
  178. package/skill-docs/assets/sample/api/formApi.js +689 -510
  179. package/skill-docs/assets/sample/app/config.js +4 -0
  180. package/skill-docs/assets/sample/app/fields.js +25 -0
  181. package/skill-docs/assets/sample/entry.js +24 -22
  182. package/skill-docs/assets/sample/eslint.config.cjs +1 -0
  183. package/skill-docs/assets/sample/pages/Items.js +247 -0
  184. package/skill-docs/assets/sample/styles/prototypeStyles.js +137 -0
  185. package/skill-docs/references/coding/guide-edit-backfill.md +102 -150
  186. package/skill-docs/references/coding/guide-form-crud.md +195 -172
  187. package/skill-docs/references/coding/guide-html-to-react.md +250 -0
  188. package/skill-docs/references/coding/guide-page-code.md +194 -167
  189. package/skill-docs/references/coding/guide-page-export.md +27 -18
  190. package/skill-docs/references/coding/ref-compile-rules.md +7 -7
  191. package/skill-docs/references/common/capability-boundaries.md +20 -1
  192. package/skill-docs/references/common/guide-plan-template.md +29 -3
  193. package/skill-docs/references/common/map.md +13 -8
  194. package/skill-docs/references/common/ref-cli-commands.md +31 -10
  195. package/skill-docs/references/components/display-FilePreview.md +5 -4
  196. package/skill-docs/references/form/guide-browser-definition.md +57 -13
  197. package/skill-docs/references/form/guide-create-form.md +258 -258
  198. package/skill-docs/references/form/guide-field-linkage.md +4 -1
  199. package/skill-docs/references/form/guide-form-attachment-setting.md +95 -0
  200. package/skill-docs/references/form/guide-form-data.md +22 -1
  201. package/skill-docs/references/form/layout/code-block/code-block-guide.md +153 -0
  202. package/skill-docs/references/form/layout/code-block/controls.md +60 -0
  203. package/skill-docs/references/form/layout/code-block/coverage.md +32 -0
  204. package/skill-docs/references/form/layout/code-block/details.md +57 -0
  205. package/skill-docs/references/form/layout/code-block/events-validation.md +42 -0
  206. package/skill-docs/references/form/layout/code-block/foundations-fields.md +56 -0
  207. package/skill-docs/references/form/layout/code-block/layout-css.md +116 -0
  208. package/skill-docs/references/form/layout/code-block/recipes.md +164 -0
  209. package/skill-docs/references/form/layout/code-block/troubleshooting.md +49 -0
  210. package/skill-docs/references/form/layout/code-block/ui-global.md +47 -0
  211. package/skill-docs/references/form/layout/document.md +39 -0
  212. package/skill-docs/references/form/layout/incremental.md +133 -0
  213. package/skill-docs/references/form/layout/initialization.md +39 -0
  214. package/skill-docs/references/form/layout/inspect-edit.md +76 -0
  215. package/skill-docs/references/form/layout/layout-overview.md +67 -0
  216. package/skill-docs/references/form/layout/management.md +64 -0
  217. package/skill-docs/references/form/layout/planning.md +76 -0
  218. package/skill-docs/references/form/layout/source-restoration.md +388 -0
  219. package/skill-docs/references/form/layout/template/advanced-css.md +167 -0
  220. package/skill-docs/references/form/layout/template/advanced.md +318 -0
  221. package/skill-docs/references/form/layout/template/easy.md +64 -0
  222. package/skill-docs/references/form/layout/template/flow.md +30 -0
  223. package/skill-docs/references/form/layout/template/template-guide.md +56 -0
  224. package/skill-docs/references/form/layout/workflow-layout.md +44 -0
  225. package/skill-docs/references/form/ref-form-fields.md +303 -301
  226. package/skill-docs/references/workflow/guide-workflow-node-layout.md +189 -187
  227. package/skill-docs/assets/sample/config/config.js +0 -0
  228. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  229. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  230. package/skill-docs/assets/sample/config/config_default.js +0 -0
  231. package/skill-docs/assets/sample/memo.md +0 -0
  232. package/skill-docs/assets/sample/readme.js +0 -8
@@ -1,29 +1,37 @@
1
1
  # 页面编码指南
2
2
 
3
- > 本文件为 SKILL.md 的子模块,在需要写页面代码时加载。
4
- > 页面是搭建流程的最后一步,写代码前确保应用、表单、流程都已建好。
3
+ > 本文件是 Ecode React 页面的主入口。用户明确要求 Ecode、还原 HTML 原型或不要设计器时,直接按本指南执行,不要再建议改用设计器。
4
+ > 页面是搭建的最后一步,写代码前确保应用、表单、流程已建好。
5
5
 
6
6
  ---
7
7
 
8
- ## 项目结构(从sample拷贝过来)
8
+ ## 一、项目结构
9
9
 
10
10
  ```
11
- ├── entry.js ← 路由注册入口
12
- ├── pages/ ← 页面组件
11
+ ├── entry.js ← 路由注册入口
12
+ ├── pages/ ← 页面组件
13
+ │ └── Items.js
13
14
  ├── api/
14
- │ └── formApi.js ← 表单数据 API
15
- └── config/ ← 配置文件(不用管)
15
+ │ └── formApi.js ← formClient
16
+ ├── app/
17
+ │ ├── config.js ← APP_ID / OBJ_ID
18
+ │ └── fields.js ← 字段 ID 常量
19
+ ├── styles/
20
+ │ └── prototypeStyles.js ← 原型的 CSS 字符串
21
+ └── resources/ ← 图片等静态资源
16
22
  ```
17
23
 
18
- - entry.js 只完成入口注册,不要写入业务逻辑。
19
- - formApi.js 默认自带。
20
- - 该项目只能在泛微云运行,其他环境缺少依赖都会报错。
21
- - 只能支持 js 编码,**不支持 jsx 或 ts**。
22
- - 尽量使用原生 React 编码。
24
+ - `entry.js` 只做入口注册,不写业务逻辑。
25
+ - 只能在泛微云运行,其他环境缺少 `@weapp/*` 依赖。
26
+ - 只支持 JS,不支持 JSX 文件扩展名或 TS;JSX 写在 `.js` 里由 Babel 编译。
27
+ - 所有页面代码全 ESM(`import` / `export`),不要 `module.exports`。
28
+ - **应用配置不要放 `config/`**:平台把 `config/` 当内置配置目录,普通模块导入拿不到(实测 `OBJ_ID` 为 undefined)。放 `app/`、`lib/` 这类普通目录。
29
+
30
+ 参考完整样例:`assets/sample/`。
23
31
 
24
32
  ---
25
33
 
26
- ## entry.js 路由注册模板(严格照抄)
34
+ ## 二、entry.js:`${appId}` 是固定字符串
27
35
 
28
36
  ```js
29
37
  import React from 'react';
@@ -31,20 +39,17 @@ import { Route } from 'react-router-dom';
31
39
  import { regOvProps, appInfo, regReactChildren } from '@weapp/utils';
32
40
  import { asyncImport } from '@weapp/ecodesdk';
33
41
 
34
- var { publicUrl } = appInfo('@weapp/ecodesdk');
42
+ var publicUrl = appInfo('@weapp/ecodesdk').publicUrl;
35
43
 
36
- // 1. 异步引入页面组件 — asyncImport 第一个参数固定为 '${appId}',不允许留空
37
- var MyPage = React.lazy(function () {
38
- return asyncImport('${appId}', 'pages/MyPage');
44
+ var ItemsPage = React.lazy(function () {
45
+ // 单引号里的 ${appId} 是固定字符串,不是应用 ID,不要替换成数字
46
+ return asyncImport('${appId}', 'pages/Items');
39
47
  });
40
48
 
41
- // 2. 路由 path 写死字符串,
42
- var ROUTE_PATH = '/sp/custom/ecode/my-page';
43
-
44
49
  var extract = (
45
- <Route path={publicUrl + ROUTE_PATH}>
50
+ <Route path={publicUrl + '/sp/custom/ecode/items'}>
46
51
  <React.Suspense fallback={<div>Loading...</div>}>
47
- <MyPage />
52
+ <ItemsPage />
48
53
  </React.Suspense>
49
54
  </Route>
50
55
  );
@@ -55,192 +60,214 @@ regOvProps('weappEcodesdk', 'Switch', function (props) {
55
60
  }, 0);
56
61
  ```
57
62
 
58
- **铁律**:
59
- - `asyncImport('${appId}', 'pages/xxx')` — 第一个参数**固定**是 `'${appId}'`,不能写空字符串、不能写别的值
60
- - `React.Suspense` **只包裹一层**,不要双层嵌套
61
- - 路由 path 写死字符串(如 `/sp/custom/ecode/my-page`),**不拼接 `${appId}` 变量**
62
-
63
- **一个项目可以包含多个页面**,在 entry.js 中按同样模式注册:
63
+ **`asyncImport` 的第一个参数是字面量 `'${appId}'`**:
64
64
 
65
65
  ```js
66
- var MeetingList = React.lazy(function () {
67
- return asyncImport('${appId}', 'pages/MeetingList');
68
- });
66
+ // 正确:原样保留这个字符串
67
+ asyncImport('${appId}', 'pages/Items')
69
68
 
70
- var MeetingForm = React.lazy(function () {
71
- return asyncImport('${appId}', 'pages/MeetingForm');
72
- });
73
-
74
- var extract = (
75
- <>
76
- <Route path={publicUrl + '/sp/custom/ecode/meeting-list'}>
77
- <React.Suspense fallback={<div>Loading...</div>}>
78
- <MeetingList />
79
- </React.Suspense>
80
- </Route>
81
- <Route path={publicUrl + '/sp/custom/ecode/meeting-form'}>
82
- <React.Suspense fallback={<div>Loading...</div>}>
83
- <MeetingForm />
84
- </React.Suspense>
85
- </Route>
86
- </>
87
- );
69
+ // 错误:把 Ebuilder 应用 ID、Ecode 项目 ID 或任何数字填进去
70
+ asyncImport('1330584721118584834', 'pages/Items')
71
+ asyncImport('1328370888652840961', 'pages/Items')
88
72
  ```
89
73
 
90
- > 新页面导出和路由注册详见 `references/coding/guide-page-export.md`
74
+ 它不是变量,也不是当前应用的 `APP_ID`;平台在运行时会替换这个固定占位符。几个名字不要混:
91
75
 
92
- ---
76
+ | 名称 | 是什么 | 用在哪 |
77
+ |---|---|---|
78
+ | `${appId}` | 固定占位字符串 | `asyncImport` 第一个参数,原样保留 |
79
+ | `APP_ID` | 当前 Ebuilder 应用 ID | `formClient({ appId: APP_ID })`、数据接口请求头 |
80
+ | `ecodeAppId` | Ecode 应用文件夹 ID | `ecodInfo.json`,与 Ebuilder 应用 ID 不同 |
81
+ | `mainUrl` | 页面主路由 | `ecodInfo.json`,必须和 `entry.js` 的 route path 一致 |
93
82
 
94
- ## 引用规则
83
+ 其它铁律:
95
84
 
96
- - **前置加载文件(entry.js)**可以直接 import:`import { getSimpleData } from './api/formApi.js'`
97
- - **非前置加载文件(pages/ 下的所有文件)**只能通过 `React.lazy(() => asyncImport('${appId}', 'pages/xxx'))` 引用
98
- - entry.js 中只能使用 `React`、`ReactDOM`、`@weapp/utils`、`@weapp/ecodesdk`、`axios`,**不能使用 `@weapp/ui` 组件**
85
+ - `React.Suspense` 只包一层。
86
+ - 路由 path 写死字符串(如 `/sp/custom/ecode/items`),不要拼 `${appId}` 变量。
87
+ - entry.js 里只能使用 `React`、`ReactDOM`、`react-router-dom`、`@weapp/utils`、`@weapp/ecodesdk`、`axios`;不要使用 `@weapp/ui` 组件。
88
+ - 一个项目可以有多个页面,每个页面按同样方式 `React.lazy` + `asyncImport` 注册。
99
89
 
100
90
  ---
101
91
 
102
- ## @weapp/ui 可用组件清单
92
+ ## 三、字段常量
103
93
 
104
- **只能使用以下明确列出的组件**,不要从 `@weapp/ui` 里编造任何不在此列表中的组件名。
94
+ 先用 CLI 导出字段:
105
95
 
106
- | 组件 | import 方式 | 参考文档 |
107
- |------|-----------|---------|
108
- | Table | `import { Table } from '@weapp/ui'` | `references/components/display-Table.md` |
109
- | Avatar | `import { Avatar } from '@weapp/ui'` | `references/components/display-Avatar.md` |
110
- | List | `import { List } from '@weapp/ui'` | `references/components/display-List.md` |
111
- | Pagination | `import { Pagination } from '@weapp/ui'` | `references/components/display-Pagination.md` |
112
- | Icon | `import { Icon } from '@weapp/ui'` | `references/components/display-Icon.md` |
113
- | Button | `import { Button } from '@weapp/ui'` | `references/components/@weapp-Button.md` |
114
- | EChart | `import { EChart } from '@weapp/ui'` | `references/components/generic-Echarts.md` |
115
- | CorsComponent | `import { CorsComponent } from '@weapp/ui'` | `references/components/display-FilePreview.md` |
116
- | Browser(人员) | `import { Browser } from '@weapp/ui'`<br>`type="resource"` | `references/components/form-EmployeeBrowser-api.md` |
117
- | Browser(部门) | `import { Browser } from '@weapp/ui'`<br>`type="department"` | `references/components/form-DepartmentBrowser-api.md` |
118
- | Upload | `import { Upload } from '@weapp/ui'` | `references/components/form-Upload.md` |
119
- | Badge | `import { Badge } from '@weapp/ui'` | `references/components/base-Badge.md` |
120
- | Tag | `import { Tag } from '@weapp/ui'` | `references/components/base-Tag.md` |
96
+ ```bash
97
+ e10-cli form read <objId> --app-id <appId> --out fields.json
98
+ ```
99
+
100
+ 再生成 `app/fields.js`:
121
101
 
122
- 表单输入控件(文本框、下拉框、日期选择等)用原生 HTML:
123
102
  ```js
124
- <input type="text" value={form[F.name]} onChange={...} />
125
- <input type="date" value={form[F.date]} onChange={...} />
126
- <select value={form[F.status]} onChange={...}>
127
- {options.map(function (opt) {
128
- return <option key={opt.valueKey} value={opt.valueKey}>{opt.name}</option>;
129
- })}
130
- </select>
103
+ export var F = {
104
+ name: '4765111450482898127',
105
+ status: '4765111450482898155',
106
+ owner: '4765111450482898160'
107
+ };
108
+
109
+ export var LABELS = {
110
+ name: '名称',
111
+ status: '状态',
112
+ owner: '负责人'
113
+ };
131
114
  ```
132
115
 
133
- ---
134
-
135
- ## 表单数据操作(核心模式)
116
+ 字段 ID 必须是 `fields.json` 里的 `fieldId`,不要手写、不要用字段名代替。
136
117
 
137
- **四个 API 各有分工,不要混用:**
118
+ ---
138
119
 
139
- | API | 用途 | 返回内容 |
140
- |-----|------|---------|
141
- | `getSimpleData(objId, userId)` | 读 ID、写回 formToSave | 所有特殊字段统一返回 `fieldOptionId`(纯数字串) |
142
- | `getAllData(objId, userId)` | 提取名称、编辑回显 | 含 `fieldOptionName`,mainTable key 是随机哈希 |
143
- | `withDisplayNames(rows, map)` | 表格展示:ID → 名称 | 把 Select 的 `valueKey` 映射为中文名 |
144
- | `getFieldOptions(fieldId, objId)` | 拿下拉选项 | `[{valueKey, name}]` |
120
+ ## 四、表单数据:只用 formClient
145
121
 
146
- **不同字段类型,名称来源不同(写在墙上):**
122
+ ```js
123
+ import { formClient } from '../api/formApi.js';
124
+ import { APP_ID, OBJ_ID } from '../app/config.js';
147
125
 
148
- | 字段类型 | getSimpleData 返回 | 展示时名称来源 |
149
- |---------|-------------------|--------------|
150
- | Text / Number / Date | `"值"` / `123` / `"2026-01-01"` | 直接展示 |
151
- | Select / RadioBox / CheckBox | `"1283421826353889337"`(选项 ID) | `getFieldOptions` → `withDisplayNames` 映射 |
152
- | **Employee** | `"2765550234448235905"`(用户 ID) | `getAllData` 的 `fieldOptionName`,**不是** getFieldOptions |
153
- | **Department** | `"2765550234448235905"`(部门 ID) | 同上 |
154
- | FileComponent | `"fileid1,fileid2"`(文件 ID 串) | 上传组件的 `name` |
126
+ var items = formClient({ objId: OBJ_ID, appId: APP_ID });
127
+ ```
155
128
 
156
- **表格页面标准加载模式:**
129
+ 页面只记三件事:
157
130
 
158
131
  ```js
159
- var [data, setData] = useState([]);
160
-
161
- useEffect(function () {
162
- Promise.all([
163
- getSimpleData(OBJ_ID, USER_ID),
164
- getFieldOptions(F.status, OBJ_ID), // Select 字段拿选项
165
- ]).then(function ([rows, statusOpts]) {
166
- // 加载时为每个需要展示名称的 Select/Employee 字段做映射
167
- // Employee/Department 的名称要另外从 getAllData 提取!
168
- var displayRows = withDisplayNames(rows, {
169
- [F.status]: statusOpts,
170
- });
171
- // Employee 字段需要额外用 getAllData 构建 ID→名称 map
172
- setData(displayRows);
173
- });
174
- }, []);
132
+ page.rows[i].values / display / items // 一个行形状
133
+ items.list / get / save / update / remove // 一套 CRUD
175
134
  ```
176
135
 
177
- **写入 / 更新:**
136
+ 完整用法见 `guide-form-crud.md`,编辑回显见 `guide-edit-backfill.md`。最小列表页:
178
137
 
179
138
  ```js
180
- // form 中所有值已经是 ID,直接拼入 formToSave
181
- var formToSave = {};
182
- Object.keys(form).forEach(function (key) {
183
- if (form[key] !== '' && form[key] !== null && form[key] !== undefined) {
184
- formToSave[key] = form[key];
185
- }
186
- });
187
- // 选择器新值覆盖
188
- if (selectedPerson.length > 0) formToSave[F.person] = selectedPerson[0].id;
189
-
190
- if (editingId) {
191
- updateFormData(OBJ_ID, formToSave, editingId, USER_ID);
192
- } else {
193
- saveFormData(OBJ_ID, formToSave, USER_ID);
139
+ import React, { useEffect, useState } from 'react';
140
+ import { formClient } from '../api/formApi.js';
141
+ import { APP_ID, OBJ_ID } from '../app/config.js';
142
+ import { F, LABELS } from '../app/fields.js';
143
+
144
+ var items = formClient({ objId: OBJ_ID, appId: APP_ID });
145
+
146
+ export default function Items() {
147
+ var [rows, setRows] = useState([]);
148
+ var [error, setError] = useState('');
149
+
150
+ useEffect(function () {
151
+ items.list({ page: 1, size: 20 }).then(function (page) {
152
+ setRows(page.rows);
153
+ }).catch(function (err) {
154
+ setError(err.message);
155
+ });
156
+ }, []);
157
+
158
+ return (
159
+ <div>
160
+ {error ? <div>{error}</div> : null}
161
+ <table>
162
+ <thead>
163
+ <tr><th>{LABELS.name}</th><th>{LABELS.status}</th></tr>
164
+ </thead>
165
+ <tbody>
166
+ {rows.map(function (row) {
167
+ return (
168
+ <tr key={row.id}>
169
+ <td>{row.display[F.name]}</td>
170
+ <td>{row.display[F.status]}</td>
171
+ </tr>
172
+ );
173
+ })}
174
+ </tbody>
175
+ </table>
176
+ </div>
177
+ );
194
178
  }
195
179
  ```
196
180
 
197
- > 完整的数据读写指南见 `references/coding/guide-form-crud.md`,编辑回显见 `references/coding/guide-edit-backfill.md`(前端代码)。
181
+ 不要再在页面里:
182
+
183
+ - 传 `userId` / `tenantKey`
184
+ - 调 `getSimpleData` / `getAllData` / `withDisplayNames`
185
+ - 拼 `mainTable`、判断随机 key、数组还是对象
186
+ - 把 `display` 里的中文名写回接口
187
+
188
+ 这些都在 `formApi.js` 里处理。
198
189
 
199
190
  ---
200
191
 
201
- ## 编译规则(简要)
192
+ ## 五、HTML 原型还原
193
+
194
+ 用户提供 HTML / 设计稿并要求还原时,读 `guide-html-to-react.md`。核心规则:
202
195
 
203
- - `ecodecmd build {project-dir} --target=e10` 打包(cd 到项目前一级)
204
- - 所有变量用 `var` 声明
205
- - 不支持的语法:`catch{}` 无参数 catch、`??`、`import()` 动态导入、`BigInt`
206
- - 详见 `references/coding/ref-compile-rules.md`(编译配置)、`references/coding/guide-page-export.md`(引用规范)
196
+ - 原型 `<style>` 整段复制到 `styles/prototypeStyles.js` 的字符串里,页面用 `<style>{PROTOTYPE_CSS}</style>` 渲染一次
197
+ - 不新写 CSS、不建独立 `.css`、不 `import` CSS、不把规则逐条改写成内联 style
198
+ - 保留原 class 名和 DOM 层级,只做 `class`→`className`、`for`→`htmlFor`、`style` 字符串→对象、模板字符串→组件/`map` 的机械转换
199
+ - 全局选择器、`:root`、keyframes 收敛到页面根容器,避免污染平台壳
200
+ - 图片走 `${appRes}/...`
207
201
 
208
202
  ---
209
203
 
210
- ## E10 平台硬规则(白屏 / 无样式 / 资源 404 的真凶)
204
+ ## 六、@weapp/ui 可用组件
205
+
206
+ **只能使用下列组件**,不要从 `@weapp/ui` 里编造组件名:
207
+
208
+ | 组件 | import 方式 | 文档 |
209
+ |---|---|---|
210
+ | Table | `import { Table } from '@weapp/ui'` | `references/components/display-Table.md` |
211
+ | Avatar | `import { Avatar } from '@weapp/ui'` | `references/components/display-Avatar.md` |
212
+ | List | `import { List } from '@weapp/ui'` | `references/components/display-List.md` |
213
+ | Pagination | `import { Pagination } from '@weapp/ui'` | `references/components/display-Pagination.md` |
214
+ | Icon | `import { Icon } from '@weapp/ui'` | `references/components/display-Icon.md` |
215
+ | Button | `import { Button } from '@weapp/ui'` | `references/components/@weapp-Button.md` |
216
+ | EChart | `import { EChart } from '@weapp/ui'` | `references/components/generic-Echarts.md` |
217
+ | CorsComponent | `import { CorsComponent } from '@weapp/ui'` | `references/components/display-FilePreview.md` |
218
+ | Browser(人员) | `import { Browser } from '@weapp/ui'`,`type="resource"` | `references/components/form-EmployeeBrowser-api.md` |
219
+ | Browser(部门) | `import { Browser } from '@weapp/ui'`,`type="department"` | `references/components/form-DepartmentBrowser-api.md` |
220
+ | Upload | `import { Upload } from '@weapp/ui'` | `references/components/form-Upload.md` |
221
+ | Badge | `import { Badge } from '@weapp/ui'` | `references/components/base-Badge.md` |
222
+ | Tag | `import { Tag } from '@weapp/ui'` | `references/components/base-Tag.md` |
223
+
224
+ 文本框、数字、日期、下拉框用原生 HTML,不要为了用组件而用组件。原型还原优先用原生 HTML + 原型 CSS,平台组件只用于人员/部门选择、上传、文件预览等必须能力。
225
+
226
+ ---
211
227
 
212
- > 上面的规则管「能不能编译、数据对不对」;本节管平台**导入 / 运行期**的硬约束。
213
- > 违反不会报编译错,只会让页面发布后白屏、样式丢失或资源 404,且本地很难发现,写完务必逐条对照。
228
+ ## 七、平台硬规则
214
229
 
215
230
  | 规则 | 说明 |
216
- |------|------|
217
- | **资源统一用 `${appRes}/相对路径`**(如 `${appRes}/logo.png`) | `${appRes}` 是平台模板变量,导入后自动替换成正式静态地址。**禁止**写 `./resources/...`、`../resources/...`、`/resources/...`,发布后必 404。 |
218
- | **禁止在线资源** | 不要 `loadjs('http(s)://...')`、CDN、外链脚本——平台不加载外网资源。确需第三方脚本:先下载进项目,再按上一条 `${appRes}` 引用。 |
219
- | **禁止在 JS 里 `import` CSS** | ecode 没有 CSS 模块解析,`import './x.css'` 不会生效,样式静默丢失。少量样式用内联 style;独立 CSS 文件的打包规则见 `ref-compile-rules.md`「E10 打包与平台加载规则」。 |
220
- | **HTML 原型:样式严格 100% 还原** | 用户提供 HTML 原型时,页面样式必须与原型严格一致(布局、间距、字号、颜色、圆角、边框、层级),不得用平台默认样式近似代替;交付前逐项对照原型自检。 |
221
- | **HTML 复刻:样式写进代码,不建独立 CSS 文件** | 用户提供 HTML/设计稿并要求完整复刻时,样式全部写在组件代码里(内联 `style` / 代码内样式对象),**不要生成独立 `.css` 文件**——拆出去不保证被加载,复刻会静默丢样式。 |
222
- | **全部用 ESM `import` / `export`,禁止 `module.exports`** | 平台按模块加载,CommonJS 导出解析不到。 |
223
- | **只用白名单组件及其文档化 props** | 拿不准的组件 / prop / 图标名,先查 `references/components/`,不要凭记忆从 `@weapp/ui` 编造。 |
224
- | **不碰平台组件内部** | 不读 `props.children[...]`(含可选链写法)、不依赖内部 class / `weId` 段、不做全局无条件 `regOvComponent` 复写——内部结构不是稳定 API,平台升级即坏。 |
231
+ |---|---|
232
+ | 资源统一 `${appRes}/相对路径` | 禁止 `./resources/...`、`../resources/...`、`/resources/...`;发布后会 404 |
233
+ | 禁止在线资源 | 不要 CDN、`loadjs('http(s)://...')`;第三方库先下载进项目 |
234
+ | 禁止 `import './x.css'` | ecode 无 CSS 模块解析;样式用原型 CSS 字符串或内联 style |
235
+ | 全 ESM | 不要 `module.exports` |
236
+ | 只用白名单组件 | 不编造组件/props,不读 `props.children[...]`、不依赖内部 class/`weId` |
237
+ | 路由 path 写死 | 不拼 `${appId}` 变量 |
238
+
239
+ ---
240
+
241
+ ## 八、自检与交付
242
+
243
+ 1. 用 `e10-cli check <项目目录>` 扫描已知规则。
244
+ 2. 用 `ecodecmd build <项目目录> --target=e10` 做真实编译;**不要依赖 `e10-cli compile` 作为门禁**。
245
+ 3. 检查 `build.json`:`entry.js` 必须是 `state:"y"`;新增文件后再次 build 不会自动补登记。
246
+ 4. 部署后由用户在实际环境验收页面;本流程不提供本地预览。
247
+
248
+ 自检清单:
249
+
250
+ - [ ] `asyncImport('${appId}', ...)` 是固定字符串,没有换成数字
251
+ - [ ] 所有变量用 `var`,没有 `let/const`(import 除外)
252
+ - [ ] 没有 `??`、无参 `catch {}`、动态 `import()`
253
+ - [ ] 页面在模块顶层创建 `formClient`,没有放进 render
254
+ - [ ] 列表只渲染 `display`,写入只用 `values`
255
+ - [ ] 人员/部门/附件回显用 `items`
256
+ - [ ] 没有 `import` CSS,样式来自原型 CSS 字符串
257
+ - [ ] 图片/资源使用 `${appRes}/...`
258
+ - [ ] 只用白名单组件,没有直接改平台组件内部
259
+ - [ ] `entry.js` 只做路由注册,没有业务逻辑
225
260
 
226
261
  ---
227
262
 
228
- ## 代码质量检查清单
229
-
230
- 生成代码后逐项检查:
231
-
232
- 1. [ ] 变量用 `var` 声明,非 `const`/`let`
233
- 2. [ ] 非前置加载文件引用使用 `React.lazy(() => asyncImport(...))`
234
- 3. [ ] **表格中没有任何裸 ID 展示**:Employee/Department 用 `fieldOptionName`,Select 用 `withDisplayNames`,用户看到的必须是中文名称
235
- 4. [ ] `getSimpleData` 返回值直接 `item[字段ID]`,没有 `_raw` 层
236
- 5. [ ] Select 字段读写统一用选项 ID(`valueKey`),不是显示名称
237
- 6. [ ] React state 不直接修改,创建新对象 `var newForm = {}; Object.keys(form).forEach(...)`
238
- 7. [ ] entry.js 不引入 `@weapp/ui` 组件
239
- 8. [ ] 没有 `forEach/map/filter(fn, this)` 传 context 的写法,用 `var self = this;` 替代
240
- 9. [ ] 表单数据 key 用字段 ID(纯数字字符串),对照 `form read --out fields.json`
241
- 10. [ ] Employee/Department 字段写入前已转为 ID
242
- 11. [ ] 页面没有 JS `import` CSS、没有 `module.exports`(全 ESM)
243
- 12. [ ] 图片等静态资源统一 `${appRes}/相对路径`,没有写死相对路径或在线热链(loadjs/CDN)
244
- 13. [ ] 只用清单内的 `@weapp/ui` 组件,不读 `props.children[...]`、不依赖内部 class/weId
245
- 14. [ ] entry.js 只做路由注册,没有业务逻辑 / 轮询 / 直接 import 页面组件
246
- 15. [ ] 写完代码后运行 `e10-cli check <项目目录>` 逐条自检
263
+ ## 九、常见错误
264
+
265
+ | 错误 | 正确做法 |
266
+ |---|---|
267
+ | 把 `asyncImport` 第一个参数换成应用 ID 数字 | 原样保留 `'${appId}'` |
268
+ | 在 `pages/` 里直接 `import` 另一个页面 | 用 `React.lazy(function () { return asyncImport('${appId}', 'pages/xxx'); })` |
269
+ | 用 `row.display` 回填表单 | 用 `row.values` |
270
+ | 用中文选项名做 `===` 比较 | 用选项 ID / `valueKey` |
271
+ | 列表没传 `page/size` | 默认可能只回 10 条,显式传 |
272
+ | 样式拆成独立 `.css` | 放回原型 CSS 字符串 |
273
+ | 把 `const appId = '${appId}'` 当变量用 | 不需要这个变量,直接写在 `asyncImport` 里 |
@@ -7,12 +7,12 @@
7
7
  只有前置加载的文件才可以直接 import:
8
8
 
9
9
  ```js
10
- import { getSimpleData } from './api/formApi.js'; // entry.js 中可以直接引用
10
+ import { formClient } from './api/formApi.js'; // 路径示例;实际在 pages 里使用
11
11
  ```
12
12
 
13
- - entry.js 中只能使用 `React`、`ReactDOM`、`@weapp/utils`、`@weapp/ecodesdk`、`axios`
13
+ - entry.js 中只能使用 `React`、`ReactDOM`、`react-router-dom`、`@weapp/utils`、`@weapp/ecodesdk`、`axios`
14
14
  - **不能使用 `@weapp/ui` 组件**
15
- - entry 只完成入口的注册,不要写入业务逻辑
15
+ - entry 只完成入口的注册,不要写入业务逻辑;数据操作放在 `pages/` 里
16
16
 
17
17
  ### 非前置加载文件(pages/ 目录)
18
18
 
@@ -20,10 +20,14 @@ import { getSimpleData } from './api/formApi.js'; // entry.js 中可以直接
20
20
 
21
21
  ```js
22
22
  import { asyncImport } from '@weapp/ecodesdk';
23
- const AgentSxxx = React.lazy(() => asyncImport('${appId}', 'pages/AgentSxxx'));
24
- // '${appId}' 是固定写法,是内置的ecode应用ID,不用管
23
+ var AgentSxxx = React.lazy(function () {
24
+ // 单引号里的 ${appId} 是固定字符串,不是应用 ID,不要替换成数字
25
+ return asyncImport('${appId}', 'pages/AgentSxxx');
26
+ });
25
27
  ```
26
28
 
29
+ > `asyncImport` 第一个参数必须原样保留 `'${appId}'`。它不是 Ebuilder 应用 ID、不是 Ecode 项目 ID,也不是任何数字;平台运行时会替换这个固定占位符。`app/config.js` 里的 `APP_ID` 是 Ebuilder 应用 ID,只用于数据接口请求头。
30
+
27
31
  引用路径要根据文件相对位置判断:
28
32
  - entry.js 中引用 `api/formApi.js`:`'./api/formApi.js'`
29
33
  - pages/ 目录下引用 `api/formApi.js`:`'../api/formApi.js'`
@@ -35,16 +39,20 @@ const AgentSxxx = React.lazy(() => asyncImport('${appId}', 'pages/AgentSxxx'));
35
39
  在 `entry.js` 中通过 `regOvProps` + `regReactChildren` 注册路由:
36
40
 
37
41
  ```js
42
+ import React from 'react';
43
+ import { Route } from 'react-router-dom';
38
44
  import { regOvProps, appInfo, regReactChildren } from '@weapp/utils';
39
- const { publicUrl } = appInfo('@weapp/ecodesdk');
40
- const extract = (
41
- <Route path={`${publicUrl}/sp/custom/abc123123/abc123`}> // 导出页面的具体路径
45
+
46
+ var publicUrl = appInfo('@weapp/ecodesdk').publicUrl;
47
+ var extract = (
48
+ <Route path={publicUrl + '/sp/custom/ecode/my-page'}>
42
49
  <React.Suspense fallback={<div>Loading...</div>}>
43
- <Test /> // 导出页面的组件
50
+ <Test />
44
51
  </React.Suspense>
45
52
  </Route>
46
53
  );
47
- regOvProps('weappEcodesdk', 'Switch', (props) => {
54
+
55
+ regOvProps('weappEcodesdk', 'Switch', function (props) {
48
56
  regReactChildren(props, extract);
49
57
  return props;
50
58
  }, 0);
@@ -90,26 +98,27 @@ regOvProps('weappEcodesdk', 'Switch', (props) => {
90
98
 
91
99
  ```js
92
100
  import React from 'react';
101
+ import { Route } from 'react-router-dom';
93
102
  import { regOvProps, appInfo, regReactChildren } from '@weapp/utils';
94
103
  import { asyncImport } from '@weapp/ecodesdk';
95
104
 
96
- const { publicUrl } = appInfo('@weapp/ecodesdk');
97
- const appId = '${appId}';
105
+ var publicUrl = appInfo('@weapp/ecodesdk').publicUrl;
98
106
 
99
- // 异步引入页面组件
100
- const MyPage = React.lazy(() => asyncImport('${appId}', 'pages/MyPage'));
107
+ var MyPage = React.lazy(function () {
108
+ // 单引号里的 ${appId} 是固定字符串,不是应用 ID
109
+ return asyncImport('${appId}', 'pages/MyPage');
110
+ });
101
111
 
102
- // 注册路由 — path 写死固定字符串,和
103
112
  var ROUTE_PATH = '/sp/custom/ecode/my-page';
104
- const myRoute = (
105
- <Route path={`${publicUrl}${ROUTE_PATH}`}>
113
+ var myRoute = (
114
+ <Route path={publicUrl + ROUTE_PATH}>
106
115
  <React.Suspense fallback={<div>Loading...</div>}>
107
116
  <MyPage />
108
117
  </React.Suspense>
109
118
  </Route>
110
119
  );
111
120
 
112
- regOvProps('weappEcodesdk', 'Switch', (props) => {
121
+ regOvProps('weappEcodesdk', 'Switch', function (props) {
113
122
  regReactChildren(props, myRoute);
114
123
  return props;
115
124
  }, 0);
@@ -29,7 +29,7 @@ plugins: ['proposal-object-rest-spread', 'proposal-optional-chaining']
29
29
  |------|------|
30
30
  | JSX | `<div className="app">{content}</div>` |
31
31
  | 箭头函数 | `(x) => x + 1` |
32
- | async/await | `const data = await getSimpleData(...)` |
32
+ | async/await | `var page = await items.list({ page: 1, size: 20 })` |
33
33
  | 模板字符串 | `` `Hello ${name}` `` |
34
34
  | 对象展开 `...` | `{ ...oldObj, newKey: val }` |
35
35
  | 可选链 `?.` | `obj?.nested?.value` |
@@ -113,9 +113,9 @@ e10-cli project import <projectId> .target/xxx.zip --main-url /sp/custom/...
113
113
 
114
114
  - **禁止在 JS 里 `import` CSS**:ecode 无 CSS 模块解析,写了必丢、发布后无样式。
115
115
  - **用户提供 HTML 原型时,页面样式严格 100% 还原**(布局、间距、字号、颜色、圆角、边框、层级),不用平台默认样式近似代替。
116
- - **完整复刻用户提供的 HTML 时,样式一律内联进代码**(内联 style / 代码内样式对象),不要拆成独立 `.css` 文件:拆出去既不保证加载,也容易与页面结构脱节,复刻效果走样。
117
- - 少量页面样式用内联 style;确需独立 `.css` 文件时,确认它在 `build.json` 的 codes 里(首次自动生成时 `.css` 会登记为 `y`;文件是后加的要自行补登记),否则平台不合并加载。
118
- - 业务 CSS 选择器挂在页面根容器下,避免裸 `.类名`、`body`、`:root` 或平台内部 class 污染全局。
116
+ - **复用原型 CSS**:把原型 `<style>` 整段复制到代码里的字符串(如 `styles/prototypeStyles.js`),页面用 `<style>{PROTOTYPE_CSS}</style>` 渲染一次。不要新写 CSS、不要拆独立 `.css` 文件、不要把规则逐条改写成内联 style。
117
+ - 少量页面样式可以用内联 style;确需独立 `.css` 文件时,确认它在 `build.json` 的 codes 里(首次自动生成时 `.css` 会登记为 `y`;文件是后加的要自行补登记),否则平台不合并加载。
118
+ - 业务 CSS 选择器挂在页面根容器下,避免裸 `.类名`、`body`、`:root` 或平台内部 class 污染全局;原型的全局选择器和 keyframes 要收敛到页面根并加前缀。
119
119
 
120
120
  ### 资源规则
121
121
 
@@ -126,7 +126,7 @@ e10-cli project import <projectId> .target/xxx.zip --main-url /sp/custom/...
126
126
 
127
127
  ## 关键注意事项
128
128
 
129
- 1. **所有变量用 var 声明**,非前置加载文件引用确保使用 `React.lazy(() => asyncImport...)`
130
- 2. `${appId}` 是占位符,运行时由 ecode SDK 替换
131
- 3. 写完代码后运行 `e10-cli check <项目目录>` 逐条自检,全部确认通过后再 build
129
+ 1. **所有变量用 var 声明**,非前置加载文件引用确保使用 `React.lazy(function () { return asyncImport('${appId}', 'pages/xxx'); })`
130
+ 2. **`${appId}` 是固定占位字符串**,不是 Ebuilder 应用 ID、Ecode 项目 ID 或任何数字;原样写在 `asyncImport` 第一个参数里,运行时由 ecode SDK 替换
131
+ 3. 写完代码后运行 `e10-cli check <项目目录>` 扫描已知规则,再用 `ecodecmd build <项目目录> --target=e10` 做真实编译;**不要把 `e10-cli compile` 当作可靠门禁**
132
132
  4. 本地修改后一定要及时 `ecodecmd build` + `import` 上传,否则用户无法验证(用户看不到本地代码)
@@ -10,6 +10,25 @@
10
10
 
11
11
  1. 先查 `references/common/ref-cli-commands.md` 的对应命令与参数;
12
12
  2. 再跑 `e10-cli <命令> --help` 确认当前版本有没有该选项;
13
- 3. 仍无法确认时,问用户或如实说明「当前版本没有对应命令」。
13
+ 3. 能只读验证的,做一次只读查询或回读并记录结果;
14
+ 4. 仍无法确认时,标「待环境核查」或「未证实」,不要猜;必要时问用户;
15
+ 5. 已确认做不到或只能部分做到时,写进 `plan.md` 的 0.1 和「待确认、需补充及无法实现」一节,保持 `[ ]`。
14
16
 
15
17
  **禁止绕行**:不要为了完成配置临时编写 `.mjs` 脚本调用内部接口,也不要让用户直接操作浏览器或设计器代替命令;确认没有命令时,保留该项未完成状态并说明影响。
18
+
19
+ ## 证据等级(写预检结论 / 边界表时必填)
20
+
21
+ | 等级 | 含义 | 能否对外说「不支持」 |
22
+ |---|---|---|
23
+ | 实测 | 有平台原始回执,或写后有独立回读 | 可以,注明环境和日期 |
24
+ | 回读字段 | 平台返回体里确有该字段,语义未必实测 | 不能直接判「不支持」 |
25
+ | 命令表 | 只能证明**当前 CLI 没暴露** | **不能**;命令没暴露不等于平台不支持 |
26
+ | 未证实 | 有结论、无证据 | **不能**对外宣称 |
27
+
28
+ > 「选项表/命令表」只证明执行器没暴露,不能升级成「平台不提供」。需要平台结论时,先补实测或回读证据;没有证据就写「待环境核查」。
29
+
30
+ ## 边界记录格式
31
+
32
+ | 需求 | 结论 | 证据等级 | 依据 | 影响与处理 |
33
+ |---|---|---|---|---|
34
+ | <需求项> | 可做 / 部分可做 / 做不到 / 待环境核查 | 实测 / 回读字段 / 命令表 / 未证实 | <具体命令、回执或文档> | <保留未完成、替代方式或需用户决定> |