应用入口
框架通过调用 runApp 创建渲染整个应用,在创建应用时可以传入应用的全局配置。
配置规范
通过 src/app.ts 对应用进行全局配置,设置路由、运行环境、请求、日志等:
import { runApp, IAppConfig } from 'ice';const appConfig: IAppConfig = {app: {},router: {},store: {},request: {},};runApp(appConfig);
启动项配置
app 这一项所支持的配置:
import { runApp } from 'ice';const appConfig = {app: {// 可选,默认 ice-container,根节点 idrootId: 'ice-container',// 可选,根节点 DOM 元素,更灵活的 rootIdmountNode: document.getElementById('ice-container'),// 可选,默认 true,是否解析路由组件的查询参数parseSearchParams: true,// 可选,默认 false,是否开启 React.StrictMode,icejs 2.0 开始支持strict: false,// 可选,自定义添加 ProvideraddProvider: ({ children }) => {return <ConfigProvider>{children}</ConfigProvider>;},// 可选,常用于 SSR 场景或者初始化异步获取数据的场景// 如果返回字段中包含 initialStates 字段将会作为状态管理 store 的初始值// 如果返回字段中包含 auth 字段将会作为权限管理 auth 的初始值getInitialData: async() => {const result = await request();return result;},// 可选,自定义错误边界的 fallback UIErrorBoundaryFallback: <div>渲染错误</div>,// 可选,自定义错误的处理事件onErrorBoundaryHandler: (error, componentStack) => {// Do something with the error},// 可选,SPA 场景下渲染一个简单组件,不再引入 react-router 的路由系统// 需要配合设置 build.json 的 router 项为 falserenderComponent: SimpleComponent,},};runApp(appConfig);
配置项说明
app.getInitialData
注意:该能力并不耦合 SSR,在 CSR 场景下依然可以使用
通过该配置项可以在应用渲染前做一些异步的事情,比如获取一些全局数据、读取/设置 Cookie/LocalStorage 等。
全局异步获取数据并消费
在 src/app 中定义 getInitialData():
import { runApp, request } from 'ice';const appConfig = {app: {+ getInitialData: async (ctx) => {+ const { username, age } = await request.get('/api/user');+ const theme = localStorage.getItem('theme');+ // 任意的操作:比如读写 cookie 等+ return { theme, username, age };+ }},};
接着在 View 等地方即可通过 getInitialData API 消费这些数据:
// src/pages/Home/index.jsximport { getInitialData } from 'ice';export default function Home(props) {+ const initialData = getInitialData();return (<>+ 用户名称:{initialData.username}+ 当前主题:{initialData.theme}</>);}
异步设置 Store 的初始状态
参考 设置初始状态
异步设置初始权限数据
参考 初始化权限数据
app.renderComponent
该选项用于自定义应用的渲染入口,大部分情况下不推荐使用该项能力。但是当有以下诉求时可以考虑使用该配置项:
- 整个应用不依赖路由,只渲染一个简单的 React 组件
- 想脱离框架的路由规范,使用 react-router 原始的 API 编写路由
注意:使用该能力之后,路由页面(如果有)的 SSR 相关能力也会失效。以下是两个场景的使用方式:
1. 渲染一个简单的 React 组件
如果是 SPA 场景则首先需要在 build.json 中禁用路由插件:
{+ "router": false}
接着配置 app.renderComponent 即可:
runApp({app: {renderComponent() {return <div>整个应用就一个简单组件</div>}}})
使用 react-router 原始的 API 编写路由
icejs 默认将路由能力做了封装,开发者只需要编写对应的路由配置即可,如果希望非常灵活的编写路由,则需要通过该选项。
同上,如果是 SPA 场景则首先需要在 build.json 中禁用路由插件:
{+ "router": false}
接着配置 app.renderComponent 即可:
import { runApp } from 'ice';import { Router, Switch, Route } from 'react-router-dom';import Home from '@/pages/Home';function App() {return (<Router><Switch><Route path="/home" component={Home} /></Switch><Router/>)}runApp({app: {renderComponent() {return <App />;}}});
