Skip to content

Commit

Permalink
Merge branch 'release/next' into feat/unocss
Browse files Browse the repository at this point in the history
  • Loading branch information
ClarkXia committed Nov 28, 2023
2 parents fc8ce1f + 92157d8 commit 08a7c19
Show file tree
Hide file tree
Showing 10 changed files with 153 additions and 91 deletions.
5 changes: 5 additions & 0 deletions .changeset/nice-vans-float.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ice/runtime': patch
---

feat: support pre render ssr
5 changes: 5 additions & 0 deletions .changeset/proud-buckets-beg.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'rax-compat': patch
---

default export support
2 changes: 1 addition & 1 deletion packages/bundles/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"ansi-html-community": "^0.0.8",
"html-entities": "^2.3.2",
"core-js": "3.32.0",
"caniuse-lite": "^1.0.30001431",
"caniuse-lite": "^1.0.30001561",
"chokidar": "3.5.3",
"esbuild": "^0.17.16",
"events": "3.3.0",
Expand Down
46 changes: 46 additions & 0 deletions packages/rax-compat/src/exports.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import { createElement } from './create-element.js';
import render from './render.js';
import {
useState,
useContext,
useEffect,
useLayoutEffect,
useRef,
useCallback,
useMemo,
useReducer,
useImperativeHandle,
} from './hooks.js';
import Fragment from './fragment.js';
import { forwardRef, createRef } from './ref.js';
import { Component, PureComponent, memo } from './component.js';
import { createContext } from './context.js';
import shared from './shared.js';

// Mocked version for rax.
const version = '1.2.2-compat';

export {
Component,
Fragment,
PureComponent,
createContext,
createElement,
createRef,
forwardRef,
memo,
render,

// This is mocked object for rax compatible.
shared,
useCallback,
useContext,
useEffect,
useImperativeHandle,
useLayoutEffect,
useMemo,
useReducer,
useRef,
useState,
version,
};
51 changes: 3 additions & 48 deletions packages/rax-compat/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,50 +1,5 @@
import { createElement } from './create-element.js';
import render from './render.js';
import {
useState,
useContext,
useEffect,
useLayoutEffect,
useRef,
useCallback,
useMemo,
useReducer,
useImperativeHandle,
} from './hooks.js';
import Fragment from './fragment.js';
import { forwardRef, createRef } from './ref.js';
import { Component, PureComponent, memo } from './component.js';
import { createContext } from './context.js';
import shared from './shared.js';
import * as Rax from './exports.js';

// Mocked version for rax.
const version = '1.2.2-compat';
export * from './exports.js';

export {
Component,
Fragment,
PureComponent,

createContext,
createElement,
createRef,
forwardRef,
memo,

render,

// This is mocked object for rax compatible.
shared,

useCallback,
useContext,
useEffect,
useImperativeHandle,
useLayoutEffect,
useMemo,
useReducer,
useRef,
useState,

version,
};
export default Rax;
15 changes: 12 additions & 3 deletions packages/runtime/src/Document.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ interface DocumentContext {
main: React.ReactNode | null;
}

declare global {
interface Window {
renderAssets: string[];
}
}

const Context = React.createContext<DocumentContext | undefined>(undefined);

Context.displayName = 'DocumentContext';
Expand Down Expand Up @@ -137,8 +143,7 @@ export const Scripts: ScriptsType = (props: ScriptsProps) => {
);
};

export function usePageAssets() {
const { loaderData, matches, assetsManifest } = useAppContext();
export function getAllAssets(loaderData, matches, assetsManifest): Array<string> {
const routeLinks = getLinks(matches, loaderData);
const routeScripts = getScripts(matches, loaderData);
const pageAssets = getPageAssets(matches, assetsManifest);
Expand All @@ -150,10 +155,14 @@ export function usePageAssets() {
if (assetsManifest.dataLoader) {
assets.unshift(`${assetsManifest.publicPath}${assetsManifest.dataLoader}`);
}

return assets;
}

export function usePageAssets() {
const { loaderData, matches, assetsManifest } = useAppContext();
return getAllAssets(loaderData, matches, assetsManifest);
}

interface DataProps {
ScriptElement?: React.ComponentType<React.ScriptHTMLAttributes<HTMLScriptElement>> | string;
}
Expand Down
17 changes: 10 additions & 7 deletions packages/runtime/src/runServerApp.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import type { ServerResponse, IncomingMessage } from 'http';
import * as React from 'react';
import type { RenderToPipeableStreamOptions } from 'react-dom/server';
import * as ReactDOMServer from 'react-dom/server';
import type { Location } from 'history';
import { parsePath } from 'history';
import { isFunction } from '@ice/shared';
import type { RenderToPipeableStreamOptions, OnAllReadyParams, NodeWritablePiper } from './server/streamRender.js';
import type {
AppContext, RouteItem, ServerContext,
AppExport, AssetsManifest,
AppExport,
AssetsManifest,
RouteMatch,
PageConfig,
RenderMode,
Expand All @@ -25,7 +26,6 @@ import { DocumentContextProvider } from './Document.js';
import { loadRouteModules } from './routes.js';
import type { RouteLoaderOptions } from './routes.js';
import { pipeToString, renderToNodeStream } from './server/streamRender.js';
import type { NodeWritablePiper } from './server/streamRender.js';
import getRequestContext from './requestContext.js';
import matchRoutes from './matchRoutes.js';
import getCurrentRoutePath from './utils/getCurrentRoutePath.js';
Expand All @@ -34,7 +34,7 @@ import { renderHTMLToJS } from './renderHTMLToJS.js';
import addLeadingSlash from './utils/addLeadingSlash.js';


interface RenderOptions {
export interface RenderOptions {
app: AppExport;
assetsManifest: AssetsManifest;
createRoutes: (options: Pick<RouteLoaderOptions, 'requestContext' | 'renderMode'>) => RouteItem[];
Expand Down Expand Up @@ -191,8 +191,8 @@ export async function renderToResponse(requestContext: ServerContext, renderOpti
console.error('PipeToResponse error.');
console.error(err);
},
onAllReady: () => {
onAllReady && onAllReady();
onAllReady: (params: OnAllReadyParams) => {
onAllReady && onAllReady(params);
resolve();
},
});
Expand Down Expand Up @@ -416,7 +416,10 @@ async function renderServerEntry(
</AppContextProvider>
);

const pipe = renderToNodeStream(element);
const pipe = renderToNodeStream(element, {
renderOptions,
routerContext,
});

const fallback = () => {
return renderDocument({
Expand Down
43 changes: 41 additions & 2 deletions packages/runtime/src/server/streamRender.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,35 @@
import * as Stream from 'stream';
import type * as StreamType from 'stream';
import * as ReactDOMServer from 'react-dom/server';
import type { RenderToPipeableStreamOptions } from 'react-dom/server';
import { getAllAssets } from '../Document.js';
import type { RenderOptions } from '../runServerApp.js';
import type { ServerAppRouterProps } from '../types.js';

const { Writable } = Stream;

export interface OnAllReadyParams {
renderAssets: string[];
}
export type OnAllReady = (OnAllReadyParams) => void;
export interface RenderToPipeableStreamOptions {
onShellReady?: () => void;
onShellError?: (error: unknown) => void;
onAllReady?: OnAllReady;
onError?: (error: unknown) => void;
}

export type NodeWritablePiper = (
res: StreamType.Writable,
options?: RenderToPipeableStreamOptions,
) => void;

export type RenderToNodeStreamOptions = {
renderOptions: RenderOptions;
routerContext: ServerAppRouterProps['routerContext'];
};
export function renderToNodeStream(
element: React.ReactElement,
renderToNodeStreamOptions: RenderToNodeStreamOptions,
): NodeWritablePiper {
return (res, options) => {
const { pipe } = ReactDOMServer.renderToPipeableStream(element, {
Expand All @@ -26,7 +44,28 @@ export function renderToNodeStream(
options?.onError && options?.onError(error);
},
onAllReady() {
options?.onAllReady && options?.onAllReady();
const {
renderOptions,
routerContext,
} = renderToNodeStreamOptions;

const {
assetsManifest,
} = renderOptions;

const {
matches,
loaderData,
} = routerContext;

let renderAssets = getAllAssets(loaderData, matches, assetsManifest);
if (typeof window !== 'undefined' && window.renderAssets) {
renderAssets = renderAssets.concat(window.renderAssets);
}

options?.onAllReady && options?.onAllReady({
renderAssets,
});
},
});
};
Expand Down
2 changes: 1 addition & 1 deletion packages/shared-config/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"dependencies": {
"@ice/bundles": "0.1.17",
"@rollup/pluginutils": "^4.2.0",
"browserslist": "^4.19.3",
"browserslist": "^4.22.1",
"consola": "^2.15.3",
"fast-glob": "^3.2.11",
"process": "^0.11.10"
Expand Down
Loading

0 comments on commit 08a7c19

Please sign in to comment.