@lynx-js/react 0.105.2 → 0.106.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.
- package/CHANGELOG.md +22 -0
- package/package.json +2 -2
- package/refresh/.turbo/turbo-build.log +1 -1
- package/runtime/lib/lifecycle/destroy.js +2 -2
- package/runtime/lib/lifecycle/destroy.js.map +1 -1
- package/runtime/lib/lifecycle/patch/commit.d.ts +7 -3
- package/runtime/lib/lifecycle/patch/commit.js +59 -27
- package/runtime/lib/lifecycle/patch/commit.js.map +1 -1
- package/runtime/lib/lifecycle/patch/updateMainThread.js +14 -13
- package/runtime/lib/lifecycle/patch/updateMainThread.js.map +1 -1
- package/runtime/lib/lifecycle/reload.js +2 -3
- package/runtime/lib/lifecycle/reload.js.map +1 -1
- package/runtime/lib/lifecycle/render.d.ts +3 -1
- package/runtime/lib/lifecycle/render.js +9 -2
- package/runtime/lib/lifecycle/render.js.map +1 -1
- package/runtime/lib/list.d.ts +3 -0
- package/runtime/lib/list.js +10 -2
- package/runtime/lib/list.js.map +1 -1
- package/runtime/lib/lynx/calledByNative.js +40 -5
- package/runtime/lib/lynx/calledByNative.js.map +1 -1
- package/runtime/lib/lynx/tt.js +4 -4
- package/runtime/lib/lynx/tt.js.map +1 -1
- package/runtime/lib/lynx-api.js +2 -2
- package/runtime/lib/lynx-api.js.map +1 -1
- package/runtime/lib/opcodes.d.ts +6 -0
- package/runtime/lib/opcodes.js +70 -0
- package/runtime/lib/opcodes.js.map +1 -1
- package/runtime/lib/root.d.ts +1 -0
- package/runtime/lib/root.js.map +1 -1
- package/runtime/src/lifecycle/destroy.ts +2 -3
- package/runtime/src/lifecycle/patch/commit.ts +78 -31
- package/runtime/src/lifecycle/patch/updateMainThread.ts +18 -16
- package/runtime/src/lifecycle/reload.ts +2 -4
- package/runtime/src/lifecycle/render.ts +11 -2
- package/runtime/src/list.ts +11 -2
- package/runtime/src/lynx/calledByNative.ts +47 -4
- package/runtime/src/lynx/tt.ts +4 -4
- package/runtime/src/lynx-api.ts +2 -2
- package/runtime/src/opcodes.ts +90 -0
- package/runtime/src/root.ts +1 -1
- package/types/react.docs.d.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tt.js","sourceRoot":"","sources":["../../src/lynx/tt.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tt.js","sourceRoot":"","sources":["../../src/lynx/tt.ts"],"names":[],"mappings":"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"}
|
package/runtime/lib/lynx-api.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Copyright 2024 The Lynx Authors. All rights reserved.
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
|
-
import { render } from 'preact';
|
|
5
4
|
import { createContext, createElement } from 'preact/compat';
|
|
6
5
|
import { useState } from 'preact/hooks';
|
|
7
6
|
import { factory, withInitDataInState } from './compat/initData.js';
|
|
8
7
|
import { useLynxGlobalEventListener } from './hooks/useLynxGlobalEventListener.js';
|
|
8
|
+
import { renderBackground } from './lifecycle/render.js';
|
|
9
9
|
import { LifecycleConstant } from './lifecycleConstant.js';
|
|
10
10
|
import { flushDelayedLifecycleEvents } from './lynx/tt.js';
|
|
11
11
|
import { __root } from './root.js';
|
|
@@ -25,7 +25,7 @@ export const root = {
|
|
|
25
25
|
}
|
|
26
26
|
else {
|
|
27
27
|
__root.__jsx = jsx;
|
|
28
|
-
|
|
28
|
+
renderBackground(jsx, __root);
|
|
29
29
|
if (__FIRST_SCREEN_SYNC_TIMING__ === 'immediately') { }
|
|
30
30
|
else {
|
|
31
31
|
lynx.getNativeApp().callLepusMethod(LifecycleConstant.jsReady, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lynx-api.js","sourceRoot":"","sources":["../src/lynx-api.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"lynx-api.js","sourceRoot":"","sources":["../src/lynx-api.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AA6DnC;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,IAAI,GAAS;IACxB,MAAM,EAAE,CAAC,GAAc,EAAQ,EAAE;QAC/B,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;YACnB,gBAAgB,CAAC,GAAG,EAAE,MAAa,CAAC,CAAC;YACrC,IAAI,4BAA4B,KAAK,aAAa,EAAE,CAAC,CAAA,CAAC;iBACjD,CAAC;gBACJ,IAAI,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,2BAA2B,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IACD,sBAAsB,EAAE,CAAC,uBAAgD,EAAQ,EAAE;QACjF,IAAI,CAAC,sBAAsB,CAAC,uBAAuB,CAAC,CAAC;IACvD,CAAC;CACF,CAAC;AAEF,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,CACvC;IACE,aAAa;IACb,QAAQ;IACR,aAAa;IACb,0BAA0B;CACpB,EACR,YAAY,EACZ,eAAe,CAChB,CAAC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA6C,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;AAC/G;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAuB,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;AACzF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,WAAW,GAAmB,eAAe,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;AAC3E;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAiD,eAAe,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;AAsCvH,OAAO,EAAE,mBAAmB,EAAE,CAAC;AA6J/B,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC"}
|
package/runtime/lib/opcodes.d.ts
CHANGED
|
@@ -1,2 +1,8 @@
|
|
|
1
1
|
import { SnapshotInstance } from './snapshot.js';
|
|
2
|
+
interface SSRFiberElement {
|
|
3
|
+
ssrID: string;
|
|
4
|
+
}
|
|
5
|
+
export type SSRSnapshotInstance = [string, number, SSRFiberElement[]];
|
|
6
|
+
export declare function ssrHydrateByOpcodes(opcodes: any[], into: SnapshotInstance, refMap?: Record<string, FiberElement>): void;
|
|
2
7
|
export declare function renderOpcodesInto(opcodes: any[], into: SnapshotInstance): void;
|
|
8
|
+
export {};
|
package/runtime/lib/opcodes.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Copyright 2024 The Lynx Authors. All rights reserved.
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
import { componentAtIndexFactory, enqueueComponentFactory, gRecycleMap, gSignMap } from './list.js';
|
|
4
5
|
import { CHILDREN } from './renderToOpcodes/constants.js';
|
|
5
6
|
import { SnapshotInstance } from './snapshot.js';
|
|
6
7
|
var Opcode;
|
|
@@ -10,6 +11,70 @@ var Opcode;
|
|
|
10
11
|
Opcode[Opcode["Attr"] = 2] = "Attr";
|
|
11
12
|
Opcode[Opcode["Text"] = 3] = "Text";
|
|
12
13
|
})(Opcode || (Opcode = {}));
|
|
14
|
+
export function ssrHydrateByOpcodes(opcodes, into, refMap) {
|
|
15
|
+
let top = into;
|
|
16
|
+
const stack = [into];
|
|
17
|
+
for (let i = 0; i < opcodes.length;) {
|
|
18
|
+
const opcode = opcodes[i];
|
|
19
|
+
switch (opcode) {
|
|
20
|
+
case Opcode.Begin: {
|
|
21
|
+
const p = top;
|
|
22
|
+
const [type, __id, elements] = opcodes[i + 1];
|
|
23
|
+
top = new SnapshotInstance(type, __id);
|
|
24
|
+
top.__pendingElements = elements;
|
|
25
|
+
p.insertBefore(top);
|
|
26
|
+
stack.push(top);
|
|
27
|
+
i += 2;
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
case Opcode.End: {
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
top[CHILDREN] = undefined;
|
|
33
|
+
top.__elements = top.__pendingElements.map(({ ssrID }) => refMap[ssrID]);
|
|
34
|
+
top.__element_root = top.__elements[0];
|
|
35
|
+
delete top.__pendingElements;
|
|
36
|
+
if (top.__snapshot_def.isListHolder) {
|
|
37
|
+
const listElement = top.__element_root;
|
|
38
|
+
const listElementUniqueID = __GetElementUniqueID(listElement);
|
|
39
|
+
const signMap = gSignMap[listElementUniqueID] = new Map();
|
|
40
|
+
gRecycleMap[listElementUniqueID] = new Map();
|
|
41
|
+
const enqueueFunc = enqueueComponentFactory();
|
|
42
|
+
const componentAtIndex = componentAtIndexFactory(top.childNodes);
|
|
43
|
+
for (const child of top.childNodes) {
|
|
44
|
+
if (child.__element_root) {
|
|
45
|
+
const childElementUniqueID = __GetElementUniqueID(child.__element_root);
|
|
46
|
+
signMap.set(childElementUniqueID, child);
|
|
47
|
+
enqueueFunc(listElement, listElementUniqueID, childElementUniqueID);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
__UpdateListCallbacks(listElement, componentAtIndex, enqueueFunc);
|
|
51
|
+
}
|
|
52
|
+
stack.pop();
|
|
53
|
+
const p = stack[stack.length - 1];
|
|
54
|
+
top = p;
|
|
55
|
+
i += 1;
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case Opcode.Attr: {
|
|
59
|
+
const key = opcodes[i + 1];
|
|
60
|
+
const value = opcodes[i + 2];
|
|
61
|
+
top.setAttribute(key, value);
|
|
62
|
+
i += 3;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case Opcode.Text: {
|
|
66
|
+
const [[type, __id, elements], text] = opcodes[i + 1];
|
|
67
|
+
const s = new SnapshotInstance(type, __id);
|
|
68
|
+
s.setAttribute(0, text);
|
|
69
|
+
top.insertBefore(s);
|
|
70
|
+
s.__elements = elements.map(({ ssrID }) => refMap[ssrID]);
|
|
71
|
+
s.__element_root = s.__elements[0];
|
|
72
|
+
i += 2;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
13
78
|
export function renderOpcodesInto(opcodes, into) {
|
|
14
79
|
let top = into;
|
|
15
80
|
const stack = [into];
|
|
@@ -23,6 +88,7 @@ export function renderOpcodesInto(opcodes, into) {
|
|
|
23
88
|
if (top.__parent) {
|
|
24
89
|
// already inserted
|
|
25
90
|
top = new SnapshotInstance(top.type);
|
|
91
|
+
opcodes[i + 1] = top;
|
|
26
92
|
}
|
|
27
93
|
p.insertBefore(top);
|
|
28
94
|
stack.push(top);
|
|
@@ -48,6 +114,10 @@ export function renderOpcodesInto(opcodes, into) {
|
|
|
48
114
|
case Opcode.Text: {
|
|
49
115
|
const text = opcodes[i + 1];
|
|
50
116
|
const s = new SnapshotInstance(null);
|
|
117
|
+
if (__ENABLE_SSR__) {
|
|
118
|
+
// We need store the just created SnapshotInstance, or it will be lost when we leave the function
|
|
119
|
+
opcodes[i + 1] = [s, text];
|
|
120
|
+
}
|
|
51
121
|
s.setAttribute(0, text);
|
|
52
122
|
top.insertBefore(s);
|
|
53
123
|
i += 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opcodes.js","sourceRoot":"","sources":["../src/opcodes.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,IAAW,MAKV;AALD,WAAW,MAAM;IACf,qCAAS,CAAA;IACT,iCAAG,CAAA;IACH,mCAAI,CAAA;IACJ,mCAAI,CAAA;AACN,CAAC,EALU,MAAM,KAAN,MAAM,QAKhB;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAc,EAAE,IAAsB;IACtE,IAAI,GAAG,GAAqB,IAAI,CAAC;IACjC,MAAM,KAAK,GAAuB,CAAC,IAAI,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAClB,MAAM,CAAC,GAAG,GAAG,CAAC;gBACd,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrB,aAAa;gBACb,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACjB,mBAAmB;oBACnB,GAAG,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"opcodes.js","sourceRoot":"","sources":["../src/opcodes.ts"],"names":[],"mappings":"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"}
|
package/runtime/lib/root.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { BackgroundSnapshotInstance } from './backgroundSnapshot.js';
|
|
|
2
2
|
import { SnapshotInstance } from './snapshot.js';
|
|
3
3
|
declare let __root: (SnapshotInstance | BackgroundSnapshotInstance) & {
|
|
4
4
|
__jsx?: React.ReactNode;
|
|
5
|
+
__opcodes?: any[];
|
|
5
6
|
};
|
|
6
7
|
declare function setRoot(root: typeof __root): void;
|
|
7
8
|
export { __root, setRoot };
|
package/runtime/lib/root.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,IAAI,
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,IAAI,MAAwG,CAAC;AAE7G,SAAS,OAAO,CAAC,IAAmB;IAClC,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED,IAAI,SAAS,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;AACxC,CAAC;KAAM,IAAI,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,IAAI,0BAA0B,CAAC,MAAM,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC"}
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
// Copyright 2024 The Lynx Authors. All rights reserved.
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
|
-
import { render } from 'preact';
|
|
5
|
-
|
|
6
4
|
import { __root } from '../root.js';
|
|
7
5
|
import { globalCommitTaskMap } from './patch/commit.js';
|
|
6
|
+
import { renderBackground } from './render.js';
|
|
8
7
|
|
|
9
8
|
function destroyBackground(): void {
|
|
10
9
|
if (__PROFILE__) {
|
|
11
10
|
console.profile('destroyBackground');
|
|
12
11
|
}
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
renderBackground(null, __root as any);
|
|
15
14
|
|
|
16
15
|
globalCommitTaskMap.forEach(task => {
|
|
17
16
|
task();
|
|
@@ -30,35 +30,56 @@ let nextCommitTaskId = 1;
|
|
|
30
30
|
|
|
31
31
|
let globalBackgroundSnapshotInstancesToRemove: number[] = [];
|
|
32
32
|
|
|
33
|
+
let patchesToCommit: Patch[] = [];
|
|
34
|
+
|
|
33
35
|
interface Patch {
|
|
36
|
+
id: number;
|
|
34
37
|
snapshotPatch?: SnapshotPatch;
|
|
35
38
|
workletRefInitValuePatch?: [id: number, value: unknown][];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface PatchList {
|
|
42
|
+
patchList: Patch[];
|
|
36
43
|
flushOptions?: FlushOptions;
|
|
37
44
|
}
|
|
38
45
|
|
|
39
46
|
interface PatchOptions {
|
|
40
|
-
commitTaskId: number;
|
|
41
47
|
pipelineOptions?: PipelineOptions;
|
|
42
|
-
reloadVersion
|
|
48
|
+
reloadVersion: number;
|
|
43
49
|
isHydration?: boolean;
|
|
44
50
|
}
|
|
45
51
|
|
|
46
52
|
function replaceCommitHook(): void {
|
|
53
|
+
// use our own `options.debounceRendering` to insert a timing flag before render
|
|
54
|
+
type DebounceRendering = (f: () => void) => void;
|
|
55
|
+
const injectDebounceRendering = (debounceRendering: DebounceRendering): DebounceRendering => {
|
|
56
|
+
return (f: () => void) => {
|
|
57
|
+
debounceRendering(() => {
|
|
58
|
+
f();
|
|
59
|
+
void commitToMainThread();
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
const defaultDebounceRendering = options.debounceRendering?.bind(options)
|
|
64
|
+
?? (Promise.prototype.then.bind(Promise.resolve()) as DebounceRendering);
|
|
65
|
+
let _debounceRendering = injectDebounceRendering(defaultDebounceRendering);
|
|
66
|
+
Object.defineProperty(options, 'debounceRendering', {
|
|
67
|
+
get() {
|
|
68
|
+
return _debounceRendering;
|
|
69
|
+
},
|
|
70
|
+
set(debounceRendering: DebounceRendering) {
|
|
71
|
+
_debounceRendering = injectDebounceRendering(debounceRendering);
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
|
|
47
75
|
const oldCommit = options[COMMIT];
|
|
48
|
-
|
|
76
|
+
const commit = async (vnode: VNode, commitQueue: any[]) => {
|
|
49
77
|
if (__LEPUS__) {
|
|
50
78
|
// for testing only
|
|
51
79
|
commitQueue.length = 0;
|
|
52
80
|
return;
|
|
53
81
|
}
|
|
54
|
-
|
|
55
|
-
markTimingLegacy(PerformanceTimingKeys.update_diff_vdom_end);
|
|
56
|
-
markTiming(PerformanceTimingKeys.diff_vdom_end);
|
|
57
|
-
markTiming(PerformanceTimingKeys.pack_changes_start);
|
|
58
|
-
if (__PROFILE__) {
|
|
59
|
-
console.profile('commitChanges');
|
|
60
|
-
}
|
|
61
|
-
const renderCallbacks = commitQueue.map(component => {
|
|
82
|
+
const renderCallbacks = commitQueue.map((component: Component<any>) => {
|
|
62
83
|
const ret = {
|
|
63
84
|
component,
|
|
64
85
|
[RENDER_CALLBACKS]: component[RENDER_CALLBACKS],
|
|
@@ -84,7 +105,7 @@ function replaceCommitHook(): void {
|
|
|
84
105
|
cb.call(wrapper.component);
|
|
85
106
|
});
|
|
86
107
|
} catch (e) {
|
|
87
|
-
options[CATCH_ERROR](e, wrapper[VNODE]);
|
|
108
|
+
options[CATCH_ERROR](e, wrapper[VNODE]!);
|
|
88
109
|
}
|
|
89
110
|
});
|
|
90
111
|
if (backgroundSnapshotInstancesToRemove.length) {
|
|
@@ -97,50 +118,75 @@ function replaceCommitHook(): void {
|
|
|
97
118
|
});
|
|
98
119
|
|
|
99
120
|
const snapshotPatch = takeGlobalSnapshotPatch();
|
|
100
|
-
const flushOptions = globalFlushOptions;
|
|
101
121
|
const workletRefInitValuePatch = takeWorkletRefInitValuePatch();
|
|
102
|
-
globalFlushOptions = {};
|
|
103
122
|
if (!snapshotPatch && workletRefInitValuePatch.length === 0) {
|
|
104
123
|
// before hydration, skip patch
|
|
105
|
-
if (__PROFILE__) {
|
|
106
|
-
console.profileEnd();
|
|
107
|
-
}
|
|
108
124
|
return;
|
|
109
125
|
}
|
|
110
126
|
|
|
111
|
-
const patch: Patch = {
|
|
127
|
+
const patch: Patch = {
|
|
128
|
+
id: commitTaskId,
|
|
129
|
+
};
|
|
112
130
|
// TODO: check all fields in `flushOptions` from runtime3
|
|
113
131
|
if (snapshotPatch?.length) {
|
|
114
132
|
patch.snapshotPatch = snapshotPatch;
|
|
115
133
|
}
|
|
116
|
-
if (!isEmptyObject(flushOptions)) {
|
|
117
|
-
patch.flushOptions = flushOptions;
|
|
118
|
-
}
|
|
119
134
|
if (workletRefInitValuePatch.length) {
|
|
120
135
|
patch.workletRefInitValuePatch = workletRefInitValuePatch;
|
|
121
136
|
}
|
|
122
|
-
await commitPatchUpdate(patch, { commitTaskId });
|
|
123
137
|
|
|
124
|
-
|
|
138
|
+
patchesToCommit.push(patch);
|
|
139
|
+
};
|
|
140
|
+
options[COMMIT] = commit as ((...args: Parameters<typeof commit>) => void);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function commitToMainThread(): Promise<void> {
|
|
144
|
+
if (patchesToCommit.length === 0) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
markTimingLegacy(PerformanceTimingKeys.update_diff_vdom_end);
|
|
149
|
+
markTiming(PerformanceTimingKeys.diff_vdom_end);
|
|
150
|
+
|
|
151
|
+
const flushOptions = globalFlushOptions;
|
|
152
|
+
globalFlushOptions = {};
|
|
153
|
+
|
|
154
|
+
const patchList: PatchList = {
|
|
155
|
+
patchList: patchesToCommit,
|
|
156
|
+
};
|
|
157
|
+
patchesToCommit = [];
|
|
158
|
+
|
|
159
|
+
if (!isEmptyObject(flushOptions)) {
|
|
160
|
+
patchList.flushOptions = flushOptions;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
await commitPatchUpdate(patchList, {});
|
|
164
|
+
|
|
165
|
+
for (const patch of patchList.patchList) {
|
|
166
|
+
const commitTask = globalCommitTaskMap.get(patch.id);
|
|
125
167
|
if (commitTask) {
|
|
126
168
|
commitTask();
|
|
127
|
-
globalCommitTaskMap.delete(
|
|
169
|
+
globalCommitTaskMap.delete(patch.id);
|
|
128
170
|
}
|
|
129
|
-
}
|
|
171
|
+
}
|
|
130
172
|
}
|
|
131
173
|
|
|
132
|
-
function commitPatchUpdate(
|
|
174
|
+
function commitPatchUpdate(patchList: PatchList, patchOptions: Omit<PatchOptions, 'reloadVersion'>): Promise<void> {
|
|
133
175
|
return new Promise(resolve => {
|
|
134
176
|
// console.debug('********** JS update:');
|
|
135
177
|
// printSnapshotInstance(
|
|
136
178
|
// (backgroundSnapshotInstanceManager.values.get(1) || backgroundSnapshotInstanceManager.values.get(-1))!,
|
|
137
179
|
// );
|
|
138
|
-
// console.debug('commitPatchUpdate: ', JSON.stringify(
|
|
180
|
+
// console.debug('commitPatchUpdate: ', JSON.stringify(patchList));
|
|
181
|
+
if (__PROFILE__) {
|
|
182
|
+
console.profile('commitChanges');
|
|
183
|
+
}
|
|
184
|
+
markTiming(PerformanceTimingKeys.pack_changes_start);
|
|
139
185
|
const obj: {
|
|
140
186
|
data: string;
|
|
141
187
|
patchOptions: PatchOptions;
|
|
142
188
|
} = {
|
|
143
|
-
data: JSON.stringify(
|
|
189
|
+
data: JSON.stringify(patchList),
|
|
144
190
|
patchOptions: {
|
|
145
191
|
...patchOptions,
|
|
146
192
|
reloadVersion: getReloadVersion(),
|
|
@@ -151,10 +197,10 @@ function commitPatchUpdate(data: Patch, patchOptions: PatchOptions): Promise<voi
|
|
|
151
197
|
obj.patchOptions.pipelineOptions = globalPipelineOptions;
|
|
152
198
|
setPipeline(undefined);
|
|
153
199
|
}
|
|
200
|
+
lynx.getNativeApp().callLepusMethod(LifecycleConstant.patchUpdate, obj, resolve);
|
|
154
201
|
if (__PROFILE__) {
|
|
155
202
|
console.profileEnd();
|
|
156
203
|
}
|
|
157
|
-
lynx.getNativeApp().callLepusMethod(LifecycleConstant.patchUpdate, obj, resolve);
|
|
158
204
|
});
|
|
159
205
|
}
|
|
160
206
|
|
|
@@ -166,7 +212,7 @@ function replaceRequestAnimationFrame(): void {
|
|
|
166
212
|
// to make afterPaintEffects run faster
|
|
167
213
|
const resolvedPromise = Promise.resolve();
|
|
168
214
|
options.requestAnimationFrame = (cb: () => void) => {
|
|
169
|
-
resolvedPromise.then(cb);
|
|
215
|
+
void resolvedPromise.then(cb);
|
|
170
216
|
};
|
|
171
217
|
}
|
|
172
218
|
|
|
@@ -175,6 +221,7 @@ function replaceRequestAnimationFrame(): void {
|
|
|
175
221
|
*/
|
|
176
222
|
export {
|
|
177
223
|
commitPatchUpdate,
|
|
224
|
+
commitToMainThread,
|
|
178
225
|
genCommitTaskId,
|
|
179
226
|
globalBackgroundSnapshotInstancesToRemove,
|
|
180
227
|
globalCommitTaskMap,
|
|
@@ -183,5 +230,5 @@ export {
|
|
|
183
230
|
replaceCommitHook,
|
|
184
231
|
replaceRequestAnimationFrame,
|
|
185
232
|
type PatchOptions,
|
|
186
|
-
type
|
|
233
|
+
type PatchList,
|
|
187
234
|
};
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { clearDelayedWorklets, updateWorkletRefInitValueChanges } from '@lynx-js/react/worklet-runtime/bindings';
|
|
6
6
|
|
|
7
|
+
import type { PatchList, PatchOptions } from './commit.js';
|
|
7
8
|
import { snapshotPatchApply } from './snapshotPatchApply.js';
|
|
8
9
|
import { LifecycleConstant } from '../../lifecycleConstant.js';
|
|
9
10
|
import { __pendingListUpdates } from '../../list.js';
|
|
@@ -12,7 +13,6 @@ import { takeGlobalRefPatchMap } from '../../snapshot/ref.js';
|
|
|
12
13
|
import { __page } from '../../snapshot.js';
|
|
13
14
|
import { isEmptyObject } from '../../utils.js';
|
|
14
15
|
import { getReloadVersion } from '../pass.js';
|
|
15
|
-
import type { Patch, PatchOptions } from './commit.js';
|
|
16
16
|
|
|
17
17
|
function updateMainThread(
|
|
18
18
|
{ data, patchOptions }: {
|
|
@@ -20,31 +20,33 @@ function updateMainThread(
|
|
|
20
20
|
patchOptions: PatchOptions;
|
|
21
21
|
},
|
|
22
22
|
): void {
|
|
23
|
-
if ((patchOptions.reloadVersion
|
|
23
|
+
if ((patchOptions.reloadVersion) < getReloadVersion()) {
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
setPipeline(patchOptions.pipelineOptions);
|
|
28
28
|
markTiming(PerformanceTimingKeys.parse_changes_start);
|
|
29
|
-
|
|
30
|
-
markTiming(PerformanceTimingKeys.parse_changes_end);
|
|
29
|
+
const { patchList, flushOptions = {} } = JSON.parse(data) as PatchList;
|
|
31
30
|
|
|
31
|
+
markTiming(PerformanceTimingKeys.parse_changes_end);
|
|
32
32
|
markTiming(PerformanceTimingKeys.patch_changes_start);
|
|
33
|
-
updateWorkletRefInitValueChanges(workletRefInitValuePatch);
|
|
34
|
-
__pendingListUpdates.clear();
|
|
35
|
-
if (snapshotPatch) {
|
|
36
|
-
snapshotPatchApply(snapshotPatch);
|
|
37
|
-
}
|
|
38
|
-
__pendingListUpdates.flush();
|
|
39
|
-
// console.debug('********** Lepus updatePatch:');
|
|
40
|
-
// printSnapshotInstance(snapshotInstanceManager.values.get(-1)!);
|
|
41
33
|
|
|
42
|
-
|
|
34
|
+
for (const { snapshotPatch, workletRefInitValuePatch, id } of patchList) {
|
|
35
|
+
updateWorkletRefInitValueChanges(workletRefInitValuePatch);
|
|
36
|
+
__pendingListUpdates.clear();
|
|
37
|
+
if (snapshotPatch) {
|
|
38
|
+
snapshotPatchApply(snapshotPatch);
|
|
39
|
+
}
|
|
40
|
+
__pendingListUpdates.flush();
|
|
41
|
+
// console.debug('********** Lepus updatePatch:');
|
|
42
|
+
// printSnapshotInstance(snapshotInstanceManager.values.get(-1)!);
|
|
43
|
+
|
|
44
|
+
commitMainThreadPatchUpdate(id);
|
|
45
|
+
}
|
|
46
|
+
markTiming(PerformanceTimingKeys.patch_changes_end);
|
|
43
47
|
if (patchOptions.isHydration) {
|
|
44
48
|
clearDelayedWorklets();
|
|
45
49
|
}
|
|
46
|
-
markTiming(PerformanceTimingKeys.patch_changes_end);
|
|
47
|
-
flushOptions ||= {};
|
|
48
50
|
if (patchOptions.pipelineOptions) {
|
|
49
51
|
flushOptions.pipelineOptions = patchOptions.pipelineOptions;
|
|
50
52
|
}
|
|
@@ -66,4 +68,4 @@ function commitMainThreadPatchUpdate(commitTaskId?: number): void {
|
|
|
66
68
|
/**
|
|
67
69
|
* @internal
|
|
68
70
|
*/
|
|
69
|
-
export {
|
|
71
|
+
export { commitMainThreadPatchUpdate, injectUpdateMainThread };
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
// Copyright 2024 The Lynx Authors. All rights reserved.
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
|
-
import { render } from 'preact';
|
|
5
|
-
|
|
6
4
|
import { __root, setRoot } from '../root.js';
|
|
7
5
|
import { SnapshotInstance, __page, snapshotInstanceManager } from '../snapshot.js';
|
|
8
6
|
import { isEmptyObject } from '../utils.js';
|
|
9
7
|
import { destroyBackground } from './destroy.js';
|
|
10
8
|
import { increaseReloadVersion } from './pass.js';
|
|
11
|
-
import { renderMainThread } from './render.js';
|
|
9
|
+
import { renderBackground, renderMainThread } from './render.js';
|
|
12
10
|
import { hydrate } from '../hydrate.js';
|
|
13
11
|
import { LifecycleConstant } from '../lifecycleConstant.js';
|
|
14
12
|
import { __pendingListUpdates } from '../list.js';
|
|
@@ -71,7 +69,7 @@ function reloadBackground(updateData: Record<string, any>): void {
|
|
|
71
69
|
// COW when modify `lynx.__initData` to make sure Provider & Consumer works
|
|
72
70
|
lynx.__initData = Object.assign({}, lynx.__initData, updateData);
|
|
73
71
|
|
|
74
|
-
|
|
72
|
+
renderBackground(__root.__jsx, __root as any);
|
|
75
73
|
|
|
76
74
|
if (__PROFILE__) {
|
|
77
75
|
console.profileEnd();
|
|
@@ -2,11 +2,12 @@
|
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
4
|
import { render } from 'preact';
|
|
5
|
+
import type { ComponentChild, ContainerNode } from 'preact';
|
|
5
6
|
|
|
6
7
|
import { renderOpcodesInto } from '../opcodes.js';
|
|
7
8
|
import { render as renderToString } from '../renderToOpcodes/index.js';
|
|
8
9
|
import { __root } from '../root.js';
|
|
9
|
-
|
|
10
|
+
import { commitToMainThread } from './patch/commit.js';
|
|
10
11
|
|
|
11
12
|
function renderMainThread(): void {
|
|
12
13
|
/* v8 ignore start */
|
|
@@ -36,6 +37,9 @@ function renderMainThread(): void {
|
|
|
36
37
|
console.profile('renderOpcodesInto');
|
|
37
38
|
}
|
|
38
39
|
renderOpcodesInto(opcodes, __root as any);
|
|
40
|
+
if (__ENABLE_SSR__) {
|
|
41
|
+
__root.__opcodes = opcodes;
|
|
42
|
+
}
|
|
39
43
|
if (__PROFILE__) {
|
|
40
44
|
console.profileEnd();
|
|
41
45
|
}
|
|
@@ -43,4 +47,9 @@ function renderMainThread(): void {
|
|
|
43
47
|
/* v8 ignore stop */
|
|
44
48
|
}
|
|
45
49
|
|
|
46
|
-
|
|
50
|
+
function renderBackground(vnode: ComponentChild, parent: ContainerNode): void {
|
|
51
|
+
render(vnode, parent);
|
|
52
|
+
void commitToMainThread();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { renderMainThread, renderBackground };
|
package/runtime/src/list.ts
CHANGED
|
@@ -223,8 +223,17 @@ export const __pendingListUpdates = {
|
|
|
223
223
|
},
|
|
224
224
|
};
|
|
225
225
|
|
|
226
|
-
const gSignMap: Record<number, Map<number, SnapshotInstance>> = {};
|
|
227
|
-
const gRecycleMap: Record<number, Map<string, Map<number, SnapshotInstance>>> = {};
|
|
226
|
+
export const gSignMap: Record<number, Map<number, SnapshotInstance>> = {};
|
|
227
|
+
export const gRecycleMap: Record<number, Map<string, Map<number, SnapshotInstance>>> = {};
|
|
228
|
+
|
|
229
|
+
export function clearListGlobal(): void {
|
|
230
|
+
for (const key in gSignMap) {
|
|
231
|
+
delete gSignMap[key];
|
|
232
|
+
}
|
|
233
|
+
for (const key in gRecycleMap) {
|
|
234
|
+
delete gRecycleMap[key];
|
|
235
|
+
}
|
|
236
|
+
}
|
|
228
237
|
|
|
229
238
|
export function componentAtIndexFactory(ctx: SnapshotInstance[]): ComponentAtIndexCallback {
|
|
230
239
|
const componentAtIndex = (
|
|
@@ -13,8 +13,51 @@ import { renderMainThread } from '../lifecycle/render.js';
|
|
|
13
13
|
import { hydrate } from '../hydrate.js';
|
|
14
14
|
import { markTiming, PerformanceTimingKeys, setPipeline } from './performance.js';
|
|
15
15
|
import { __pendingListUpdates } from '../list.js';
|
|
16
|
+
import { ssrHydrateByOpcodes } from '../opcodes.js';
|
|
17
|
+
|
|
18
|
+
function ssrEncode() {
|
|
19
|
+
const { __opcodes } = __root;
|
|
20
|
+
delete __root.__opcodes;
|
|
21
|
+
|
|
22
|
+
const oldToJSON = SnapshotInstance.prototype.toJSON;
|
|
23
|
+
SnapshotInstance.prototype.toJSON = function(this: SnapshotInstance): any {
|
|
24
|
+
return [
|
|
25
|
+
this.type,
|
|
26
|
+
this.__id,
|
|
27
|
+
this.__elements,
|
|
28
|
+
];
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
return JSON.stringify({ __opcodes, __root_values: __root.__values });
|
|
33
|
+
} finally {
|
|
34
|
+
SnapshotInstance.prototype.toJSON = oldToJSON;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function ssrHydrate(info: string) {
|
|
39
|
+
const nativePage = __GetPageElement();
|
|
40
|
+
if (!nativePage) {
|
|
41
|
+
throw new Error('SSR Hydration Failed! Please check if the SSR content loaded successfully!');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const refsMap = __GetTemplateParts(nativePage);
|
|
45
|
+
|
|
46
|
+
const { __opcodes, __root_values } = JSON.parse(info);
|
|
47
|
+
__root_values && __root.setAttribute('values', __root_values);
|
|
48
|
+
ssrHydrateByOpcodes(__opcodes, __root as SnapshotInstance, refsMap);
|
|
49
|
+
|
|
50
|
+
(__root as SnapshotInstance).__elements = [nativePage];
|
|
51
|
+
(__root as SnapshotInstance).__element_root = nativePage;
|
|
52
|
+
}
|
|
16
53
|
|
|
17
54
|
function injectCalledByNative(): void {
|
|
55
|
+
if (process.env['NODE_ENV'] !== 'test') {
|
|
56
|
+
if (__FIRST_SCREEN_SYNC_TIMING__ !== 'jsReady' && __ENABLE_SSR__) {
|
|
57
|
+
throw new Error('`firstScreenSyncTiming` must be `jsReady` when SSR is enabled');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
18
61
|
const calledByNative: LynxCallByNative = {
|
|
19
62
|
renderPage,
|
|
20
63
|
updatePage,
|
|
@@ -23,9 +66,13 @@ function injectCalledByNative(): void {
|
|
|
23
66
|
return null;
|
|
24
67
|
},
|
|
25
68
|
removeComponents: function(): void {},
|
|
69
|
+
...(__ENABLE_SSR__ ? { ssrEncode, ssrHydrate } : {}),
|
|
26
70
|
};
|
|
27
71
|
|
|
28
72
|
Object.assign(globalThis, calledByNative);
|
|
73
|
+
Object.assign(globalThis, {
|
|
74
|
+
[LifecycleConstant.jsReady]: jsReady,
|
|
75
|
+
});
|
|
29
76
|
}
|
|
30
77
|
|
|
31
78
|
function renderPage(data: any): void {
|
|
@@ -46,10 +93,6 @@ function renderPage(data: any): void {
|
|
|
46
93
|
|
|
47
94
|
if (__FIRST_SCREEN_SYNC_TIMING__ === 'immediately') {
|
|
48
95
|
jsReady();
|
|
49
|
-
} else {
|
|
50
|
-
Object.assign(globalThis, {
|
|
51
|
-
[LifecycleConstant.jsReady]: jsReady,
|
|
52
|
-
});
|
|
53
96
|
}
|
|
54
97
|
}
|
|
55
98
|
|