应用入口

框架通过调用 runApp 创建渲染整个应用,在创建应用时可以传入应用的全局配置。

配置规范

通过 src/app.ts 对应用进行全局配置,设置路由、运行环境、请求、日志等:

  1. import { runApp, IAppConfig } from 'ice';
  2. const appConfig: IAppConfig = {
  3. app: {},
  4. router: {},
  5. store: {},
  6. request: {},
  7. };
  8. runApp(appConfig);

启动项配置

app 这一项所支持的配置:

  1. import { runApp } from 'ice';
  2. const appConfig = {
  3. app: {
  4. // 可选,默认 ice-container,根节点 id
  5. rootId: 'ice-container',
  6. // 可选,根节点 DOM 元素,更灵活的 rootId
  7. mountNode: document.getElementById('ice-container'),
  8. // 可选,默认 true,是否解析路由组件的查询参数
  9. parseSearchParams: true,
  10. // 可选,默认 false,是否开启 React.StrictMode,icejs 2.0 开始支持
  11. strict: false,
  12. // 可选,自定义添加 Provider
  13. addProvider: ({ children }) => {
  14. return <ConfigProvider>{children}</ConfigProvider>;
  15. },
  16. // 可选,常用于 SSR 场景或者初始化异步获取数据的场景
  17. // 如果返回字段中包含 initialStates 字段将会作为状态管理 store 的初始值
  18. // 如果返回字段中包含 auth 字段将会作为权限管理 auth 的初始值
  19. getInitialData: async() => {
  20. const result = await request();
  21. return result;
  22. },
  23. // 可选,自定义错误边界的 fallback UI
  24. ErrorBoundaryFallback: <div>渲染错误</div>,
  25. // 可选,自定义错误的处理事件
  26. onErrorBoundaryHandler: (error, componentStack) => {
  27. // Do something with the error
  28. },
  29. // 可选,SPA 场景下渲染一个简单组件,不再引入 react-router 的路由系统
  30. // 需要配合设置 build.json 的 router 项为 false
  31. renderComponent: SimpleComponent,
  32. },
  33. };
  34. runApp(appConfig);

配置项说明

app.getInitialData

注意:该能力并不耦合 SSR,在 CSR 场景下依然可以使用

通过该配置项可以在应用渲染前做一些异步的事情,比如获取一些全局数据、读取/设置 Cookie/LocalStorage 等。

全局异步获取数据并消费

src/app 中定义 getInitialData()

  1. import { runApp, request } from 'ice';
  2. const appConfig = {
  3. app: {
  4. + getInitialData: async (ctx) => {
  5. + const { username, age } = await request.get('/api/user');
  6. + const theme = localStorage.getItem('theme');
  7. + // 任意的操作:比如读写 cookie 等
  8. + return { theme, username, age };
  9. + }
  10. },
  11. };

接着在 View 等地方即可通过 getInitialData API 消费这些数据:

  1. // src/pages/Home/index.jsx
  2. import { getInitialData } from 'ice';
  3. export default function Home(props) {
  4. + const initialData = getInitialData();
  5. return (
  6. <>
  7. + 用户名称:{initialData.username}
  8. + 当前主题:{initialData.theme}
  9. </>
  10. );
  11. }

异步设置 Store 的初始状态

参考 设置初始状态

异步设置初始权限数据

参考 初始化权限数据

app.renderComponent

该选项用于自定义应用的渲染入口,大部分情况下不推荐使用该项能力。但是当有以下诉求时可以考虑使用该配置项:

  1. 整个应用不依赖路由,只渲染一个简单的 React 组件
  2. 想脱离框架的路由规范,使用 react-router 原始的 API 编写路由

注意:使用该能力之后,路由页面(如果有)的 SSR 相关能力也会失效。以下是两个场景的使用方式:

1. 渲染一个简单的 React 组件

如果是 SPA 场景则首先需要在 build.json 中禁用路由插件:

  1. {
  2. + "router": false
  3. }

接着配置 app.renderComponent 即可:

  1. runApp({
  2. app: {
  3. renderComponent() {
  4. return <div>整个应用就一个简单组件</div>
  5. }
  6. }
  7. })

使用 react-router 原始的 API 编写路由

icejs 默认将路由能力做了封装,开发者只需要编写对应的路由配置即可,如果希望非常灵活的编写路由,则需要通过该选项。

同上,如果是 SPA 场景则首先需要在 build.json 中禁用路由插件:

  1. {
  2. + "router": false
  3. }

接着配置 app.renderComponent 即可:

  1. import { runApp } from 'ice';
  2. import { Router, Switch, Route } from 'react-router-dom';
  3. import Home from '@/pages/Home';
  4. function App() {
  5. return (
  6. <Router>
  7. <Switch>
  8. <Route path="/home" component={Home} />
  9. </Switch>
  10. <Router/>
  11. )
  12. }
  13. runApp({
  14. app: {
  15. renderComponent() {
  16. return <App />;
  17. }
  18. }
  19. });