MPA Mode
Umi supports the traditional MPA mode, under which the src/pages
directory */index.[jt]sx?
files are taken as webpack entries for packing, without routing, history, or umi.js, meeting needs such as H5 development, kitchen plugin development, and so on.
Note: This MPA mode is different from the MPA mode implementation in Umi 3, Umi 4 is true MPA, while Umi 3 mocks the routing rendering mechanism. Each has its pros and cons; Umi 4's MPA will not be able to use a large number of plugin capabilities and is only suitable for use as a build tool.
Usage
mpa is an built-in feature, which can be enabled through configuration.
export default {mpa: {template: string,getConfigFromEntryFile: boolean,layout: string,entry: object,},}
The directory structure of MPA is src/pages/${dir}/index.tsx
, each folder ${dir}
will generate a page, with the folder's index.tsx
as the entry file of the page, see the example at examples/mpa.
Configuration items:
template
: Product HTML template, for example,template/index.html
will start searching from the project root directory, using the corresponding path'sindex.html
as the product HTML template.getConfigFromEntryFile
: Read independent configuration from the entry file (src/*/index.tsx
) of each page.layout
: Global default layout.entry
: Configuration for each entry file, for example,{ foo: { title: '...' } }
can configure thetitle
attribute of thesrc/foo/index.tsx
page.
Conventional Entry Files
The default entry files are src/pages
directory's */index.[jt]sx?
files.
For example:
+ src/pages- foo/index.tsx- bar/index.tsx- hoo.tsx
Then, the entry
structure will be:
{foo: 'src/pages/foo/index.tsx',bar: 'src/pages/bar/index.tsx'}
After building, HTML files corresponding to each entry file will be generated, with the products being foo.html
and bar.html
.
Page-level Configuration
config.json
Conventionally declares configuration through config.json
at the same layer as the entry file, as the following directory structure:
+ src/pages+ foo- index.tsx- config.json
foo/config.json
configures the independent layout
and title
of the page:
{"layout": "@/layouts/bar.ts","title": "foooooo"}
Currently, the default supported configuration items include:
- template: Template path, can refer to the template writing method of html-webpack-plugin, using variables through lodash template syntax.
- layout: Page layout, advised to reference files in the src directory starting with
@/
. - title: Page title, default is the directory name where the entry file is located.
- mountElementId: When rendering the page, the id of the node to be mounted to, default is
root
.
getConfigFromEntryFile
Umi also experimentally supports another way of reading configurations by enabling mpa: { getConfigFromEntryFile: true }
.
In this case, you can avoid using config.json
, and instead, export the page's configuration through export const config
in the entry file.
For example:
// src/pages/foo/index.tsxexport const config = {layout: '@/layouts/bar.ts',title: 'foooooo',}
entry
You can also configure each page in .umirc.ts
:
mpa: {entry: {foo: { title: 'foo title' }}}
On-demand Startup
Supports using env.MPA_FILTER
to specify pages to start, in order to improve build speed:
# file .env# Will only start bar, foo these two pagesMPA_FILTER=bar,foo
Rendering
The default rendering method is React; the entry file just needs to export React components to be rendered, without needing to write the ReactDOM.render
logic by yourself.
export default function Page() {return <div>Hello</div>}
React 18 is enabled by default, if you need React 17 rendering methods, please install React 17 dependencies in your project, the framework will automatically adapt to the React version.
$ pnpm i react@17 react-dom@17
Template
The default template is as follows:
<!DOCTYPE html><html><head><title><%= title %></title></head><body><div id="<%= mountElementId %>"></div></body></html>
Through the template
configuration, you can customize a global HTML template or configure different templates for different pages at the page level. Please ensure that variables at least include <%= title %>
and <%= mountElementId %>
.