glass-easel 0.1.0

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 (237) hide show
  1. package/README.md +40 -0
  2. package/dist/glass_easel.all.d.ts +1 -0
  3. package/dist/glass_easel.all.js +2 -0
  4. package/dist/glass_easel.all.js.map +1 -0
  5. package/dist/glass_easel.domlike.global.d.ts +1 -0
  6. package/dist/glass_easel.domlike.global.js +2 -0
  7. package/dist/glass_easel.domlike.global.js.map +1 -0
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +1 -0
  10. package/dist/types/src/backend/backend_protocol.d.ts +119 -0
  11. package/dist/types/src/backend/backend_protocol.d.ts.map +1 -0
  12. package/dist/types/src/backend/composed_backend_protocol.d.ts +90 -0
  13. package/dist/types/src/backend/composed_backend_protocol.d.ts.map +1 -0
  14. package/dist/types/src/backend/domlike_backend_protocol.d.ts +76 -0
  15. package/dist/types/src/backend/domlike_backend_protocol.d.ts.map +1 -0
  16. package/dist/types/src/backend/mode.d.ts +46 -0
  17. package/dist/types/src/backend/mode.d.ts.map +1 -0
  18. package/dist/types/src/backend/suggested_backend_protocol.d.ts +30 -0
  19. package/dist/types/src/backend/suggested_backend_protocol.d.ts.map +1 -0
  20. package/dist/types/src/behavior.d.ts +428 -0
  21. package/dist/types/src/behavior.d.ts.map +1 -0
  22. package/dist/types/src/class_list.d.ts +79 -0
  23. package/dist/types/src/class_list.d.ts.map +1 -0
  24. package/dist/types/src/component.d.ts +291 -0
  25. package/dist/types/src/component.d.ts.map +1 -0
  26. package/dist/types/src/component_params.d.ts +239 -0
  27. package/dist/types/src/component_params.d.ts.map +1 -0
  28. package/dist/types/src/component_space.d.ts +164 -0
  29. package/dist/types/src/component_space.d.ts.map +1 -0
  30. package/dist/types/src/data_path.d.ts +5 -0
  31. package/dist/types/src/data_path.d.ts.map +1 -0
  32. package/dist/types/src/data_proxy.d.ts +107 -0
  33. package/dist/types/src/data_proxy.d.ts.map +1 -0
  34. package/dist/types/src/data_utils.d.ts +3 -0
  35. package/dist/types/src/data_utils.d.ts.map +1 -0
  36. package/dist/types/src/element.d.ts +275 -0
  37. package/dist/types/src/element.d.ts.map +1 -0
  38. package/dist/types/src/element_iterator.d.ts +43 -0
  39. package/dist/types/src/element_iterator.d.ts.map +1 -0
  40. package/dist/types/src/event.d.ts +104 -0
  41. package/dist/types/src/event.d.ts.map +1 -0
  42. package/dist/types/src/external_shadow_tree.d.ts +20 -0
  43. package/dist/types/src/external_shadow_tree.d.ts.map +1 -0
  44. package/dist/types/src/func_arr.d.ts +39 -0
  45. package/dist/types/src/func_arr.d.ts.map +1 -0
  46. package/dist/types/src/global_options.d.ts +111 -0
  47. package/dist/types/src/global_options.d.ts.map +1 -0
  48. package/dist/types/src/index.d.ts +43 -0
  49. package/dist/types/src/index.d.ts.map +1 -0
  50. package/dist/types/src/mutation_observer.d.ts +79 -0
  51. package/dist/types/src/mutation_observer.d.ts.map +1 -0
  52. package/dist/types/src/native_node.d.ts +8 -0
  53. package/dist/types/src/native_node.d.ts.map +1 -0
  54. package/dist/types/src/node.d.ts +49 -0
  55. package/dist/types/src/node.d.ts.map +1 -0
  56. package/dist/types/src/relation.d.ts +47 -0
  57. package/dist/types/src/relation.d.ts.map +1 -0
  58. package/dist/types/src/render.d.ts +3 -0
  59. package/dist/types/src/render.d.ts.map +1 -0
  60. package/dist/types/src/selector.d.ts +32 -0
  61. package/dist/types/src/selector.d.ts.map +1 -0
  62. package/dist/types/src/shadow_root.d.ts +136 -0
  63. package/dist/types/src/shadow_root.d.ts.map +1 -0
  64. package/dist/types/src/template_engine.d.ts +18 -0
  65. package/dist/types/src/template_engine.d.ts.map +1 -0
  66. package/dist/types/src/text_node.d.ts +32 -0
  67. package/dist/types/src/text_node.d.ts.map +1 -0
  68. package/dist/types/src/tmpl/index.d.ts +18 -0
  69. package/dist/types/src/tmpl/index.d.ts.map +1 -0
  70. package/dist/types/src/tmpl/native_rendering.d.ts +45 -0
  71. package/dist/types/src/tmpl/native_rendering.d.ts.map +1 -0
  72. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts +80 -0
  73. package/dist/types/src/tmpl/proc_gen_wrapper.d.ts.map +1 -0
  74. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts +50 -0
  75. package/dist/types/src/tmpl/proc_gen_wrapper_dom.d.ts.map +1 -0
  76. package/dist/types/src/tmpl/range_list_diff.d.ts +19 -0
  77. package/dist/types/src/tmpl/range_list_diff.d.ts.map +1 -0
  78. package/dist/types/src/trait_behaviors.d.ts +38 -0
  79. package/dist/types/src/trait_behaviors.d.ts.map +1 -0
  80. package/dist/types/src/virtual_node.d.ts +10 -0
  81. package/dist/types/src/virtual_node.d.ts.map +1 -0
  82. package/dist/types/tests/backend/domlike.test.d.ts +2 -0
  83. package/dist/types/tests/backend/domlike.test.d.ts.map +1 -0
  84. package/dist/types/tests/base/env.d.ts +29 -0
  85. package/dist/types/tests/base/env.d.ts.map +1 -0
  86. package/dist/types/tests/base/match.d.ts +9 -0
  87. package/dist/types/tests/base/match.d.ts.map +1 -0
  88. package/dist/types/tests/core/backend.test.d.ts +2 -0
  89. package/dist/types/tests/core/backend.test.d.ts.map +1 -0
  90. package/dist/types/tests/core/behavior.test.d.ts +2 -0
  91. package/dist/types/tests/core/behavior.test.d.ts.map +1 -0
  92. package/dist/types/tests/core/component_space.test.d.ts +2 -0
  93. package/dist/types/tests/core/component_space.test.d.ts.map +1 -0
  94. package/dist/types/tests/core/data_update.test.d.ts +2 -0
  95. package/dist/types/tests/core/data_update.test.d.ts.map +1 -0
  96. package/dist/types/tests/core/misc.test.d.ts +2 -0
  97. package/dist/types/tests/core/misc.test.d.ts.map +1 -0
  98. package/dist/types/tests/core/placeholder.test.d.ts +2 -0
  99. package/dist/types/tests/core/placeholder.test.d.ts.map +1 -0
  100. package/dist/types/tests/core/slot.test.d.ts +2 -0
  101. package/dist/types/tests/core/slot.test.d.ts.map +1 -0
  102. package/dist/types/tests/core/trait_behaviors.test.d.ts +2 -0
  103. package/dist/types/tests/core/trait_behaviors.test.d.ts.map +1 -0
  104. package/dist/types/tests/tmpl/binding_map.test.d.ts +2 -0
  105. package/dist/types/tests/tmpl/binding_map.test.d.ts.map +1 -0
  106. package/dist/types/tests/tmpl/event.test.d.ts +2 -0
  107. package/dist/types/tests/tmpl/event.test.d.ts.map +1 -0
  108. package/dist/types/tests/tmpl/expression.test.d.ts +2 -0
  109. package/dist/types/tests/tmpl/expression.test.d.ts.map +1 -0
  110. package/dist/types/tests/tmpl/lvalue.test.d.ts +2 -0
  111. package/dist/types/tests/tmpl/lvalue.test.d.ts.map +1 -0
  112. package/dist/types/tests/tmpl/native_rendering.test.d.ts +2 -0
  113. package/dist/types/tests/tmpl/native_rendering.test.d.ts.map +1 -0
  114. package/dist/types/tests/tmpl/structure.test.d.ts +2 -0
  115. package/dist/types/tests/tmpl/structure.test.d.ts.map +1 -0
  116. package/dist/types/tests/types/chaining.test.d.ts +2 -0
  117. package/dist/types/tests/types/chaining.test.d.ts.map +1 -0
  118. package/dist/types/tests/types/createElement.test.d.ts +2 -0
  119. package/dist/types/tests/types/createElement.test.d.ts.map +1 -0
  120. package/dist/types/tests/types/definition.test.d.ts +2 -0
  121. package/dist/types/tests/types/definition.test.d.ts.map +1 -0
  122. package/guide/zh_CN/advanced/binding_map_update.md +32 -0
  123. package/guide/zh_CN/advanced/build_args.md +28 -0
  124. package/guide/zh_CN/advanced/component_filter.md +70 -0
  125. package/guide/zh_CN/advanced/component_space.md +124 -0
  126. package/guide/zh_CN/advanced/custom_backend.md +53 -0
  127. package/guide/zh_CN/advanced/error_listener.md +32 -0
  128. package/guide/zh_CN/advanced/external_component.md +73 -0
  129. package/guide/zh_CN/advanced/template_engine.md +61 -0
  130. package/guide/zh_CN/appendix/backend_protocol.md +501 -0
  131. package/guide/zh_CN/appendix/list_diff_algorithm.md +406 -0
  132. package/guide/zh_CN/basic/beginning.md +94 -0
  133. package/guide/zh_CN/basic/component.md +156 -0
  134. package/guide/zh_CN/basic/event.md +169 -0
  135. package/guide/zh_CN/basic/lifetime.md +66 -0
  136. package/guide/zh_CN/basic/method.md +62 -0
  137. package/guide/zh_CN/basic/template.md +135 -0
  138. package/guide/zh_CN/data_management/advanced_update.md +170 -0
  139. package/guide/zh_CN/data_management/data_deep_copy.md +157 -0
  140. package/guide/zh_CN/data_management/data_observer.md +154 -0
  141. package/guide/zh_CN/data_management/property_early_init.md +31 -0
  142. package/guide/zh_CN/data_management/pure_data_pattern.md +21 -0
  143. package/guide/zh_CN/index.md +93 -0
  144. package/guide/zh_CN/interaction/behavior.md +52 -0
  145. package/guide/zh_CN/interaction/component_path.md +37 -0
  146. package/guide/zh_CN/interaction/generic.md +73 -0
  147. package/guide/zh_CN/interaction/placeholder.md +40 -0
  148. package/guide/zh_CN/interaction/relation.md +151 -0
  149. package/guide/zh_CN/interaction/slot.md +137 -0
  150. package/guide/zh_CN/interaction/template_import.md +94 -0
  151. package/guide/zh_CN/interaction/trait_behavior.md +117 -0
  152. package/guide/zh_CN/styling/external_class.md +46 -0
  153. package/guide/zh_CN/styling/style_isolation.md +54 -0
  154. package/guide/zh_CN/styling/virtual_host.md +52 -0
  155. package/guide/zh_CN/tree/element_iterator.md +54 -0
  156. package/guide/zh_CN/tree/mutation_observer.md +52 -0
  157. package/guide/zh_CN/tree/node_tree.md +142 -0
  158. package/guide/zh_CN/tree/node_tree_modification.md +78 -0
  159. package/guide/zh_CN/tree/selector.md +66 -0
  160. package/jest.config.js +6 -0
  161. package/jest.dts.config.js +9 -0
  162. package/jest.unit.config.js +14 -0
  163. package/package.json +28 -0
  164. package/src/backend/backend_protocol.ts +313 -0
  165. package/src/backend/composed_backend_protocol.ts +252 -0
  166. package/src/backend/domlike_backend_protocol.ts +370 -0
  167. package/src/backend/mode.ts +51 -0
  168. package/src/backend/suggested_backend_protocol.ts +83 -0
  169. package/src/behavior.ts +1655 -0
  170. package/src/bootstrap_dom_dev.js +22 -0
  171. package/src/class_list.ts +376 -0
  172. package/src/component.ts +1309 -0
  173. package/src/component_params.ts +461 -0
  174. package/src/component_space.ts +547 -0
  175. package/src/data_path.ts +225 -0
  176. package/src/data_proxy.ts +670 -0
  177. package/src/data_utils.ts +50 -0
  178. package/src/element.ts +1966 -0
  179. package/src/element_iterator.ts +158 -0
  180. package/src/event.ts +401 -0
  181. package/src/external_shadow_tree.ts +27 -0
  182. package/src/func_arr.ts +198 -0
  183. package/src/global_options.ts +242 -0
  184. package/src/index.ts +187 -0
  185. package/src/mutation_observer.ts +252 -0
  186. package/src/native_node.ts +74 -0
  187. package/src/node.ts +174 -0
  188. package/src/relation.ts +380 -0
  189. package/src/render.ts +25 -0
  190. package/src/selector.ts +218 -0
  191. package/src/shadow_root.ts +766 -0
  192. package/src/template_engine.ts +45 -0
  193. package/src/text_node.ts +149 -0
  194. package/src/tmpl/index.ts +199 -0
  195. package/src/tmpl/native_rendering.ts +175 -0
  196. package/src/tmpl/proc_gen_wrapper.ts +954 -0
  197. package/src/tmpl/proc_gen_wrapper_dom.ts +230 -0
  198. package/src/tmpl/range_list_diff.ts +443 -0
  199. package/src/trait_behaviors.ts +51 -0
  200. package/src/virtual_node.ts +51 -0
  201. package/tests/backend/domlike.test.ts +254 -0
  202. package/tests/base/env.ts +78 -0
  203. package/tests/base/match.ts +185 -0
  204. package/tests/core/backend.test.ts +144 -0
  205. package/tests/core/behavior.test.ts +546 -0
  206. package/tests/core/component_space.test.ts +212 -0
  207. package/tests/core/data_update.test.ts +461 -0
  208. package/tests/core/misc.test.ts +339 -0
  209. package/tests/core/placeholder.test.ts +180 -0
  210. package/tests/core/slot.test.ts +1495 -0
  211. package/tests/core/trait_behaviors.test.ts +153 -0
  212. package/tests/legacy/README.md +3 -0
  213. package/tests/legacy/behavior.test.js +293 -0
  214. package/tests/legacy/component.test.js +1247 -0
  215. package/tests/legacy/data_path.test.js +149 -0
  216. package/tests/legacy/data_proxy.test.js +759 -0
  217. package/tests/legacy/element_iterator.test.js +148 -0
  218. package/tests/legacy/event.test.js +849 -0
  219. package/tests/legacy/external.test.js +510 -0
  220. package/tests/legacy/extra_info.test.js +109 -0
  221. package/tests/legacy/generics.test.js +176 -0
  222. package/tests/legacy/mutation_observer.test.js +210 -0
  223. package/tests/legacy/relation.test.js +517 -0
  224. package/tests/legacy/selector.test.js +263 -0
  225. package/tests/legacy/slot.test.js +915 -0
  226. package/tests/legacy/virtual.test.js +394 -0
  227. package/tests/tmpl/binding_map.test.ts +208 -0
  228. package/tests/tmpl/event.test.ts +206 -0
  229. package/tests/tmpl/expression.test.ts +429 -0
  230. package/tests/tmpl/lvalue.test.ts +160 -0
  231. package/tests/tmpl/native_rendering.test.ts +155 -0
  232. package/tests/tmpl/structure.test.ts +998 -0
  233. package/tests/types/chaining.test.ts +614 -0
  234. package/tests/types/createElement.test.ts +82 -0
  235. package/tests/types/definition.test.ts +442 -0
  236. package/tsconfig.json +11 -0
  237. package/webpack.config.js +270 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trait_behaviors.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trait_behaviors.test.d.ts","sourceRoot":"","sources":["../../../../tests/core/trait_behaviors.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=binding_map.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding_map.test.d.ts","sourceRoot":"","sources":["../../../../tests/tmpl/binding_map.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.test.d.ts","sourceRoot":"","sources":["../../../../tests/tmpl/event.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=expression.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.test.d.ts","sourceRoot":"","sources":["../../../../tests/tmpl/expression.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lvalue.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lvalue.test.d.ts","sourceRoot":"","sources":["../../../../tests/tmpl/lvalue.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=native_rendering.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_rendering.test.d.ts","sourceRoot":"","sources":["../../../../tests/tmpl/native_rendering.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=structure.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structure.test.d.ts","sourceRoot":"","sources":["../../../../tests/tmpl/structure.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chaining.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chaining.test.d.ts","sourceRoot":"","sources":["../../../../tests/types/chaining.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createElement.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createElement.test.d.ts","sourceRoot":"","sources":["../../../../tests/types/createElement.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=definition.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.test.d.ts","sourceRoot":"","sources":["../../../../tests/types/definition.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ # 绑定映射表更新
2
+
3
+ glass-easel 内置的模板引擎支持两种更新方式。
4
+
5
+ * 虚拟树更新:更新时,遍历需要更新的 Shadow Tree ,并更新变化了的数据绑定;
6
+ * 绑定映射表更新:更新时,根据改变的数据字段名、找到用到了该字段数据绑定表达式,然后更新它。
7
+
8
+ 绑定映射表更新通常是一种更快速高效的更新方式,但它不能用于更新 `wx:if` `wx:for` 子节点树内部用到的数据字段。
9
+
10
+ 每次更新时, glass-easel 会根据被设置的数据字段名,来选择应该使用哪种更新方式。
11
+
12
+ 如果想要指定只其中一种更新方式,可以在编译模板时控制:
13
+
14
+ ```js
15
+ const compileTemplate = (src: string, updateMode = '') => {
16
+ const group = new TmplGroup()
17
+ group.addTmpl('', src)
18
+ const genObjectSrc = `return ${group.getTmplGenObjectGroups()}`
19
+ group.free()
20
+ const genObjectGroupList = (new Function(genObjectSrc))() as { [key: string]: any }
21
+ return {
22
+ content: genObjectGroupList[''],
23
+ updateMode,
24
+ }
25
+ }
26
+ // 指定模板只使用虚拟树更新
27
+ compileTemplate('<div />', 'virtualTree')
28
+ // 指定模板只使用绑定映射表更新
29
+ compileTemplate('<div />', 'bindingMap')
30
+ ```
31
+
32
+ 注意:在不支持的模板上强行只使用绑定映射表更新,会导致出错或更新异常。
@@ -0,0 +1,28 @@
1
+ # 构建参数
2
+
3
+ glass-easel 的构建脚本会根据 `GLASS_EASEL_ARGS` 环境变量来构建出不同的结果。
4
+
5
+ 首先,构建模式会决定构建产物的文件名(位于 dist 目录下)以及不同的 [自定义后端](custom_backend.md) 支持度。目前支持的构建模式如下。
6
+
7
+ | 构建模式 | 文件名 | 支持的自定义后端 | 产物使用方式 |
8
+ | -------- | ------ | ---------------- | ------------ |
9
+ | all | glass_easel.all | 支持全部后端(运行时自动选择) | CommonJS |
10
+ | shadow | glass_easel.shadow | 支持 shadow 模式后端 | CommonJS |
11
+ | shadow-global | glass_easel.shadow.global | 支持 shadow 模式后端 | 全局变量 |
12
+ | composed | glass_easel.composed | 支持 composed 模式后端 | CommonJS |
13
+ | composed-global | glass_easel.composed.global | 支持 composed 模式后端 | 全局变量 |
14
+ | domlike | glass_easel.domlike | 支持 DOM 后端 | CommonJS |
15
+ | domlike-global | glass_easel.domlike.global | 支持 DOM 后端 | 全局变量 |
16
+
17
+ 一次可以同时启用多个构建模式。在 node.js 和打包工具中,第一个构建模式会视为被 import 时采用的构建结果。
18
+
19
+ 额外参数可以修饰构建结果:
20
+
21
+ * `--minimize` / `--no-minimize` 可以启用、禁用代码压缩混淆;
22
+ * `--dev` 可以激活 development 构建模式。
23
+
24
+ 例如,如果想要构建出支持全部后端和全局量模式 DOM 后端的两种构建结果、同时禁用代码压缩混淆,则 `GLASS_EASEL_ARGS` 环境变量应设为:
25
+
26
+ ```
27
+ all domlike-global --no-minimize
28
+ ```
@@ -0,0 +1,70 @@
1
+ # 组件构造器中间件
2
+
3
+ ## Definition Filter
4
+
5
+ 在定义组件时, glass-easel 允许一些简易的中间件来调整组件定义。
6
+
7
+ 对于 definition API ,可以使用 `definitionFilter` 。例如,可以定义一个中间件,用来检查是否有属性没有定义初始值:
8
+
9
+ ```js
10
+ export const propCheck = componentSpace.defineBehavior({
11
+ definitionFilter(def) {
12
+ // def 是定义组件时传入的组件定义对象
13
+ if (def.properties) {
14
+ Object.keys(def.properties).forEach((propName) => {
15
+ const prop = def.properties[propName]
16
+ if (prop.value === undefined) {
17
+ console.warn(`Forget property initial value of "${propName}"`)
18
+ }
19
+ })
20
+ }
21
+ }
22
+ })
23
+ ```
24
+
25
+ 中间件表现为一个 behavior 的形式。在组件中引用这个 behavior 时,中间件会被自动触发,例如:
26
+
27
+ ```js
28
+ export const myComponent = componentSpace.defineComponent({
29
+ // 引入含有 definitionFilter 的 behavior
30
+ hehaviors: [propCheck],
31
+ properties: {
32
+ a: {
33
+ type: String,
34
+ },
35
+ },
36
+ })
37
+ ```
38
+
39
+ ## Chaining Filter
40
+
41
+ 对于 Chaining API ,可以使用 `chainingFilter` 。它允许修改链式调用中的调用链函数。例如:
42
+
43
+ ```js
44
+ export const propCheck = componentSpace.define()
45
+ .chainingFilter((chain) => {
46
+ return Object.create(chain, {
47
+ property: {
48
+ value(propName, prop) {
49
+ if (prop.value === undefined) {
50
+ console.warn(`Forget property initial value of "${propName}"`)
51
+ }
52
+ chain.property(propName, prop)
53
+ }
54
+ },
55
+ })
56
+ })
57
+ .registerBehavior()
58
+ ```
59
+
60
+ 使用这个 behavior 时,要在链式调用靠前的地方引用:
61
+
62
+ ```js
63
+ export const myComponent = componentSpace.define()
64
+ // 引入含有 chainingFilter 的 behavior
65
+ .behavior(propCheck)
66
+ .property('a', {
67
+ type: String,
68
+ })
69
+ .registerComponent()
70
+ ```
@@ -0,0 +1,124 @@
1
+ # 组件空间
2
+
3
+ ## 定义组件空间
4
+
5
+ 组件空间是一组组件的集合。定义组件时,需要将它定义在某个组件空间里。
6
+
7
+ ```js
8
+ // 创建一个组件空间
9
+ const componentSpace = new glassEasel.ComponentSpace()
10
+
11
+ // 在这个组件空间中添加一个 hello-world 组件
12
+ export const helloWorld = componentSpace.defineComponent({
13
+ is: 'hello-world',
14
+ })
15
+ ```
16
+
17
+ 在使用组件名字来指定组件时,只会在当前组件空间中查找组件,例如:
18
+
19
+ ```js
20
+ componentSpace.defineComponent({
21
+ using: {
22
+ // 在同一个组件空间下查找名为 hello-world 的组件
23
+ hello: 'hello-world',
24
+ },
25
+ })
26
+ ```
27
+
28
+ ## 默认组件选项
29
+
30
+ 组件空间可以为其中的组件指定一部分组件选项,这样,一些组件选项就不需要在每个组件定义时单独设置,例如:
31
+
32
+ ```js
33
+ componentSpace.updateComponentOptions({
34
+ multipleSlots: true,
35
+ })
36
+ ```
37
+
38
+ 这个组件空间中接下来定义的组件将统一具有这些选项。
39
+
40
+ ## 默认组件
41
+
42
+ 在组件空间中可以定义一个默认组件,当组件定义未找到时,会使用默认组件来代替。
43
+
44
+ 通常,默认组件的名字是空字符串 `''` ,定义一个该名字的组件就可以将它作为默认组件:
45
+
46
+ ```js
47
+ export const helloWorld = componentSpace.defineComponent({
48
+ is: '',
49
+ })
50
+ ```
51
+
52
+ ## 基组件空间
53
+
54
+ 组件空间在创建时,可以导入另一个组件空间中的 **公开组件** 。例如:
55
+
56
+ ```js
57
+ // 创建一个基组件空间
58
+ const baseComponentSpace = new glassEasel.ComponentSpace()
59
+
60
+ // 在基组件空间中定义一个组件
61
+ baseComponentSpace.defineComponent({
62
+ is: 'base-component',
63
+ })
64
+
65
+ // 导出这个组件为公开组件
66
+ baseComponentSpace.exportComponent('base-component', 'base-component')
67
+
68
+ // 创建另一个组件空间,指定基组件空间
69
+ const baseComponentSpace = new glassEasel.ComponentSpace('', baseComponentSpace)
70
+
71
+ // 可以使用基组件空间中导出的组件
72
+ componentSpace.defineComponent({
73
+ using: {
74
+ base: 'base-component',
75
+ },
76
+ })
77
+ ```
78
+
79
+ ## 导入组件空间
80
+
81
+ 组件空间中的公开组件可以被其他组件空间导入,例如:
82
+
83
+ ```js
84
+ // 创建一个组件空间
85
+ const componentSpaceA = new glassEasel.ComponentSpace()
86
+
87
+ // 在基组件空间中定义一个组件
88
+ componentSpaceA.defineComponent({
89
+ is: 'a-component',
90
+ })
91
+
92
+ // 导出这个组件,并为它命一个公开的名字
93
+ componentSpaceA.exportComponent('public-name', 'a-component')
94
+
95
+ // 创建另一个组件空间
96
+ const componentSpaceB = new glassEasel.ComponentSpace()
97
+
98
+ // 导入组件空间并指定它的引用 URL 前缀
99
+ componentSpaceB.importSpace('space://space-a', componentSpaceA, false)
100
+
101
+ // 可以使用导入的组件空间中定义的组件
102
+ componentSpaceB.defineComponent({
103
+ using: {
104
+ base: 'space://space-a/public-name',
105
+ },
106
+ })
107
+ ```
108
+
109
+ 在导入组件空间时,也可以导入它的所有组件(不只是公开组件),例如:
110
+
111
+ ```js
112
+ // 创建另一个组件空间
113
+ const componentSpaceC = new glassEasel.ComponentSpace()
114
+
115
+ // 导入组件空间中的全部组件
116
+ componentSpaceC.importSpace('space-private://space-a', componentSpaceA, true)
117
+
118
+ // 可以使用导入的组件空间中定义的组件
119
+ componentSpaceC.defineComponent({
120
+ using: {
121
+ base: 'space-private://space-a/a-component',
122
+ },
123
+ })
124
+ ```
@@ -0,0 +1,53 @@
1
+ # 自定义后端
2
+
3
+ # 渲染后端
4
+
5
+ glass-easel 不仅可以用于 DOM 环境下,它还可以支持其他的 **渲染后端** 。
6
+
7
+ glass-easel 可以将它生成的节点树传递给渲染后端。最常见的渲染后端就是 DOM : glass-easel 可以将节点树转换为一些 DOM 调用(如 `document.createElement` 等),然后在浏览器的页面上展示出来。除此之外,在非浏览器环境下,也可以自行实现一些其他渲染后端,接收 glass-easel 生成的节点树、展示界面。
8
+
9
+ 渲染后端必须实现 [自定义后端协议](../appendix/backend_protocol.md) ,这个协议有三种模式,支持其中任意一种即可。
10
+
11
+ | 协议模式 | 主 TypeScript 接口 | 说明 |
12
+ | -------- | --------------- | ---- |
13
+ | Composed Mode | `glassEasel.composedBackend.Context` | 首选的协议,相对简单易用 |
14
+ | Shadow Mode | `glassEasel.backend.Context` | 针对 Shadow Tree 的协议,整体性能通常是最优的,但是协议本身比较复杂 |
15
+ | DOM-like Mode | `glassEasel.domlikeBackend.Context` | 适用于 DOM 的协议,通常只应该用于适配 DOM 接口 |
16
+
17
+ 实现渲染后端时,需要实现对应的 TypeScript 接口,例如:
18
+
19
+ ```ts
20
+ // 一个渲染后端实现
21
+ class MyCustomBackend implements glassEasel.composedBackend.Context {
22
+ // ...
23
+ }
24
+ ```
25
+
26
+ # 使用自定义的渲染后端
27
+
28
+ 要使用一个渲染后端,需要在根组件创建时传入对应的 `Context` 对象:
29
+
30
+ ```js
31
+ // 创建后端实例
32
+ const myCustomBackend = new MyCustomBackend()
33
+
34
+ // 连接事件系统
35
+ backendContext.onEvent((target, type, detail, options) => {
36
+ const ev = new glassEasel.Event(type, detail, options)
37
+ glassEasel.Event.dispatchEvent(target, ev)
38
+ return ev.defaultPrevented()
39
+ ? glassEasel.EventBubbleStatus.NoDefault
40
+ : glassEasel.EventBubbleStatus.Normal
41
+ })
42
+
43
+ // 创建根组件实例
44
+ const rootComponent = glassEasel.Component.createWithContext('body', helloWorld, myCustomBackend)
45
+
46
+ // 将组件插入到渲染后端的节点树中
47
+ const rootNode = myCustomBackend.getRootNode()
48
+ const placeholder = myCustomBackend.createElement('placeholder')
49
+ rootNode.appendChild(placeholder)
50
+ glassEasel.Element.replaceDocumentElement(rootComponent, rootNode, placeholder)
51
+ placeholder.release()
52
+ rootNode.release()
53
+ ```
@@ -0,0 +1,32 @@
1
+ # 警告与错误
2
+
3
+ # 错误监听器
4
+
5
+ 在组件生命周期、事件回调中抛出的异常,会被 glass-easel 捕获。想要获取这些异常,可以注册一个错误监听器:
6
+
7
+ ```js
8
+ glassEasel.addGlobalErrorListener((err, { element }) => {
9
+ err // 捕获的异常对象
10
+ if element instanceof glassEasel.Comonent {
11
+ element // 与这个异常相关的组件
12
+ }
13
+ // 返回 false 将取消 console 输出
14
+ return false
15
+ })
16
+ ```
17
+
18
+ 如果没有监听器或者监听器都没返回 `false` ,则错误信息会被输出到 console 中。如果 `glassEasel.globalOptions.throwGlobalError` 被设为 `true` ,则它会被再次抛出到全局。
19
+
20
+ # 警告监听器
21
+
22
+ glass-easel 也会产生一些警告用于提示一些常见的误用情况。默认情况下,警告会输出到 console 中。
23
+
24
+ 类似于错误,警告也可以被监听到,例如:
25
+
26
+ ```js
27
+ glassEasel.addGlobalWarningListener((message) => {
28
+ message // 警告信息
29
+ // 返回 false 将取消 console 输出
30
+ return false
31
+ })
32
+ ```
@@ -0,0 +1,73 @@
1
+ # 外部组件
2
+
3
+ ## 使用外部组件来提升性能
4
+
5
+ 有些时候,出于性能或一些特殊原因,可以使一个组件内部的实现不通过 Shadow Tree 维护,而是直接通过 DOM 接口或 [自定义后端](custom_backend.md) 接口来维护。
6
+
7
+ 在组件中添加 `externalComponent` 选项,就可以使它成为一个外部组件,例如:
8
+
9
+ ```js
10
+ componentSpace.defineComponent({
11
+ options: {
12
+ externalComponent: true,
13
+ },
14
+ })
15
+ ```
16
+
17
+ 这种模式下的组件通常具有很好的性能,但部分特性不可用:
18
+
19
+ * 模板中的 `wx:if` `wx:for` 不可用,仅支持 [虚拟树更新](binding_map_update.md) ;
20
+ * 由于没有 Shadow Tree ,所有与之相关的树遍历方式(如选择器查询)都不能访问到组件内的节点;
21
+ * 大部分 DOM 未提供的对应特性不可用,如外部样式类、复杂事件监听器等。
22
+
23
+ ## 外部组件与自定义模板引擎
24
+
25
+ 外部组件也可以与 [自定义模板引擎](template_engine.md) 一起使用,这样就可以使得部分 DOM 节点完全脱离 glass-easel 的维护。当需要其他第三方框架来维护部分 DOM 节点时,这个方式很实用。
26
+
27
+ 此时,自定义模板引擎在实现 `TemplateInstance` 接口时,返回的 `shadowRoot` 必须是 `glassEasel.ExternalShadowRoot` 类型的,例如:
28
+
29
+ ```js
30
+ class MyTemplateEngine {
31
+ create(rootBehavior, options) {
32
+ behavior.getTemplate() // 组件的 template 字段内容
33
+ // 检测组件是不是被定义为外部组件
34
+ if (!options.externalComponent) {
35
+ throw new Error('The template engine can only be used in external component')
36
+ }
37
+ return new MyTemplate()
38
+ }
39
+ }
40
+
41
+ class MyTemplate {
42
+ createInstance(component) {
43
+ return new MyTemplateInstance(component)
44
+ }
45
+ }
46
+
47
+ class MyTemplateInstance {
48
+ constructor(component) {
49
+ // 以外部组件形式使用
50
+ this.shadowRoot = {
51
+ root: document.body, // 用作 shadowRoot 的节点
52
+ slot: document.createElement('span'), // 用作 slot 的节点
53
+ getIdMap() {
54
+ // 返回节点 id 到节点的映射表
55
+ },
56
+ handleEvent(target, event) {
57
+ // 触发一个事件
58
+ },
59
+ setListener(element, event, listener) {
60
+ // 添加一个事件监听器
61
+ },
62
+ }
63
+ }
64
+
65
+ initValues(data) {
66
+ // 组件被创建,初始数据是 data
67
+ }
68
+
69
+ updateValues(data, changes) {
70
+ // 组件更新,新的数据是 data ,变更内容描述在 changes 中
71
+ }
72
+ }
73
+ ```
@@ -0,0 +1,61 @@
1
+ # 自定义模板引擎
2
+
3
+ ## 模板引擎简介
4
+
5
+ 模板引擎是处理模板、在模板上应用数据绑定更新的模块。
6
+
7
+ glass-easel 的默认模板引擎是 `glassEasel.glassEaselTemplate` ,但也可以通过更改组件 options 来指定另一个自定义的模块作为模板引擎。
8
+
9
+ 自定义模板引擎必须实现 TypeScript 接口 `glassEasel.templateEngine.TemplateEngine` 。
10
+
11
+ ## 模板引擎接口
12
+
13
+ `glassEasel.templateEngine.TemplateEngine` 接口需要实现一个 `create` 方法。这个方法对每个组件定义执行一次。它接受传入的组件定义,传出一个 `glassEasel.templateEngine.Template` 。
14
+
15
+ `glassEasel.templateEngine.Template` 接口需要实现一个 `createInstance` 方法。这个方法在每个组件实例创建时执行一次。它需要生成一个 `glassEasel.templateEngine.TemplateInstance` 。
16
+
17
+ `glassEasel.templateEngine.TemplateInstance` 则需要提供一个 `shadowRoot` 节点(调用 `glassEasel.ShadowRoot.createShadowRoot` 来获得)作为组件实例的 `this.shadowRoot` 。还需要实现 `initValues` 和 `updateValues` ,分别用于创建初始节点树、更新数据绑定。
18
+
19
+ 实现模板引擎时,常常需要用到 [节点树变更](../tree/node_tree_modification.md) 接口。
20
+
21
+ ## 自定义模板引擎示例
22
+
23
+ 自定义模板引擎的实现可以大体上以下例表示:
24
+
25
+ ```js
26
+ class MyTemplateEngine {
27
+ create(rootBehavior, options) {
28
+ behavior.getTemplate() // 组件的 template 字段内容
29
+ return new MyTemplate()
30
+ }
31
+ }
32
+
33
+ class MyTemplate {
34
+ createInstance(component) {
35
+ return new MyTemplateInstance(component)
36
+ }
37
+ }
38
+
39
+ class MyTemplateInstance {
40
+ constructor(component) {
41
+ this.shadowRoot = ShadowRoot.createShadowRoot(component)
42
+ }
43
+
44
+ initValues(data) {
45
+ // 组件被创建,初始数据是 data
46
+ }
47
+
48
+ updateValues(data, changes) {
49
+ // 组件更新,新的数据是 data ,变更内容描述在 changes 中
50
+ }
51
+ }
52
+
53
+ export const myComponent = componentSpace.defineComponent({
54
+ options: {
55
+ templateEngine: MyTemplateEngine,
56
+ },
57
+ template: {
58
+ // 这部分内容由 MyTemplateEngine 来处理
59
+ },
60
+ })
61
+ ```