@modern-js/runtime 1.4.4 → 1.16.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 +65 -0
- package/dist/js/modern/cli/index.js +6 -6
- package/dist/js/modern/core/app-config.js +10 -0
- package/dist/js/modern/core/compatible.js +241 -0
- package/dist/js/modern/core/index.js +7 -0
- package/dist/js/modern/core/loader/index.js +1 -0
- package/dist/js/modern/core/loader/loaderManager.js +189 -0
- package/dist/js/modern/core/loader/useLoader.js +105 -0
- package/dist/js/modern/core/plugin.js +63 -0
- package/dist/js/modern/core/runtime-context.js +2 -0
- package/dist/js/modern/exports/styled.js +2 -2
- package/dist/js/modern/index.js +1 -1
- package/dist/js/modern/router/runtime/plugin.js +1 -1
- package/dist/js/modern/router/runtime/utils.js +3 -1
- package/dist/js/modern/ssr/index.js +34 -13
- package/dist/js/modern/ssr/index.node.js +1 -1
- package/dist/js/modern/ssr/prefetch.js +2 -2
- package/dist/js/modern/ssr/react/withCallback/index.js +17 -0
- package/dist/js/modern/ssr/serverRender/helmet.js +2 -2
- package/dist/js/modern/ssr/serverRender/index.js +1 -1
- package/dist/js/modern/ssr/serverRender/styledComponent.js +1 -1
- package/dist/js/modern/ssr/utils.js +9 -3
- package/dist/js/modern/state/runtime/plugin.js +1 -1
- package/dist/js/node/cli/index.js +5 -5
- package/dist/js/node/core/app-config.js +22 -0
- package/dist/js/node/core/compatible.js +271 -0
- package/dist/js/node/core/index.js +111 -0
- package/dist/js/node/core/loader/index.js +15 -0
- package/dist/js/node/core/loader/loaderManager.js +201 -0
- package/dist/js/node/core/loader/useLoader.js +118 -0
- package/dist/js/node/core/plugin.js +79 -0
- package/dist/js/node/core/runtime-context.js +11 -0
- package/dist/js/node/exports/styled.js +5 -5
- package/dist/js/node/index.js +10 -10
- package/dist/js/node/router/runtime/plugin.js +3 -3
- package/dist/js/node/router/runtime/utils.js +3 -1
- package/dist/js/node/ssr/index.js +37 -15
- package/dist/js/node/ssr/index.node.js +2 -2
- package/dist/js/node/ssr/react/withCallback/index.js +27 -0
- package/dist/js/node/ssr/serverRender/helmet.js +2 -2
- package/dist/js/node/ssr/serverRender/index.js +2 -2
- package/dist/js/node/ssr/serverRender/styledComponent.js +2 -2
- package/dist/js/node/ssr/utils.js +9 -3
- package/dist/js/node/state/runtime/plugin.js +3 -3
- package/dist/js/treeshaking/cli/index.js +6 -6
- package/dist/js/treeshaking/core/app-config.js +13 -0
- package/dist/js/treeshaking/core/compatible.js +297 -0
- package/dist/js/treeshaking/core/index.js +7 -0
- package/dist/js/treeshaking/core/loader/index.js +1 -0
- package/dist/js/treeshaking/core/loader/loaderManager.js +267 -0
- package/dist/js/treeshaking/core/loader/useLoader.js +107 -0
- package/dist/js/treeshaking/core/plugin.js +105 -0
- package/dist/js/treeshaking/core/runtime-context.js +2 -0
- package/dist/js/treeshaking/exports/styled.js +2 -2
- package/dist/js/treeshaking/index.js +1 -1
- package/dist/js/treeshaking/router/runtime/plugin.js +1 -1
- package/dist/js/treeshaking/router/runtime/utils.js +3 -1
- package/dist/js/treeshaking/ssr/index.js +45 -33
- package/dist/js/treeshaking/ssr/index.node.js +1 -1
- package/dist/js/treeshaking/ssr/prefetch.js +2 -2
- package/dist/js/treeshaking/ssr/react/withCallback/index.js +16 -0
- package/dist/js/treeshaking/ssr/serverRender/helmet.js +2 -2
- package/dist/js/treeshaking/ssr/serverRender/index.js +1 -1
- package/dist/js/treeshaking/ssr/serverRender/styledComponent.js +1 -1
- package/dist/js/treeshaking/ssr/utils.js +8 -3
- package/dist/js/treeshaking/state/runtime/plugin.js +1 -1
- package/dist/types/core/app-config.d.ts +6 -0
- package/dist/types/core/compatible.d.ts +17 -0
- package/dist/types/core/index.d.ts +9 -0
- package/dist/types/core/loader/index.d.ts +2 -0
- package/dist/types/core/loader/loaderManager.d.ts +57 -0
- package/dist/types/core/loader/useLoader.d.ts +54 -0
- package/dist/types/core/plugin.d.ts +215 -0
- package/dist/types/core/runtime-context.d.ts +13 -0
- package/dist/types/exports/styled.d.ts +2 -2
- package/dist/types/index.d.ts +4 -9
- package/dist/types/router/runtime/plugin.d.ts +1 -1
- package/dist/types/ssr/index.d.ts +2 -2
- package/dist/types/ssr/index.node.d.ts +1 -1
- package/dist/types/ssr/prefetch.d.ts +2 -2
- package/dist/types/ssr/react/nossr/index.d.ts +1 -1
- package/dist/types/ssr/react/withCallback/index.d.ts +5 -0
- package/dist/types/ssr/serverRender/entry.d.ts +1 -1
- package/dist/types/ssr/serverRender/index.d.ts +1 -1
- package/dist/types/ssr/serverRender/type.d.ts +1 -1
- package/dist/types/state/runtime/plugin.d.ts +2 -2
- package/lib/types.d.ts +10 -0
- package/package.json +39 -27
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _createForOfIteratorHelper from "@babel/runtime/helpers/esm/createForOfIteratorHelper";
|
|
3
|
+
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
|
|
4
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
5
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
6
|
+
import invariant from 'invariant';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Calc id from string or object
|
|
10
|
+
*/
|
|
11
|
+
var createGetId = function createGetId() {
|
|
12
|
+
var idCache = new Map();
|
|
13
|
+
return function (objectId) {
|
|
14
|
+
var cachedId = idCache.get(objectId);
|
|
15
|
+
|
|
16
|
+
if (cachedId) {
|
|
17
|
+
return cachedId;
|
|
18
|
+
} // WARNING: id should be unique after serialize.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
var id = JSON.stringify(objectId);
|
|
22
|
+
invariant(id, 'params should be not null value');
|
|
23
|
+
idCache.set(objectId, id);
|
|
24
|
+
return id;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export var LoaderStatus;
|
|
29
|
+
|
|
30
|
+
(function (LoaderStatus) {
|
|
31
|
+
LoaderStatus[LoaderStatus["idle"] = 0] = "idle";
|
|
32
|
+
LoaderStatus[LoaderStatus["loading"] = 1] = "loading";
|
|
33
|
+
LoaderStatus[LoaderStatus["fulfilled"] = 2] = "fulfilled";
|
|
34
|
+
LoaderStatus[LoaderStatus["rejected"] = 3] = "rejected";
|
|
35
|
+
})(LoaderStatus || (LoaderStatus = {}));
|
|
36
|
+
|
|
37
|
+
var createLoader = function createLoader(id) {
|
|
38
|
+
var initialData = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
39
|
+
loading: false,
|
|
40
|
+
reloading: false,
|
|
41
|
+
data: undefined,
|
|
42
|
+
error: undefined
|
|
43
|
+
};
|
|
44
|
+
var loaderFn = arguments.length > 2 ? arguments[2] : undefined;
|
|
45
|
+
var skip = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
|
|
46
|
+
var promise;
|
|
47
|
+
var status = LoaderStatus.idle;
|
|
48
|
+
var data = initialData.data,
|
|
49
|
+
error = initialData.error;
|
|
50
|
+
var hasLoaded = false;
|
|
51
|
+
var handlers = new Set();
|
|
52
|
+
|
|
53
|
+
var load = /*#__PURE__*/function () {
|
|
54
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
55
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
56
|
+
while (1) {
|
|
57
|
+
switch (_context.prev = _context.next) {
|
|
58
|
+
case 0:
|
|
59
|
+
if (!skip) {
|
|
60
|
+
_context.next = 2;
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return _context.abrupt("return", promise);
|
|
65
|
+
|
|
66
|
+
case 2:
|
|
67
|
+
if (!(status === LoaderStatus.loading)) {
|
|
68
|
+
_context.next = 4;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return _context.abrupt("return", promise);
|
|
73
|
+
|
|
74
|
+
case 4:
|
|
75
|
+
status = LoaderStatus.loading;
|
|
76
|
+
notify();
|
|
77
|
+
promise = loaderFn().then(function (value) {
|
|
78
|
+
data = value;
|
|
79
|
+
error = null;
|
|
80
|
+
status = LoaderStatus.fulfilled;
|
|
81
|
+
})["catch"](function (e) {
|
|
82
|
+
error = e;
|
|
83
|
+
data = null;
|
|
84
|
+
status = LoaderStatus.rejected;
|
|
85
|
+
})["finally"](function () {
|
|
86
|
+
promise = null;
|
|
87
|
+
hasLoaded = true;
|
|
88
|
+
notify();
|
|
89
|
+
});
|
|
90
|
+
return _context.abrupt("return", promise);
|
|
91
|
+
|
|
92
|
+
case 8:
|
|
93
|
+
case "end":
|
|
94
|
+
return _context.stop();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}, _callee);
|
|
98
|
+
}));
|
|
99
|
+
|
|
100
|
+
return function load() {
|
|
101
|
+
return _ref.apply(this, arguments);
|
|
102
|
+
};
|
|
103
|
+
}();
|
|
104
|
+
|
|
105
|
+
var getResult = function getResult() {
|
|
106
|
+
return {
|
|
107
|
+
loading: !hasLoaded && status === LoaderStatus.loading,
|
|
108
|
+
reloading: hasLoaded && status === LoaderStatus.loading,
|
|
109
|
+
data: data,
|
|
110
|
+
error: error instanceof Error ? "".concat(error.message) : error,
|
|
111
|
+
// redundant fields for ssr log
|
|
112
|
+
_error: error
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
var notify = function notify() {
|
|
117
|
+
// don't iterate handlers directly, since it could be modified during iteration
|
|
118
|
+
_toConsumableArray(handlers).forEach(function (handler) {
|
|
119
|
+
handler(status, getResult());
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
var onChange = function onChange(handler) {
|
|
124
|
+
handlers.add(handler);
|
|
125
|
+
return function () {
|
|
126
|
+
handlers["delete"](handler);
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
get result() {
|
|
132
|
+
return getResult();
|
|
133
|
+
},
|
|
134
|
+
|
|
135
|
+
get promise() {
|
|
136
|
+
return promise;
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
onChange: onChange,
|
|
140
|
+
load: load
|
|
141
|
+
};
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Create loaders manager. It's returned instance will add to context
|
|
146
|
+
* @param initialDataMap used to initialing loader data
|
|
147
|
+
*/
|
|
148
|
+
export var createLoaderManager = function createLoaderManager(initialDataMap) {
|
|
149
|
+
var managerOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
150
|
+
var _managerOptions$skipS = managerOptions.skipStatic,
|
|
151
|
+
skipStatic = _managerOptions$skipS === void 0 ? false : _managerOptions$skipS,
|
|
152
|
+
_managerOptions$skipN = managerOptions.skipNonStatic,
|
|
153
|
+
skipNonStatic = _managerOptions$skipN === void 0 ? false : _managerOptions$skipN;
|
|
154
|
+
var loadersMap = new Map();
|
|
155
|
+
var getId = createGetId();
|
|
156
|
+
|
|
157
|
+
var add = function add(loaderFn, loaderOptions) {
|
|
158
|
+
var id = getId(loaderOptions.params);
|
|
159
|
+
var loader = loadersMap.get(id); // private property for opting out loader cache, maybe change in future
|
|
160
|
+
|
|
161
|
+
var cache = loaderOptions._cache;
|
|
162
|
+
|
|
163
|
+
if (!loader || cache === false) {
|
|
164
|
+
// ignore non-static loader on static phase
|
|
165
|
+
var ignoreNonStatic = skipNonStatic && !loaderOptions["static"]; // ignore static loader on non-static phase
|
|
166
|
+
|
|
167
|
+
var ignoreStatic = skipStatic && loaderOptions["static"];
|
|
168
|
+
var skipExec = ignoreNonStatic || ignoreStatic;
|
|
169
|
+
loader = createLoader(id, typeof initialDataMap[id] !== 'undefined' ? initialDataMap[id] : {
|
|
170
|
+
data: loaderOptions.initialData
|
|
171
|
+
}, loaderFn, // Todo whether static loader is exec when CSR
|
|
172
|
+
skipExec);
|
|
173
|
+
loadersMap.set(id, loader);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return id;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
var get = function get(id) {
|
|
180
|
+
return loadersMap.get(id);
|
|
181
|
+
}; // check if there has pending loaders
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
var hasPendingLoaders = function hasPendingLoaders() {
|
|
185
|
+
var _iterator = _createForOfIteratorHelper(loadersMap.values()),
|
|
186
|
+
_step;
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
190
|
+
var loader = _step.value;
|
|
191
|
+
var promise = loader.promise;
|
|
192
|
+
|
|
193
|
+
if (promise instanceof Promise) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
} catch (err) {
|
|
198
|
+
_iterator.e(err);
|
|
199
|
+
} finally {
|
|
200
|
+
_iterator.f();
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return false;
|
|
204
|
+
}; // waiting for all pending loaders to be settled
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
var awaitPendingLoaders = /*#__PURE__*/function () {
|
|
208
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
209
|
+
var pendingLoaders, _iterator2, _step2, _step2$value, id, loader, promise;
|
|
210
|
+
|
|
211
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
212
|
+
while (1) {
|
|
213
|
+
switch (_context2.prev = _context2.next) {
|
|
214
|
+
case 0:
|
|
215
|
+
pendingLoaders = [];
|
|
216
|
+
_iterator2 = _createForOfIteratorHelper(loadersMap);
|
|
217
|
+
|
|
218
|
+
try {
|
|
219
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
220
|
+
_step2$value = _slicedToArray(_step2.value, 2), id = _step2$value[0], loader = _step2$value[1];
|
|
221
|
+
promise = loader.promise;
|
|
222
|
+
|
|
223
|
+
if (promise instanceof Promise) {
|
|
224
|
+
pendingLoaders.push([id, loader]);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
} catch (err) {
|
|
228
|
+
_iterator2.e(err);
|
|
229
|
+
} finally {
|
|
230
|
+
_iterator2.f();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
_context2.next = 5;
|
|
234
|
+
return Promise.all(pendingLoaders.map(function (item) {
|
|
235
|
+
return item[1].promise;
|
|
236
|
+
}));
|
|
237
|
+
|
|
238
|
+
case 5:
|
|
239
|
+
return _context2.abrupt("return", pendingLoaders.reduce(function (res, _ref3) {
|
|
240
|
+
var _ref4 = _slicedToArray(_ref3, 2),
|
|
241
|
+
id = _ref4[0],
|
|
242
|
+
loader = _ref4[1];
|
|
243
|
+
|
|
244
|
+
res[id] = loader.result;
|
|
245
|
+
return res;
|
|
246
|
+
}, {}));
|
|
247
|
+
|
|
248
|
+
case 6:
|
|
249
|
+
case "end":
|
|
250
|
+
return _context2.stop();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}, _callee2);
|
|
254
|
+
}));
|
|
255
|
+
|
|
256
|
+
return function awaitPendingLoaders() {
|
|
257
|
+
return _ref2.apply(this, arguments);
|
|
258
|
+
};
|
|
259
|
+
}();
|
|
260
|
+
|
|
261
|
+
return {
|
|
262
|
+
hasPendingLoaders: hasPendingLoaders,
|
|
263
|
+
awaitPendingLoaders: awaitPendingLoaders,
|
|
264
|
+
add: add,
|
|
265
|
+
get: get
|
|
266
|
+
};
|
|
267
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
3
|
+
import { useContext, useRef, useMemo, useState, useCallback, useEffect } from 'react';
|
|
4
|
+
import invariant from 'invariant';
|
|
5
|
+
import { RuntimeReactContext } from "../runtime-context";
|
|
6
|
+
import { LoaderStatus } from "./loaderManager";
|
|
7
|
+
|
|
8
|
+
var useLoader = function useLoader(loaderFn) {
|
|
9
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
|
10
|
+
params: undefined
|
|
11
|
+
};
|
|
12
|
+
var context = useContext(RuntimeReactContext);
|
|
13
|
+
var isSSRRender = Boolean(context.ssr);
|
|
14
|
+
var loaderManager = context.loaderManager;
|
|
15
|
+
var loaderRef = useRef();
|
|
16
|
+
var unlistenLoaderChangeRef = useRef(null); // SSR render should ignore `_cache` prop
|
|
17
|
+
|
|
18
|
+
if (isSSRRender && Object.prototype.hasOwnProperty.call(options, '_cache')) {
|
|
19
|
+
delete options._cache;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
var load = useCallback(function (params) {
|
|
23
|
+
var _unlistenLoaderChange, _window, _window$_SSR_DATA, _window$_SSR_DATA$dat, _window$_SSR_DATA$dat2, _loaderRef$current2;
|
|
24
|
+
|
|
25
|
+
if (typeof params === 'undefined') {
|
|
26
|
+
var _loaderRef$current;
|
|
27
|
+
|
|
28
|
+
return (_loaderRef$current = loaderRef.current) === null || _loaderRef$current === void 0 ? void 0 : _loaderRef$current.load();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
var id = loaderManager.add(function () {
|
|
32
|
+
try {
|
|
33
|
+
var _res = loaderFn(context, params);
|
|
34
|
+
|
|
35
|
+
if (_res instanceof Promise) {
|
|
36
|
+
return _res;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return Promise.resolve(_res);
|
|
40
|
+
} catch (e) {
|
|
41
|
+
return Promise.reject(e);
|
|
42
|
+
}
|
|
43
|
+
}, _objectSpread(_objectSpread({}, options), {}, {
|
|
44
|
+
params: params
|
|
45
|
+
}));
|
|
46
|
+
loaderRef.current = loaderManager.get(id); // unsubscribe old loader onChange event
|
|
47
|
+
|
|
48
|
+
(_unlistenLoaderChange = unlistenLoaderChangeRef.current) === null || _unlistenLoaderChange === void 0 ? void 0 : _unlistenLoaderChange.call(unlistenLoaderChangeRef);
|
|
49
|
+
|
|
50
|
+
if (isSSRRender) {
|
|
51
|
+
return undefined;
|
|
52
|
+
} // skip this loader, then try to unlisten loader change
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
if (options.skip) {
|
|
56
|
+
return undefined;
|
|
57
|
+
} // do not load data again in CSR hydrate stage if SSR data exists
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
if (context._hydration && ((_window = window) === null || _window === void 0 ? void 0 : (_window$_SSR_DATA = _window._SSR_DATA) === null || _window$_SSR_DATA === void 0 ? void 0 : (_window$_SSR_DATA$dat = _window$_SSR_DATA.data) === null || _window$_SSR_DATA$dat === void 0 ? void 0 : (_window$_SSR_DATA$dat2 = _window$_SSR_DATA$dat.loadersData[id]) === null || _window$_SSR_DATA$dat2 === void 0 ? void 0 : _window$_SSR_DATA$dat2.error) === null) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
var res = loaderRef.current.load();
|
|
65
|
+
unlistenLoaderChangeRef.current = (_loaderRef$current2 = loaderRef.current) === null || _loaderRef$current2 === void 0 ? void 0 : _loaderRef$current2.onChange(function (_status, _result) {
|
|
66
|
+
setResult(_result);
|
|
67
|
+
|
|
68
|
+
if (_status === LoaderStatus.fulfilled) {
|
|
69
|
+
var _options$onSuccess;
|
|
70
|
+
|
|
71
|
+
options === null || options === void 0 ? void 0 : (_options$onSuccess = options.onSuccess) === null || _options$onSuccess === void 0 ? void 0 : _options$onSuccess.call(options, _result.data);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (_status === LoaderStatus.rejected) {
|
|
75
|
+
var _options$onError;
|
|
76
|
+
|
|
77
|
+
options === null || options === void 0 ? void 0 : (_options$onError = options.onError) === null || _options$onError === void 0 ? void 0 : _options$onError.call(options, _result.error);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
return res;
|
|
81
|
+
}, [options.skip]);
|
|
82
|
+
useEffect(function () {
|
|
83
|
+
return function () {
|
|
84
|
+
var _unlistenLoaderChange2;
|
|
85
|
+
|
|
86
|
+
(_unlistenLoaderChange2 = unlistenLoaderChangeRef.current) === null || _unlistenLoaderChange2 === void 0 ? void 0 : _unlistenLoaderChange2.call(unlistenLoaderChangeRef);
|
|
87
|
+
};
|
|
88
|
+
}, []);
|
|
89
|
+
useMemo(function () {
|
|
90
|
+
var _options$params;
|
|
91
|
+
|
|
92
|
+
var p = (_options$params = options.params) !== null && _options$params !== void 0 ? _options$params : loaderFn.id;
|
|
93
|
+
invariant(typeof p !== 'undefined' && p !== null, 'Params is required in useLoader');
|
|
94
|
+
load(p);
|
|
95
|
+
}, [options.params]);
|
|
96
|
+
|
|
97
|
+
var _useState = useState(loaderRef.current.result),
|
|
98
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
99
|
+
result = _useState2[0],
|
|
100
|
+
setResult = _useState2[1];
|
|
101
|
+
|
|
102
|
+
return _objectSpread(_objectSpread({}, result), {}, {
|
|
103
|
+
reload: load
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export default useLoader;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
2
|
+
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
3
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
4
|
+
import { createManager, createPipeline, createAsyncPipeline } from '@modern-js/plugin';
|
|
5
|
+
import { createLoaderManager } from "./loader/loaderManager";
|
|
6
|
+
var hoc = createPipeline(); // eslint-disable-next-line @typescript-eslint/no-empty-interface
|
|
7
|
+
|
|
8
|
+
var provide = createPipeline();
|
|
9
|
+
var client = createAsyncPipeline();
|
|
10
|
+
var server = createAsyncPipeline();
|
|
11
|
+
var init = createAsyncPipeline();
|
|
12
|
+
var pickContext = createPipeline();
|
|
13
|
+
var runtimeHooks = {
|
|
14
|
+
hoc: hoc,
|
|
15
|
+
provide: provide,
|
|
16
|
+
client: client,
|
|
17
|
+
server: server,
|
|
18
|
+
init: init,
|
|
19
|
+
pickContext: pickContext
|
|
20
|
+
};
|
|
21
|
+
/** All hooks of runtime plugin. */
|
|
22
|
+
|
|
23
|
+
export var createRuntime = function createRuntime() {
|
|
24
|
+
return createManager(runtimeHooks);
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* register init hook. It would be revoked both ssr and csr.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
var registerInit = function registerInit(App, _init) {
|
|
31
|
+
var originalInit = App.init;
|
|
32
|
+
|
|
33
|
+
App.init = /*#__PURE__*/function () {
|
|
34
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(context) {
|
|
35
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
36
|
+
while (1) {
|
|
37
|
+
switch (_context.prev = _context.next) {
|
|
38
|
+
case 0:
|
|
39
|
+
if (!context.loaderManager) {
|
|
40
|
+
context.loaderManager = createLoaderManager({});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
_context.next = 3;
|
|
44
|
+
return Promise.all([originalInit === null || originalInit === void 0 ? void 0 : originalInit(context), _init === null || _init === void 0 ? void 0 : _init(context)]);
|
|
45
|
+
|
|
46
|
+
case 3:
|
|
47
|
+
case "end":
|
|
48
|
+
return _context.stop();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}, _callee);
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
return function (_x) {
|
|
55
|
+
return _ref.apply(this, arguments);
|
|
56
|
+
};
|
|
57
|
+
}();
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* register prefetch hook. It would be revoked both ssr and csr.
|
|
61
|
+
* But if ssr success, It wont exec in csr again.
|
|
62
|
+
* If ssr prefetch failed, It will fallback to exec in csr.
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
var registerPrefetch = function registerPrefetch(App, prefetch) {
|
|
67
|
+
var originalPrefetch = App.prefetch;
|
|
68
|
+
|
|
69
|
+
App.prefetch = /*#__PURE__*/function () {
|
|
70
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(context) {
|
|
71
|
+
var originResult, result;
|
|
72
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
73
|
+
while (1) {
|
|
74
|
+
switch (_context2.prev = _context2.next) {
|
|
75
|
+
case 0:
|
|
76
|
+
_context2.next = 2;
|
|
77
|
+
return originalPrefetch === null || originalPrefetch === void 0 ? void 0 : originalPrefetch(context);
|
|
78
|
+
|
|
79
|
+
case 2:
|
|
80
|
+
originResult = _context2.sent;
|
|
81
|
+
_context2.next = 5;
|
|
82
|
+
return prefetch === null || prefetch === void 0 ? void 0 : prefetch(context);
|
|
83
|
+
|
|
84
|
+
case 5:
|
|
85
|
+
result = _context2.sent;
|
|
86
|
+
return _context2.abrupt("return", _objectSpread(_objectSpread({}, originResult), result));
|
|
87
|
+
|
|
88
|
+
case 7:
|
|
89
|
+
case "end":
|
|
90
|
+
return _context2.stop();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}, _callee2);
|
|
94
|
+
}));
|
|
95
|
+
|
|
96
|
+
return function (_x2) {
|
|
97
|
+
return _ref2.apply(this, arguments);
|
|
98
|
+
};
|
|
99
|
+
}();
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export var runtime = createRuntime();
|
|
103
|
+
var createPlugin = runtime.createPlugin;
|
|
104
|
+
export { createPlugin };
|
|
105
|
+
export { registerInit, registerPrefetch };
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import styled from '
|
|
1
|
+
import styled from 'styled-components';
|
|
2
2
|
export default styled;
|
|
3
|
-
export * from '
|
|
3
|
+
export * from 'styled-components';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { createApp, createPlugin, useLoader, bootstrap, RuntimeReactContext, registerPrefetch, defineConfig, registerInit, useRuntimeContext } from
|
|
1
|
+
export { createApp, createPlugin, useLoader, bootstrap, RuntimeReactContext, registerPrefetch, defineConfig, registerInit, useRuntimeContext } from "./core";
|
|
@@ -2,8 +2,8 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
|
2
2
|
import React, { useContext } from 'react';
|
|
3
3
|
import { createBrowserHistory, createHashHistory } from 'history';
|
|
4
4
|
import { Router, StaticRouter } from 'react-router-dom';
|
|
5
|
-
import { RuntimeReactContext } from '@modern-js/runtime-core';
|
|
6
5
|
import hoistNonReactStatics from 'hoist-non-react-statics';
|
|
6
|
+
import { RuntimeReactContext } from "../../core";
|
|
7
7
|
import { isBrowser } from "../../common";
|
|
8
8
|
import { renderRoutes, getLocation, urlJoin } from "./utils";
|
|
9
9
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
@@ -60,11 +60,13 @@ export function renderRoutes(routesConfig) {
|
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
export function getLocation(serverContext) {
|
|
63
|
+
var _url$replace;
|
|
64
|
+
|
|
63
65
|
var _ref2 = (serverContext === null || serverContext === void 0 ? void 0 : serverContext.request) || {},
|
|
64
66
|
pathname = _ref2.pathname,
|
|
65
67
|
url = _ref2.url;
|
|
66
68
|
|
|
67
|
-
var cleanUrl = url.replace('http://', '').replace('https://', '');
|
|
69
|
+
var cleanUrl = url === null || url === void 0 ? void 0 : (_url$replace = url.replace('http://', '')) === null || _url$replace === void 0 ? void 0 : _url$replace.replace('https://', '');
|
|
68
70
|
var index = (cleanUrl || '').indexOf(pathname);
|
|
69
71
|
|
|
70
72
|
if (index === -1) {
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
|
|
2
2
|
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
|
3
3
|
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
4
|
-
import ReactDOM from 'react-dom';
|
|
5
4
|
import { loadableReady } from '@loadable/component';
|
|
5
|
+
import hoistNonReactStatics from 'hoist-non-react-statics';
|
|
6
6
|
import { RenderLevel } from "./serverRender/type";
|
|
7
|
+
import { WithCallback } from "./react/withCallback";
|
|
7
8
|
import { formatClient, mockResponse } from "./utils";
|
|
8
9
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
|
+
var IS_REACT18 = process.env.IS_REACT18 === 'true';
|
|
9
11
|
|
|
10
12
|
var ssr = function ssr() {
|
|
11
13
|
return {
|
|
@@ -17,52 +19,58 @@ var ssr = function ssr() {
|
|
|
17
19
|
var _client = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(_ref) {
|
|
18
20
|
var _window, _window$_SSR_DATA;
|
|
19
21
|
|
|
20
|
-
var App, context,
|
|
21
|
-
|
|
22
|
+
var App, context, ModernRender, ModernHydrate, renderLevel;
|
|
22
23
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
23
24
|
while (1) {
|
|
24
25
|
switch (_context.prev = _context.next) {
|
|
25
26
|
case 0:
|
|
26
|
-
App = _ref.App, context = _ref.context,
|
|
27
|
+
App = _ref.App, context = _ref.context, ModernRender = _ref.ModernRender, ModernHydrate = _ref.ModernHydrate;
|
|
27
28
|
renderLevel = (_window = window) === null || _window === void 0 ? void 0 : (_window$_SSR_DATA = _window._SSR_DATA) === null || _window$_SSR_DATA === void 0 ? void 0 : _window$_SSR_DATA.renderLevel;
|
|
28
29
|
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
case 5:
|
|
38
|
-
ReactDOM.render( /*#__PURE__*/_jsx(App, {
|
|
39
|
-
context: context
|
|
40
|
-
}), rootElement);
|
|
41
|
-
_context.next = 9;
|
|
42
|
-
break;
|
|
43
|
-
|
|
44
|
-
case 8:
|
|
45
|
-
if (renderLevel === RenderLevel.SERVER_RENDER) {
|
|
30
|
+
if (renderLevel === RenderLevel.CLIENT_RENDER) {
|
|
31
|
+
// prefetch block render while csr
|
|
32
|
+
// await (App as any)?.prefetch?.(context);
|
|
33
|
+
ModernRender( /*#__PURE__*/_jsx(App, {
|
|
34
|
+
context: context
|
|
35
|
+
}));
|
|
36
|
+
} else if (renderLevel === RenderLevel.SERVER_RENDER) {
|
|
46
37
|
loadableReady(function () {
|
|
47
38
|
var hydrateContext = _objectSpread(_objectSpread({}, context), {}, {
|
|
48
39
|
_hydration: true
|
|
49
40
|
});
|
|
50
41
|
|
|
51
|
-
|
|
52
|
-
context: hydrateContext
|
|
53
|
-
}), rootElement, function () {
|
|
42
|
+
var callback = function callback() {
|
|
54
43
|
// won't cause component re-render because context's reference identity doesn't change
|
|
55
44
|
delete hydrateContext._hydration;
|
|
56
|
-
}
|
|
45
|
+
}; // callback: https://github.com/reactwg/react-18/discussions/5
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
if (IS_REACT18) {
|
|
49
|
+
var SSRApp = function SSRApp() {
|
|
50
|
+
return /*#__PURE__*/_jsx(WithCallback, {
|
|
51
|
+
callback: callback,
|
|
52
|
+
children: /*#__PURE__*/_jsx(App, {
|
|
53
|
+
context: hydrateContext
|
|
54
|
+
})
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
SSRApp = hoistNonReactStatics(SSRApp, App);
|
|
59
|
+
ModernHydrate( /*#__PURE__*/_jsx(SSRApp, {}));
|
|
60
|
+
} else {
|
|
61
|
+
ModernHydrate( /*#__PURE__*/_jsx(App, {
|
|
62
|
+
context: hydrateContext
|
|
63
|
+
}), callback);
|
|
64
|
+
}
|
|
57
65
|
});
|
|
58
66
|
} else {
|
|
59
67
|
// unknown renderlevel or renderlevel is server prefetch.
|
|
60
|
-
|
|
68
|
+
ModernHydrate( /*#__PURE__*/_jsx(App, {
|
|
61
69
|
context: context
|
|
62
|
-
})
|
|
70
|
+
}));
|
|
63
71
|
}
|
|
64
72
|
|
|
65
|
-
case
|
|
73
|
+
case 3:
|
|
66
74
|
case "end":
|
|
67
75
|
return _context.stop();
|
|
68
76
|
}
|
|
@@ -76,13 +84,17 @@ var ssr = function ssr() {
|
|
|
76
84
|
|
|
77
85
|
return client;
|
|
78
86
|
}(),
|
|
79
|
-
init: function init(
|
|
87
|
+
init: function init(_ref2, next) {
|
|
80
88
|
var _window2, _window2$_SSR_DATA, _window2$_SSR_DATA$co;
|
|
81
89
|
|
|
82
|
-
var context =
|
|
90
|
+
var context = _ref2.context;
|
|
83
91
|
var request = (_window2 = window) === null || _window2 === void 0 ? void 0 : (_window2$_SSR_DATA = _window2._SSR_DATA) === null || _window2$_SSR_DATA === void 0 ? void 0 : (_window2$_SSR_DATA$co = _window2$_SSR_DATA.context) === null || _window2$_SSR_DATA$co === void 0 ? void 0 : _window2$_SSR_DATA$co.request;
|
|
84
92
|
|
|
85
93
|
if (!request) {
|
|
94
|
+
context.ssrContext = _objectSpread(_objectSpread({}, context.ssrContext), {}, {
|
|
95
|
+
response: mockResp,
|
|
96
|
+
request: formatClient({})
|
|
97
|
+
});
|
|
86
98
|
return next({
|
|
87
99
|
context: context
|
|
88
100
|
});
|
|
@@ -94,11 +106,11 @@ var ssr = function ssr() {
|
|
|
94
106
|
context: context
|
|
95
107
|
});
|
|
96
108
|
},
|
|
97
|
-
pickContext: function pickContext(
|
|
109
|
+
pickContext: function pickContext(_ref3, next) {
|
|
98
110
|
var _window3, _window3$_SSR_DATA, _window3$_SSR_DATA$co;
|
|
99
111
|
|
|
100
|
-
var context =
|
|
101
|
-
pickedContext =
|
|
112
|
+
var context = _ref3.context,
|
|
113
|
+
pickedContext = _ref3.pickedContext;
|
|
102
114
|
var request = (_window3 = window) === null || _window3 === void 0 ? void 0 : (_window3$_SSR_DATA = _window3._SSR_DATA) === null || _window3$_SSR_DATA === void 0 ? void 0 : (_window3$_SSR_DATA$co = _window3$_SSR_DATA.context) === null || _window3$_SSR_DATA$co === void 0 ? void 0 : _window3$_SSR_DATA$co.request;
|
|
103
115
|
var initialData = context.initialData;
|
|
104
116
|
|
|
@@ -6,7 +6,7 @@ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
|
6
6
|
|
|
7
7
|
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
8
8
|
import path from 'path';
|
|
9
|
-
import { registerPrefetch } from
|
|
9
|
+
import { registerPrefetch } from "../core";
|
|
10
10
|
import { isBrowser } from "../common";
|
|
11
11
|
import prefetch from "./prefetch";
|
|
12
12
|
import { formatServer } from "./utils";
|
|
@@ -5,10 +5,10 @@ import fs from 'fs';
|
|
|
5
5
|
import { renderToStaticMarkup } from 'react-dom/server';
|
|
6
6
|
import { run } from '@modern-js/utils/ssr';
|
|
7
7
|
import { LOADABLE_STATS_FILE } from '@modern-js/utils/constants';
|
|
8
|
-
import { ChunkExtractor } from '@loadable/server';
|
|
9
|
-
|
|
8
|
+
import { ChunkExtractor } from '@loadable/server';
|
|
10
9
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
10
|
|
|
11
|
+
// todo: SSRContext
|
|
12
12
|
var prefetch = /*#__PURE__*/function () {
|
|
13
13
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(App, context) {
|
|
14
14
|
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|