应用入口
框架通过调用 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,根节点 id
rootId: 'ice-container',
// 可选,根节点 DOM 元素,更灵活的 rootId
mountNode: document.getElementById('ice-container'),
// 可选,默认 true,是否解析路由组件的查询参数
parseSearchParams: true,
// 可选,默认 false,是否开启 React.StrictMode,icejs 2.0 开始支持
strict: false,
// 可选,自定义添加 Provider
addProvider: ({ children }) => {
return <ConfigProvider>{children}</ConfigProvider>;
},
// 可选,常用于 SSR 场景或者初始化异步获取数据的场景
// 如果返回字段中包含 initialStates 字段将会作为状态管理 store 的初始值
// 如果返回字段中包含 auth 字段将会作为权限管理 auth 的初始值
getInitialData: async() => {
const result = await request();
return result;
},
// 可选,自定义错误边界的 fallback UI
ErrorBoundaryFallback: <div>渲染错误</div>,
// 可选,自定义错误的处理事件
onErrorBoundaryHandler: (error, componentStack) => {
// Do something with the error
},
// 可选,SPA 场景下渲染一个简单组件,不再引入 react-router 的路由系统
// 需要配合设置 build.json 的 router 项为 false
renderComponent: 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.jsx
import { 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 />;
}
}
});