Compare commits

...

16 Commits

Author SHA1 Message Date
ClarkXia 6125acd55e
Merge 4a46a1251c into ace5e1dd15 2025-07-24 16:30:30 +08:00
ClarkXia ace5e1dd15
Merge pull request #7127 from alibaba/hotfix/env
CI / build (16.x, ubuntu-latest) (push) Has been cancelled Details
CI / build (16.x, windows-latest) (push) Has been cancelled Details
CI / build (18.x, ubuntu-latest) (push) Has been cancelled Details
CI / build (18.x, windows-latest) (push) Has been cancelled Details
Coverage / coverage (16.x) (push) Has been cancelled Details
Release / Release (16) (push) Has been cancelled Details
hotfix: add isPHA and isKraken env for backward compatibility
2025-07-24 15:27:08 +08:00
ClarkXia 0141336861
Merge pull request #7125 from alibaba/release/next
CI / build (16.x, ubuntu-latest) (push) Waiting to run Details
CI / build (16.x, windows-latest) (push) Waiting to run Details
CI / build (18.x, ubuntu-latest) (push) Waiting to run Details
CI / build (18.x, windows-latest) (push) Waiting to run Details
Coverage / coverage (16.x) (push) Waiting to run Details
Release / Release (16) (push) Waiting to run Details
Release@3.6.4
2025-07-24 10:49:29 +08:00
ClarkXia 7f302fa439
chore: update versions (#7126) 2025-07-24 10:01:12 +08:00
ZeroLing 0dd4aab050
重构内置 env.ts 实现 (#7124)
Publish canary / Publish Canary (18) (push) Blocked by required conditions Details
Publish canary / Check Changeset exists (push) Has been cancelled Details
CI / build (16.x, ubuntu-latest) (push) Has been cancelled Details
CI / build (16.x, windows-latest) (push) Has been cancelled Details
CI / build (18.x, ubuntu-latest) (push) Has been cancelled Details
CI / build (18.x, windows-latest) (push) Has been cancelled Details
Version / Version (16) (push) Has been cancelled Details
* refactor: add env for themis, delete PHA/Kraken, simplize WindVane

* chore: add changeset
2025-07-22 15:53:14 +08:00
Mixiu d55e34bc56
feat(runtime): add suspense event dispatch in Suspense component (#7122)
* feat(runtime): add suspense event dispatch in Suspense component

* chore(runtime): add changeset

* fix(runtime): Apply suggestions from code review

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix(runtime): optimize Suspense component script rendering

* fix(runtime): move dispatchSuspenseEvent function outside of withSuspense in Suspense.tsx

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-07-22 15:47:58 +08:00
ClarkXia b2d93c6ffe Merge branch 'master' into release/next 2025-07-14 10:37:03 +08:00
ClarkXia 72bfa88d17 chore: update version
Publish canary / Check Changeset exists (push) Has been cancelled Details
CI / build (16.x, ubuntu-latest) (push) Has been cancelled Details
CI / build (16.x, windows-latest) (push) Has been cancelled Details
CI / build (18.x, ubuntu-latest) (push) Has been cancelled Details
CI / build (18.x, windows-latest) (push) Has been cancelled Details
Version / Version (16) (push) Has been cancelled Details
Publish canary / Publish Canary (18) (push) Has been cancelled Details
2025-07-08 19:24:32 +08:00
ClarkXia 9b95b4c031 Merge branch 'master' into release/next 2025-07-08 19:19:02 +08:00
ClarkXia 22d1b49c9c chore: version 2025-07-08 19:15:34 +08:00
ClarkXia 4569200caf
feat: support externals field in assets-manifest (#7116)
Publish canary / Check Changeset exists (push) Waiting to run Details
Publish canary / Publish Canary (18) (push) Blocked by required conditions Details
CI / build (16.x, ubuntu-latest) (push) Waiting to run Details
CI / build (16.x, windows-latest) (push) Waiting to run Details
CI / build (18.x, ubuntu-latest) (push) Waiting to run Details
CI / build (18.x, windows-latest) (push) Waiting to run Details
Version / Version (16) (push) Waiting to run Details
2025-07-08 16:40:00 +08:00
ClarkXia 4a46a1251c Merge branch 'release/next' into fix/suspense-request 2024-07-09 15:14:29 +08:00
ClarkXia f1d4ba5359 chore: changeset 2024-07-09 14:11:01 +08:00
ClarkXia 7dde0b1d48 fix: optimize code 2024-07-09 13:58:57 +08:00
ClarkXia 55f4c22033 chore: fix test 2024-07-03 19:37:41 +08:00
ClarkXia bfa60bd2b0 feat: avoid duplicate request when use suspense data in CSR 2024-07-03 16:20:23 +08:00
15 changed files with 134 additions and 19 deletions

View File

@ -0,0 +1,5 @@
---
'@ice/runtime': patch
---
feat: support options for API useSuspenseData

View File

@ -1,5 +1,17 @@
# Changelog
## 3.6.5
- hotfix: add isPHA and isKraken env for backward compatibility.
## 3.6.4
### Patch Changes
- 0dd4aab0: refactor: add env for themis, delete PHA/Kraken, simplize WindVane
- Updated dependencies [d55e34bc]
- @ice/runtime@1.5.6
## 3.6.3
### Patch Changes

View File

@ -1,6 +1,6 @@
{
"name": "@ice/app",
"version": "3.6.3",
"version": "3.6.5",
"description": "provide scripts and configuration used by web framework ice",
"type": "module",
"main": "./esm/index.js",

View File

@ -9,16 +9,16 @@ export const isByteDanceMicroApp = isClient && import.meta.target === 'bytedance
export const isBaiduSmartProgram = isClient && import.meta.target === 'baidu-smartprogram';
export const isKuaiShouMiniProgram = isClient && import.meta.target === 'kuaishou-miniprogram';
export const isWeChatMiniProgram = isClient && import.meta.target === 'wechat-miniprogram';
export const isKraken = isClient && import.meta.target === 'kraken';
export const isQuickApp = false; // Now ice.js will not implement quick app target.
export const isMiniApp = isAliMiniApp;// in universal-env, isMiniApp is equals to isAliMiniApp
export const isMiniApp = isAliMiniApp; // in universal-env, isMiniApp is equals to isAliMiniApp
export const isKraken = isClient && import.meta.target === 'kraken';
// Following variables are runtime executed envs.
// See also @uni/env.
export const isPHA = isWeb && typeof pha === 'object';
const ua = typeof navigator === 'object' ? navigator.userAgent || navigator.swuserAgent : '';
const wvRegExp = /.+AliApp\((\w+)\/((?:\d+\.)+\d+)\).* .*(WindVane)(?:\/((?:\d+\.)+\d+))?.*/;
export const isWindVane = wvRegExp.test(ua) && isWeb && typeof WindVane !== 'undefined' && typeof WindVane.call !== 'undefined';
export const isThemis = /Themis/.test(ua);
export const isWindVane = /WindVane/i.test(ua) && isWeb && typeof WindVane !== 'undefined' && typeof WindVane.call !== 'undefined';
// WindVane.call is a function while page importing lib-windvane
export const isFRM = isMiniApp && isWeb && typeof my !== 'undefined' && typeof my.isFRM !== 'undefined';
@ -28,13 +28,14 @@ export default {
isNode,
isWeex,
isKraken,
isPHA,
isThemis,
isMiniApp,
isByteDanceMicroApp,
isBaiduSmartProgram,
isKuaiShouMiniProgram,
isWeChatMiniProgram,
isQuickApp,
isPHA,
isWindVane,
isFRM,
};

View File

@ -1,5 +1,11 @@
# @ice/miniapp-react-dom
## 1.1.6
### Patch Changes
- @ice/miniapp-runtime@1.2.6
## 1.1.5
### Patch Changes

View File

@ -1,6 +1,6 @@
{
"name": "@ice/miniapp-react-dom",
"version": "1.1.5",
"version": "1.1.6",
"description": "like react-dom, but for miniapps.",
"type": "module",
"types": "./esm/index.d.ts",

View File

@ -1,5 +1,12 @@
# Changelog
## 1.2.6
### Patch Changes
- Updated dependencies [d55e34bc]
- @ice/runtime@1.5.6
## 1.2.5
### Patch Changes

View File

@ -1,6 +1,6 @@
{
"name": "@ice/miniapp-runtime",
"version": "1.2.5",
"version": "1.2.6",
"description": "ice runtime for miniapps.",
"type": "module",
"types": "./esm/index.d.ts",

View File

@ -56,8 +56,8 @@
"webpack-dev-server": "4.15.0"
},
"peerDependencies": {
"@ice/app": "^3.6.3",
"@ice/runtime": "^1.5.4"
"@ice/app": "^3.6.4",
"@ice/runtime": "^1.5.6"
},
"publishConfig": {
"access": "public"

View File

@ -1,5 +1,12 @@
# Changelog
## 1.2.7
### Patch Changes
- @ice/miniapp-runtime@1.2.6
- @ice/miniapp-react-dom@1.1.6
## 1.2.6
### Patch Changes

View File

@ -1,6 +1,6 @@
{
"name": "@ice/plugin-miniapp",
"version": "1.2.6",
"version": "1.2.7",
"description": "ice.js plugin for miniapp.",
"license": "MIT",
"type": "module",
@ -50,8 +50,8 @@
"sax": "^1.2.4"
},
"devDependencies": {
"@ice/app": "^3.6.3",
"@ice/runtime": "^1.5.4",
"@ice/app": "^3.6.4",
"@ice/runtime": "^1.5.6",
"webpack": "^5.88.0"
},
"repository": {

View File

@ -1,5 +1,11 @@
# @ice/runtime
## 1.5.6
### Patch Changes
- d55e34bc: feat: add suspense event dispatch in Suspense component
## 1.5.5
### Patch Changes

View File

@ -1,6 +1,6 @@
{
"name": "@ice/runtime",
"version": "1.5.5",
"version": "1.5.6",
"description": "Runtime module for ice.js",
"type": "module",
"types": "./esm/index.d.ts",

View File

@ -47,7 +47,35 @@ const getHydrateData = (id: string) => {
};
};
export function useSuspenseData(request?: Request) {
class QueryClient {
queryCache: Map<string, Promise<any>>;
constructor() {
this.queryCache = new Map();
}
setQueryData(key: string, promise: Promise<any>) {
if (key) {
this.queryCache.set(key, promise);
}
}
getQueryData(key: string) {
return this.queryCache.get(key);
}
removeQueryData(key: string) {
this.queryCache.delete(key);
}
}
const queryClient = new QueryClient();
interface SuspenseDataProps {
queryKey?: string;
}
export function useSuspenseData(request?: Request, options?: SuspenseDataProps) {
const appContext = useAppContext();
const { requestContext } = appContext;
const suspenseState = React.useContext(SuspenseContext);
@ -55,22 +83,26 @@ export function useSuspenseData(request?: Request) {
const { data, done, promise, update, error, id } = suspenseState;
const { hasHydrateData, data: hydrateData } = getHydrateData(id);
const queryInProcess = options?.queryKey && queryClient.getQueryData(options.queryKey);
let thenable: Promise<any> = null;
if (!hasHydrateData && !error && !done && !promise && request) {
if (!hasHydrateData && !error && !done && !promise && request && !queryInProcess) {
thenable = request(requestContext);
thenable.then((response) => {
queryClient.removeQueryData(options?.queryKey);
update({
done: true,
data: response,
promise: null,
});
}).catch(e => {
queryClient.removeQueryData(options?.queryKey);
update({
done: true,
error: e,
promise: null,
});
});
queryClient.setQueryData(options?.queryKey, thenable);
}
React.useEffect(() => {
@ -117,7 +149,12 @@ export function useSuspenseData(request?: Request) {
promise: thenable,
});
}
throw thenable;
if (thenable) {
throw thenable;
} else {
// Throw a pending promise to Suspense, otherwise the component will be error because of undefined data.
throw (queryClient.getQueryData(options?.queryKey) || new Promise(() => {}));
}
}
interface SuspenseProps {
@ -126,6 +163,11 @@ interface SuspenseProps {
[key: string]: any;
}
function dispatchSuspenseEvent(event: string, id: string) {
window.dispatchEvent(new CustomEvent(event, { detail: { id } }));
}
const DISPATCH_SUSPENSE_EVENT_STRING = dispatchSuspenseEvent.toString();
export function withSuspense(Component) {
return (props: SuspenseProps) => {
const { fallback, id, ...componentProps } = props;
@ -153,10 +195,22 @@ export function withSuspense(Component) {
return (
<React.Suspense fallback={fallback || null}>
<InlineScript
id={`suspense-parse-start-${id}`}
script={`(${DISPATCH_SUSPENSE_EVENT_STRING})('ice-suspense-parse-start','${id}');`}
/>
<SuspenseContext.Provider value={suspenseState}>
<Component {...componentProps} />
<InlineScript
id={`suspense-parse-data-${id}`}
script={`(${DISPATCH_SUSPENSE_EVENT_STRING})('ice-suspense-parse-data','${id}');`}
/>
<Data id={id} />
</SuspenseContext.Provider>
<InlineScript
id={`suspense-parse-end-${id}`}
script={`(${DISPATCH_SUSPENSE_EVENT_STRING})('ice-suspense-parse-end','${id}');`}
/>
</React.Suspense>
);
};
@ -174,3 +228,20 @@ function Data(props) {
/>
);
}
interface InlineScriptProps {
id: string;
script: string;
}
function InlineScript(props: InlineScriptProps) {
return (
<script
id={props.id}
dangerouslySetInnerHTML={{
__html: props.script,
}}
suppressHydrationWarning
/>
);
}

View File

@ -2157,10 +2157,10 @@ importers:
version: 1.2.4
devDependencies:
'@ice/app':
specifier: ^3.6.3
specifier: ^3.6.4
version: link:../ice
'@ice/runtime':
specifier: ^1.5.4
specifier: ^1.5.6
version: link:../runtime
webpack:
specifier: ^5.88.0