# umi-plugin-react
这是官方封装的一个插件集,包含 18 个常用的进阶功能。
# 安装
$ yarn add umi-plugin-react --dev
# 使用
在 .umirc.js
里配置:
export default {
plugins: [
[
'umi-plugin-react',
{
dva: {
immer: true,
},
antd: true,
routes: {
exclude: [/models\//],
},
polyfills: ['ie9'],
locale: {},
library: 'react',
dynamicImport: {
webpackChunkName: true,
loadingComponent: './components/Loading.js',
},
dll: {
exclude: [],
},
pwa: true,
hd: true,
fastClick: true,
title: 'default title',
chunks: ['vendor', 'umi'],
scripts: [
{ src: 'http://cdn/a.js' },
{ src: '<%= PUBLIC_PATH %>a.js' },
{ content: `alert('a');` },
],
headScripts: [],
metas: [{ charset: 'utf-8' }],
links: [{ rel: 'stylesheet', href: 'http://cdn/a.css' }],
},
],
],
};
# 配置项
所有功能默认关闭,有真值配置才会开启。
# dva
- 类型:
Object
基于 umi-plugin-dva 实现,功能详见 和 dva 一起用。
配置项包含:
immer
,是否启用 dva-immerdynamicImport
,是否启用按需加载,配置项同 #dynamicImport,并且如果在 #dynamicImport 有配置,配置项会继承到 dva 中hmr
,是否启用 dva 的 hmr
注意
如果项目中有 dva 依赖,则优先使用项目中的依赖。
# antd
- 类型:
Boolean
启用后自动配置 babel-plugin-import 实现 antd, antd-mobile 和 antd-pro 的按需编译,并且内置 antd, antd-mobile 依赖,无需手动在项目中安装。
注意
如果项目中有 antd 或者 antd-mobile 依赖,则优先使用项目中的依赖。
# routes
- 类型:
Object
基于 umi-plugin-routes 实现,用于批量修改路由。
配置项包含:
exclude
,值为Array(RegExp)
,用于忽略某些路由,比如使用 dva 后,通常需要忽略 models、components、services 等目录update
, 值为Function
,用于更新路由
# polyfills (已废弃)
- 类型:
Array(String)
请改用 config.targets
基于 umi-plugin-polyfills 实现,用于加各种补丁。
目前支持配置 ['ie9']
、['ie10']
或 ['ie11']
,实现一键兼容。
# locale
- 类型:
Object
基于 umi-plugin-locale 和 react-intl 实现,用于解决 i18n 问题。
配置项包含:
default: 'zh-CN'
, // default zh-CN, if baseSeparator set_
,default zh_CNbaseNavigator: true
, // default true, when it is true, will usenavigator.language
overwrite defaultantd: true
, // use antd, default is truebaseSeparator: '-'
, // the separator betweenlang
andlanguage
, default-
# library
- 类型:
String
可能切换底层库为 preact 或 react。
# dynamicImport
- 类型:
Object
实现路由级的动态加载(code splitting),可按需指定哪一级的按需加载。
配置项包含:
webpackChunkName
,是否通过 webpackChunkName 实现有意义的异步文件名loadingComponent
,指定加载时的组件路径level
,指定按需加载的路由等级
# dll
- 类型:
Object
通过 webpack 的 dll 插件预打包一份 dll 文件来达到二次启动提速的目的。
配置项包含:
include
exclude
# hardSource
hardSource 已经不可用,请在配置文件中移除它。
# pwa
- 类型:
Object
开启 PWA 相关功能,包括:
- 生成
manifest.json
,对于 WebManifest 中引用的icons
图标,建议放在项目根目录public/
文件夹下,最终会被直接拷贝到构建目录中 - 在
PRODUCTION
模式下生成 Service Worker
配置项包含:
manifestOptions
类型:Object
,包含如下属性:srcPath
manifest 的文件路径,类型:String
,默认值为src/manifest.json
(如果src
不存在,为项目根目录)
workboxPluginMode
Workbox 模式,类型:String
,默认值为GenerateSW
即生成全新 Service Worker ;也可选填InjectManifest
即向已有 Service Worker 注入代码,适合需要配置复杂缓存规则的场景workboxOptions
Workbox 配置对象,其中部分重要属性如下:swSrc
类型:String
,默认值为src/service-worker.js
,只有选择了InjectManifest
模式才需要配置swDest
类型:String
,最终输出的文件名,默认值为service-worker.js
或者等于swSrc
中的文件名importWorkboxFrom
类型:String
,默认从 Google CDN 加载 Workbox 代码,可选值'local'
适合国内无法访问的环境
更多关于 Workbox 的使用可以参考官方文档。
一个完整示例如下:
// .umirc.js or config/config.js
export default {
pwa: {
manifestOptions: {
srcPath: 'path/to/manifest.webmanifest',
},
workboxPluginMode: 'InjectManifest',
workboxOptions: {
importWorkboxFrom: 'local',
swSrc: 'path/to/service-worker.js',
swDest: 'my-dest-sw.js',
},
},
};
当 Service Worker 发生更新以及网络断开时,会触发相应的 CustomEvent
。例如当 Service Worker 完成更新时,通常应用会引导用户手动刷新页面,在组件中可以监听 sw.updated
事件:
window.addEventListener('sw.updated', () => {
// 弹出提示,引导用户刷新页面
});
window.addEventListener('sw.registered', e => {
// e.detail.update() 可触发手动更新。
// 配置适当的轮询并配合 sw.updated 事件, 无需用户刷新或打开新选项卡即可更新。
});
另外,当网络环境发生改变时,也可以给予用户显式反馈:
window.addEventListener('sw.offline', () => {
// 置灰某些组件
});
最后 sw.*
事件与 register-service-worker 中的事件同步,更多使用方法请参考上述链接。
# hd
- 类型:
Boolean
或者Object
开启移动端高清 1px 方案,默认情况下,按照 750px 设计稿(1rem=100px)。
// .umirc.js or config/config.js
export default {
hd: true,
};
hd: true
等价于如下配置:
// .umirc.js or config/config.js
export default {
// 等价于 hd: true
hd: {
theme: {
// antd-mobile 高清方案
'@hd': '2px',
},
// more: https://github.com/pigcan/postcss-plugin-px2rem#configuration
px2rem: {
rootValue: 100,
minPixelValue: 2,
},
}
};
同时可以自定义适配方案:
// 默认适配方案,750px 设计稿
// src/hd.(tsx|ts|js|jsx)
import vw from 'umi-hd/lib/vw';
import flex from 'umi-hd/lib/flex';
// Fix document undefined when ssr. #2571
if (typeof document !== 'undefined') {
if (document.documentElement.clientWidth >= 750) {
vw(100, 750);
} else {
flex();
}
// hd solution for antd-mobile@2
// ref: https://mobile.ant.design/docs/react/upgrade-notes-cn#%E9%AB%98%E6%B8%85%E6%96%B9%E6%A1%88
document.documentElement.setAttribute('data-scale', true);
}
# fastClick
- 类型:
Boolean
启用 fastClick,解决移动端点击延迟问题。
# title
- 类型:
String
或者Object
开启 title 插件,设置 HTML title:
配置项包含:
defaultTitle: '默认标题'
, // 必填,当配置项为 String 时直接配置项作为 defaultTitleformat: '{parent}{separator}{current}'
, // default {parent}{separator}{current}, title formatseparator: ' - '
, // default ' - 'useLocale: true
, // default false,是否使用 locale 做多语言支持。如果选true
,则会通过配置的title
属性去locales/*.js
找对应文字
当 title 插件开启后你可以在 routes 配置或者 pages 下的页面组件中配置 title。
比如使用配置式路由的时候如下配置:
// .umirc.js or config/config.js
export default {
routes: [
{
path: '/testpage',
component: './testpage',
title: 'test page',
},
],
};
使用约定式路由的时候则直接在页面组件中配置:
/**
* title: test page
*/
export default () => {
return <div>testpage</div>;
};
在约定式路由里,注释必须写在文件头,否则将不被识别
# 自定义模板 document.ejs
如果你使用了自定的src/pages/document.ejs
,你需要在里面加入<title><%= context.title %></title>
,以确保title.defaultTitle
能正常被注入到生成的index.html
里
# chunks
- 类型:
Array(String)
默认是 ['umi'],可修改,比如做了 vendors 依赖提取之后,会需要在 umi.js 之前加载 vendors.js
比如如下配置:
// .umirc.js or config/config.js
export default {
chainWebpack: function (config, { webpack }) {
config.merge({
optimization: {
minimize: true,
splitChunks: {
chunks: 'all',
minSize: 30000,
minChunks: 3,
automaticNameDelimiter: '.',
cacheGroups: {
vendor: {
name: 'vendors',
test({ resource }) {
return /[\\/]node_modules[\\/]/.test(resource);
},
priority: 10,
},
},
},
}
});
},
plugins: [
['umi-plugin-react', {
chunks: ['vendors', 'umi']
}]
}
# scripts
- 类型:
Array(Object)
或者Array(String)
1.8.0+
放在 <body>
里,在 umi.js 之后,可使用 <%= PUBLIC_PATH %> 指向 publicPath
# headScripts
- 类型:
Array(Object)
或者Array(String)
1.8.0+
放在 <head>
里,在 umi.js 之前,可使用 <%= PUBLIC_PATH %> 指向 publicPath
# metas
- 类型:
Array(Object)
# links
- 类型:
Array(Object)
可使用 <%= PUBLIC_PATH %> 指向 publicPath