airx 0.1.3 → 0.1.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.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # airx
1
+ # airx [![npm](https://img.shields.io/npm/v/airx.svg)](https://www.npmjs.com/package/airx) [![build status](https://github.com/airxjs/airx/actions/workflows/check.yml/badge.svg?branch=main)](https://github.com/airxjs/airx/actions/workflows/check.yml)
2
2
 
3
3
  Arix is a front-end framework based on JSX, but it doesn't have hooks like React.
4
4
 
package/output/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { AirxElement } from './element';
2
2
  export * from './types';
3
- export { createRef } from './reactive';
3
+ export { createRef, Ref } from './reactive';
4
4
  export { Fragment, createElement, AirxComponent, AirxElement, AirxChildren, AirxComponentContext } from './element';
5
- export { useContext, inject, provide, onMounted, onUnmounted } from './render';
5
+ export { inject, provide, onMounted, onUnmounted } from './render';
6
6
  export interface AirxApp {
7
7
  mount: (container: HTMLElement) => AirxApp;
8
8
  }
package/output/index.js CHANGED
@@ -2,7 +2,7 @@ import { render } from './render';
2
2
  export * from './types';
3
3
  export { createRef } from './reactive';
4
4
  export { Fragment, createElement } from './element';
5
- export { useContext, inject, provide, onMounted, onUnmounted } from './render';
5
+ export { inject, provide, onMounted, onUnmounted } from './render';
6
6
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
7
  export function createApp(element) {
8
8
  const app = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,cAAc,SAAS,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,OAAO,EACL,QAAQ,EACR,aAAa,EAKd,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,UAAU,EACV,MAAM,EACN,OAAO,EACP,SAAS,EACT,WAAW,EACZ,MAAM,UAAU,CAAA;AAOjB,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,MAAM,GAAG,GAAY;QACnB,yBAAyB;QACzB,yBAAyB;QACzB,eAAe;QACf,KAAK;QAEL,KAAK,EAAE,CAAC,SAAsB,EAAE,EAAE;YAChC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;YAC1B,OAAO,GAAG,CAAA;QACZ,CAAC;KACF,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,cAAc,SAAS,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAO,MAAM,YAAY,CAAA;AAE3C,OAAO,EACL,QAAQ,EACR,aAAa,EAKd,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,MAAM,EACN,OAAO,EACP,SAAS,EACT,WAAW,EACZ,MAAM,UAAU,CAAA;AAOjB,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,MAAM,GAAG,GAAY;QACnB,yBAAyB;QACzB,yBAAyB;QACzB,eAAe;QACf,KAAK;QAEL,KAAK,EAAE,CAAC,SAAsB,EAAE,EAAE;YAChC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;YAC1B,OAAO,GAAG,CAAA;QACZ,CAAC;KACF,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { AirxElement } from '../element';
2
+ import { Instance } from './common';
3
+ export declare function render(element: AirxElement, domRef: HTMLElement): Instance;
@@ -0,0 +1,272 @@
1
+ import { createLogger } from '../logger';
2
+ import { InnerAirxComponentContext, performUnitOfWork } from './common';
3
+ export function render(element, domRef) {
4
+ const rootInstance = {
5
+ domRef,
6
+ context: new InnerAirxComponentContext()
7
+ };
8
+ rootInstance.context.instance = rootInstance;
9
+ const context = {
10
+ rootInstance,
11
+ nextUnitOfWork: null,
12
+ needCommitDom: false
13
+ };
14
+ const appInstance = {
15
+ element,
16
+ parent: context.rootInstance,
17
+ memoProps: { ...element.props },
18
+ context: new InnerAirxComponentContext()
19
+ };
20
+ appInstance.context.instance = appInstance;
21
+ context.rootInstance.child = appInstance;
22
+ context.nextUnitOfWork = appInstance;
23
+ /**
24
+ * 提交 Dom 变化
25
+ */
26
+ function commitDom(rootInstance, rootNode) {
27
+ const logger = createLogger('commitDom');
28
+ logger.debug('commitDom', rootInstance);
29
+ function updateDomProperties(dom, nextProps, prevProps = {}) {
30
+ const isKey = (key) => key === 'key';
31
+ const isStyle = (key) => key === 'style';
32
+ const isClass = (key) => key === 'class';
33
+ const isEvent = (key) => key.startsWith("on");
34
+ const isChildren = (key) => key === 'children';
35
+ const isGone = (_prev, next) => (key) => !(key in next);
36
+ const isNew = (prev, next) => (key) => prev[key] !== next[key];
37
+ const isProperty = (key) => !isChildren(key) && !isEvent(key) && !isStyle(key) && !isClass(key) && !isKey(key);
38
+ // https://developer.mozilla.org/zh-CN/docs/Web/API/Node
39
+ if (dom.nodeName === '#text' || dom.nodeName === '#comment') {
40
+ const textNode = dom;
41
+ if (textNode.nodeValue !== nextProps.textContent) {
42
+ textNode.nodeValue = String(nextProps.textContent);
43
+ }
44
+ return;
45
+ }
46
+ // remove old style
47
+ const oldStyle = prevProps?.style;
48
+ if (typeof oldStyle === 'object' && oldStyle != null) {
49
+ Object.keys(oldStyle).forEach(key => {
50
+ /* eslint-disable @typescript-eslint/no-explicit-any */
51
+ delete dom.style[key];
52
+ /* eslint-enable @typescript-eslint/no-explicit-any */
53
+ });
54
+ }
55
+ // add new style
56
+ const newStyle = nextProps?.style;
57
+ if (typeof newStyle === 'object' && newStyle != null) {
58
+ Object.keys(newStyle).forEach((key) => {
59
+ /* eslint-disable @typescript-eslint/no-explicit-any */
60
+ const value = newStyle?.[key];
61
+ dom.style[key] = value == null ? '' : value;
62
+ /* eslint-enable @typescript-eslint/no-explicit-any */
63
+ });
64
+ }
65
+ if (dom.className !== nextProps?.class) {
66
+ if (!nextProps?.class) {
67
+ dom.removeAttribute('class');
68
+ }
69
+ else if (typeof nextProps?.class === 'string') {
70
+ dom.setAttribute('class', nextProps?.class);
71
+ }
72
+ }
73
+ //Remove old or changed event listeners
74
+ Object.keys(prevProps)
75
+ .filter(isEvent)
76
+ .filter(key => !(key in nextProps) ||
77
+ isNew(prevProps, nextProps)(key))
78
+ .forEach(name => {
79
+ const eventType = name
80
+ .toLowerCase()
81
+ .substring(2);
82
+ if (prevProps[name] == null)
83
+ return;
84
+ if (typeof prevProps[name] !== 'function') {
85
+ console.error('EventListener is not a function');
86
+ }
87
+ else {
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ dom.removeEventListener(eventType, prevProps[name]);
90
+ }
91
+ });
92
+ // Add event listeners
93
+ Object.keys(nextProps)
94
+ .filter(isEvent)
95
+ .filter(isNew(prevProps, nextProps))
96
+ .forEach(name => {
97
+ const eventType = name
98
+ .toLowerCase()
99
+ .substring(2);
100
+ if (nextProps[name] == null)
101
+ return;
102
+ if (typeof nextProps[name] !== 'function') {
103
+ console.error('EventListener is not a function');
104
+ }
105
+ else {
106
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
+ dom.addEventListener(eventType, nextProps[name]);
108
+ }
109
+ });
110
+ // Remove old properties
111
+ Object.keys(prevProps)
112
+ .filter(isProperty)
113
+ .filter(isGone(prevProps, nextProps))
114
+ .forEach(name => dom.setAttribute(name, ''));
115
+ // Set new or changed properties
116
+ Object.keys(nextProps)
117
+ .filter(isProperty)
118
+ .filter(isNew(prevProps, nextProps))
119
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
120
+ .forEach(name => dom.setAttribute(name, nextProps[name]));
121
+ }
122
+ function getParentDom(instance) {
123
+ if (instance.parent?.domRef != null) {
124
+ return instance.parent.domRef;
125
+ }
126
+ if (instance.parent) {
127
+ return getParentDom(instance.parent);
128
+ }
129
+ throw new Error('Cant find dom');
130
+ }
131
+ /**
132
+ * 查找 instance 下所有的一级 dom
133
+ * @param instance
134
+ * @returns
135
+ */
136
+ function getChildDoms(instance) {
137
+ const domList = [];
138
+ const todoList = [instance];
139
+ while (todoList.length > 0) {
140
+ const current = todoList.pop();
141
+ // 找到真实 dom 直接提交
142
+ if (current?.domRef != null) {
143
+ domList.push(current.domRef);
144
+ }
145
+ // 有子节点但是无真实 dom,向下继续查找
146
+ if (current?.domRef == null) {
147
+ if (current?.child != null) {
148
+ todoList.push(current.child);
149
+ }
150
+ }
151
+ // 可能有兄弟节点,则需要继续查找
152
+ if (current?.sibling != null) {
153
+ todoList.push(current.sibling);
154
+ }
155
+ }
156
+ return domList;
157
+ }
158
+ function commitInstanceDom(nextInstance, oldNode) {
159
+ // 移除标删元素
160
+ if (nextInstance.deletions) {
161
+ for (const deletion of nextInstance.deletions) {
162
+ const domList = getChildDoms(deletion);
163
+ for (let index = 0; index < domList.length; index++) {
164
+ const dom = domList[index];
165
+ if (dom && dom.parentNode)
166
+ dom.parentNode.removeChild(dom);
167
+ }
168
+ deletion.context.triggerUnmounted();
169
+ }
170
+ nextInstance.deletions.clear();
171
+ }
172
+ // 创建 dom
173
+ if (nextInstance.domRef == null) {
174
+ if (nextInstance.element == null)
175
+ throw new Error('???');
176
+ if (typeof nextInstance.element.type === 'string') {
177
+ if (nextInstance.element.type === 'text') {
178
+ const textContent = nextInstance.element.props.textContent;
179
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
+ nextInstance.domRef = document.createTextNode(textContent);
181
+ }
182
+ else if (nextInstance.element.type === 'comment') {
183
+ const textContent = nextInstance.element.props.textContent;
184
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
185
+ nextInstance.domRef = document.createComment(textContent);
186
+ }
187
+ else {
188
+ nextInstance.domRef = document.createElement(nextInstance.element.type);
189
+ }
190
+ }
191
+ }
192
+ // 更新属性
193
+ if (nextInstance.domRef != null && nextInstance.element != null) {
194
+ updateDomProperties(nextInstance.domRef, nextInstance.element.props, nextInstance.beforeElement?.props);
195
+ }
196
+ // 插入 parent
197
+ // TODO: 针对仅移动时优化
198
+ if (nextInstance.domRef != null) {
199
+ if (oldNode !== nextInstance.domRef) {
200
+ if (nextInstance.domRef.parentNode) {
201
+ nextInstance.domRef.parentNode.removeChild(nextInstance.domRef);
202
+ }
203
+ const parentDom = getParentDom(nextInstance);
204
+ parentDom.appendChild(nextInstance.domRef);
205
+ }
206
+ }
207
+ }
208
+ function commitWalkV2(initInstance, initNode) {
209
+ // 创建一个栈,将根节点压入栈中
210
+ const stack = [[initInstance, initNode]];
211
+ while (stack.length > 0) {
212
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
213
+ const stackLayer = stack.pop();
214
+ if (typeof stackLayer === 'function') {
215
+ stackLayer();
216
+ continue;
217
+ }
218
+ const [instance, node] = stackLayer;
219
+ commitInstanceDom(instance, node);
220
+ // stack 是先入后出
221
+ // 实际上是先渲染 child
222
+ // 这里然后再渲染 sibling
223
+ // 执行生命周期的 Mount
224
+ stack.push(() => instance.context.triggerMounted());
225
+ // 更新下一个兄弟节点
226
+ if (instance.sibling != null) {
227
+ const siblingNode = instance.domRef
228
+ ? instance.domRef.nextSibling
229
+ : node?.nextSibling;
230
+ stack.push([instance.sibling, siblingNode || undefined]);
231
+ }
232
+ // 更新下一个子节点
233
+ if (instance.child != null) {
234
+ const childNode = instance.domRef
235
+ ? instance.domRef.firstChild
236
+ : node;
237
+ stack.push([instance.child, childNode || undefined]);
238
+ }
239
+ }
240
+ }
241
+ commitWalkV2(rootInstance, rootNode);
242
+ }
243
+ function onUpdateRequire() {
244
+ if (context.nextUnitOfWork == null && context.rootInstance.child) {
245
+ context.nextUnitOfWork = context.rootInstance.child;
246
+ }
247
+ }
248
+ /**
249
+ * 调度
250
+ */
251
+ function workLoop(deadline) {
252
+ let shouldYield = false;
253
+ const logger = createLogger('workLoop');
254
+ while (context.nextUnitOfWork && !shouldYield) {
255
+ logger.debug('nextUnitOfWork', context.nextUnitOfWork);
256
+ context.nextUnitOfWork = performUnitOfWork(context.nextUnitOfWork, onUpdateRequire);
257
+ if (context.nextUnitOfWork == null)
258
+ context.needCommitDom = true;
259
+ if (deadline)
260
+ shouldYield = deadline.timeRemaining() < 1;
261
+ }
262
+ if (context.needCommitDom && context.rootInstance.child) {
263
+ commitDom(context.rootInstance.child, context.rootInstance.domRef?.firstChild || undefined);
264
+ context.needCommitDom = false;
265
+ }
266
+ requestIdleCallback(workLoop);
267
+ }
268
+ // 开始调度
269
+ requestIdleCallback(workLoop);
270
+ return context.rootInstance;
271
+ }
272
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../source/render/browser.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
- import { Ref } from './reactive';
2
- import { AirxElement, AirxComponentRender, AirxComponentContext, AirxComponentMountedListener, AirxComponentUnmountedListener } from './element';
3
- export declare function useContext(): AirxComponentContext;
1
+ import { Ref } from '../../reactive';
2
+ import { AirxComponentContext, AirxComponentMountedListener, AirxComponentRender, AirxComponentUnmountedListener, AirxElement } from '../../element';
4
3
  export declare const onMounted: AirxComponentContext['onMounted'];
5
4
  export declare const onUnmounted: AirxComponentContext['onUnmounted'];
6
5
  export declare const inject: AirxComponentContext['inject'];
7
6
  export declare const provide: AirxComponentContext['provide'];
8
7
  export type Disposer = () => void;
9
- declare class InnerAirxComponentContext implements AirxComponentContext {
8
+ export declare class InnerAirxComponentContext implements AirxComponentContext {
10
9
  instance?: Instance;
11
10
  private disposers;
12
11
  private providedMap;
@@ -35,7 +34,7 @@ declare class InnerAirxComponentContext implements AirxComponentContext {
35
34
  * ↓ | |
36
35
  * instance -sibling→ instance...
37
36
  */
38
- interface Instance {
37
+ export interface Instance {
39
38
  domRef?: HTMLElement;
40
39
  child?: Instance;
41
40
  parent?: Instance;
@@ -48,5 +47,17 @@ interface Instance {
48
47
  requiredUpdate?: boolean;
49
48
  context: InnerAirxComponentContext;
50
49
  }
51
- export declare function render(element: AirxElement, domRef: HTMLElement): Instance;
50
+ /**
51
+ * 更新 children
52
+ * @param parentInstance 当前正在处理的组件的实例
53
+ * @param children 当前组件的子节点
54
+ */
55
+ export declare function reconcileChildren(parentInstance: Instance, childrenElementArray: AirxElement[]): void;
56
+ type OnUpdateRequire = (instance: Instance) => void;
57
+ /**
58
+ * 处理单个 instance
59
+ * @param instance 当前处理的实例
60
+ * @returns 返回下一个需要处理的 instance
61
+ */
62
+ export declare function performUnitOfWork(instance: Instance, onUpdateRequire?: OnUpdateRequire): Instance | null;
52
63
  export {};