airx 0.1.3 → 0.1.5

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
 
@@ -32,7 +32,7 @@ export declare function Fragment(props: {
32
32
  children: AirxElement;
33
33
  }): () => AirxElement<any>;
34
34
  export type AirxComponentUnmountedListener = () => void;
35
- export type AirxComponentMountedListener = () => () => void | void;
35
+ export type AirxComponentMountedListener = () => (() => void) | void;
36
36
  export interface AirxComponentLifecycle {
37
37
  onMounted: (listener: AirxComponentMountedListener) => void;
38
38
  onUnmounted: (listener: AirxComponentUnmountedListener) => void;
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, watch } 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
@@ -1,8 +1,8 @@
1
1
  import { render } from './render';
2
2
  export * from './types';
3
- export { createRef } from './reactive';
3
+ export { createRef, watch } 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,KAAK,EAAE,MAAM,YAAY,CAAA;AAElD,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,273 @@
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 isRef = (key) => key === 'ref';
32
+ const isStyle = (key) => key === 'style';
33
+ const isClass = (key) => key === 'class';
34
+ const isEvent = (key) => key.startsWith("on");
35
+ const isChildren = (key) => key === 'children';
36
+ const isGone = (_prev, next) => (key) => !(key in next);
37
+ const isNew = (prev, next) => (key) => prev[key] !== next[key];
38
+ const isProperty = (key) => !isChildren(key) && !isEvent(key) && !isStyle(key) && !isClass(key) && !isKey(key) && !isRef(key);
39
+ // https://developer.mozilla.org/zh-CN/docs/Web/API/Node
40
+ if (dom.nodeName === '#text' || dom.nodeName === '#comment') {
41
+ const textNode = dom;
42
+ if (textNode.nodeValue !== nextProps.textContent) {
43
+ textNode.nodeValue = String(nextProps.textContent);
44
+ }
45
+ return;
46
+ }
47
+ // remove old style
48
+ const oldStyle = prevProps?.style;
49
+ if (typeof oldStyle === 'object' && oldStyle != null) {
50
+ Object.keys(oldStyle).forEach(key => {
51
+ /* eslint-disable @typescript-eslint/no-explicit-any */
52
+ delete dom.style[key];
53
+ /* eslint-enable @typescript-eslint/no-explicit-any */
54
+ });
55
+ }
56
+ // add new style
57
+ const newStyle = nextProps?.style;
58
+ if (typeof newStyle === 'object' && newStyle != null) {
59
+ Object.keys(newStyle).forEach((key) => {
60
+ /* eslint-disable @typescript-eslint/no-explicit-any */
61
+ const value = newStyle?.[key];
62
+ dom.style[key] = value == null ? '' : value;
63
+ /* eslint-enable @typescript-eslint/no-explicit-any */
64
+ });
65
+ }
66
+ if (dom.className !== nextProps?.class) {
67
+ if (!nextProps?.class) {
68
+ dom.removeAttribute('class');
69
+ }
70
+ else if (typeof nextProps?.class === 'string') {
71
+ dom.setAttribute('class', nextProps?.class);
72
+ }
73
+ }
74
+ //Remove old or changed event listeners
75
+ Object.keys(prevProps)
76
+ .filter(isEvent)
77
+ .filter(key => !(key in nextProps) ||
78
+ isNew(prevProps, nextProps)(key))
79
+ .forEach(name => {
80
+ const eventType = name
81
+ .toLowerCase()
82
+ .substring(2);
83
+ if (prevProps[name] == null)
84
+ return;
85
+ if (typeof prevProps[name] !== 'function') {
86
+ console.error('EventListener is not a function');
87
+ }
88
+ else {
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ dom.removeEventListener(eventType, prevProps[name]);
91
+ }
92
+ });
93
+ // Add event listeners
94
+ Object.keys(nextProps)
95
+ .filter(isEvent)
96
+ .filter(isNew(prevProps, nextProps))
97
+ .forEach(name => {
98
+ const eventType = name
99
+ .toLowerCase()
100
+ .substring(2);
101
+ if (nextProps[name] == null)
102
+ return;
103
+ if (typeof nextProps[name] !== 'function') {
104
+ console.error('EventListener is not a function');
105
+ }
106
+ else {
107
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
108
+ dom.addEventListener(eventType, nextProps[name]);
109
+ }
110
+ });
111
+ // Remove old properties
112
+ Object.keys(prevProps)
113
+ .filter(isProperty)
114
+ .filter(isGone(prevProps, nextProps))
115
+ .forEach(name => dom.setAttribute(name, ''));
116
+ // Set new or changed properties
117
+ Object.keys(nextProps)
118
+ .filter(isProperty)
119
+ .filter(isNew(prevProps, nextProps))
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ .forEach(name => dom.setAttribute(name, nextProps[name]));
122
+ }
123
+ function getParentDom(instance) {
124
+ if (instance.parent?.domRef != null) {
125
+ return instance.parent.domRef;
126
+ }
127
+ if (instance.parent) {
128
+ return getParentDom(instance.parent);
129
+ }
130
+ throw new Error('Cant find dom');
131
+ }
132
+ /**
133
+ * 查找 instance 下所有的一级 dom
134
+ * @param instance
135
+ * @returns
136
+ */
137
+ function getChildDoms(instance) {
138
+ const domList = [];
139
+ const todoList = [instance];
140
+ while (todoList.length > 0) {
141
+ const current = todoList.pop();
142
+ // 找到真实 dom 直接提交
143
+ if (current?.domRef != null) {
144
+ domList.push(current.domRef);
145
+ }
146
+ // 有子节点但是无真实 dom,向下继续查找
147
+ if (current?.domRef == null) {
148
+ if (current?.child != null) {
149
+ todoList.push(current.child);
150
+ }
151
+ }
152
+ // 可能有兄弟节点,则需要继续查找
153
+ if (current?.sibling != null) {
154
+ todoList.push(current.sibling);
155
+ }
156
+ }
157
+ return domList;
158
+ }
159
+ function commitInstanceDom(nextInstance, oldNode) {
160
+ // 移除标删元素
161
+ if (nextInstance.deletions) {
162
+ for (const deletion of nextInstance.deletions) {
163
+ const domList = getChildDoms(deletion);
164
+ for (let index = 0; index < domList.length; index++) {
165
+ const dom = domList[index];
166
+ if (dom && dom.parentNode)
167
+ dom.parentNode.removeChild(dom);
168
+ }
169
+ deletion.context.triggerUnmounted();
170
+ }
171
+ nextInstance.deletions.clear();
172
+ }
173
+ // 创建 dom
174
+ if (nextInstance.domRef == null) {
175
+ if (nextInstance.element == null)
176
+ throw new Error('???');
177
+ if (typeof nextInstance.element.type === 'string') {
178
+ if (nextInstance.element.type === 'text') {
179
+ const textContent = nextInstance.element.props.textContent;
180
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
181
+ nextInstance.domRef = document.createTextNode(textContent);
182
+ }
183
+ else if (nextInstance.element.type === 'comment') {
184
+ const textContent = nextInstance.element.props.textContent;
185
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
186
+ nextInstance.domRef = document.createComment(textContent);
187
+ }
188
+ else {
189
+ nextInstance.domRef = document.createElement(nextInstance.element.type);
190
+ }
191
+ }
192
+ }
193
+ // 更新属性
194
+ if (nextInstance.domRef != null && nextInstance.element != null) {
195
+ updateDomProperties(nextInstance.domRef, nextInstance.element.props, nextInstance.beforeElement?.props);
196
+ }
197
+ // 插入 parent
198
+ // TODO: 针对仅移动时优化
199
+ if (nextInstance.domRef != null) {
200
+ if (oldNode !== nextInstance.domRef) {
201
+ if (nextInstance.domRef.parentNode) {
202
+ nextInstance.domRef.parentNode.removeChild(nextInstance.domRef);
203
+ }
204
+ const parentDom = getParentDom(nextInstance);
205
+ parentDom.appendChild(nextInstance.domRef);
206
+ }
207
+ }
208
+ }
209
+ function commitWalkV2(initInstance, initNode) {
210
+ // 创建一个栈,将根节点压入栈中
211
+ const stack = [[initInstance, initNode]];
212
+ while (stack.length > 0) {
213
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
214
+ const stackLayer = stack.pop();
215
+ if (typeof stackLayer === 'function') {
216
+ stackLayer();
217
+ continue;
218
+ }
219
+ const [instance, node] = stackLayer;
220
+ commitInstanceDom(instance, node);
221
+ // stack 是先入后出
222
+ // 实际上是先渲染 child
223
+ // 这里然后再渲染 sibling
224
+ // 执行生命周期的 Mount
225
+ stack.push(() => instance.context.triggerMounted());
226
+ // 更新下一个兄弟节点
227
+ if (instance.sibling != null) {
228
+ const siblingNode = instance.domRef
229
+ ? instance.domRef.nextSibling
230
+ : node?.nextSibling;
231
+ stack.push([instance.sibling, siblingNode || undefined]);
232
+ }
233
+ // 更新下一个子节点
234
+ if (instance.child != null) {
235
+ const childNode = instance.domRef
236
+ ? instance.domRef.firstChild
237
+ : node;
238
+ stack.push([instance.child, childNode || undefined]);
239
+ }
240
+ }
241
+ }
242
+ commitWalkV2(rootInstance, rootNode);
243
+ }
244
+ function onUpdateRequire() {
245
+ if (context.nextUnitOfWork == null && context.rootInstance.child) {
246
+ context.nextUnitOfWork = context.rootInstance.child;
247
+ }
248
+ }
249
+ /**
250
+ * 调度
251
+ */
252
+ function workLoop(deadline) {
253
+ let shouldYield = false;
254
+ const logger = createLogger('workLoop');
255
+ while (context.nextUnitOfWork && !shouldYield) {
256
+ logger.debug('nextUnitOfWork', context.nextUnitOfWork);
257
+ context.nextUnitOfWork = performUnitOfWork(context.nextUnitOfWork, onUpdateRequire);
258
+ if (context.nextUnitOfWork == null)
259
+ context.needCommitDom = true;
260
+ if (deadline)
261
+ shouldYield = deadline.timeRemaining() < 1;
262
+ }
263
+ if (context.needCommitDom && context.rootInstance.child) {
264
+ commitDom(context.rootInstance.child, context.rootInstance.domRef?.firstChild || undefined);
265
+ context.needCommitDom = false;
266
+ }
267
+ requestIdleCallback(workLoop);
268
+ }
269
+ // 开始调度
270
+ requestIdleCallback(workLoop);
271
+ return context.rootInstance;
272
+ }
273
+ //# 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 {};