整理日常咨询常被问到的问题,欢迎补充。
配置 splitChunks,比如:
export default {
plugins: [
['umi-plugin-react', {
dynamicImport: {
webpackChunkName: true,
},
}],
],
chainWebpack(config) {
config.optimization.splitChunks({
cacheGroups: {
styles: {
name: 'styles',
test: /\.(css|less)$/,
chunks: 'async',
minChunks: 1,
minSize: 0,
}
},
});
},
}
打包后会输出:
File sizes after gzip:
126.85 KB dist/umi.js
535 B dist/p__users.async.js
533 B dist/p__index.async.js
337 B dist/styles.async.js
96 B dist/styles.chunk.css
示例:
参考:

代理只是服务请求代理,这个地址是不会变的。
原理可以简单的理解为,在本地启了一个服务,你先请求了本地的服务,本地的服务转发了你的请求到实际服务器。所以你在浏览器上看到的请求地址还是http://localhost:8000/xxx 。以服务端是否收到请求为准
CLEAN
dynamicImport.loadingComponent 后外层报错不生效怎么办?组件报错有两种形式:
1)
a(); // 出错
export default () => <>..</>;
2)
export default () => {
a(); // 出错
return <>..</>;
}
第二种不管怎么样都能正常抛错,第一种在开启 dynamicImport 并配置了 loadingComponent 时可能会不生效。
比如 loadingComponent 指向的文件内容为:
export default () => <>loading...</>
那么出错时也会只显示 loading... 。
loadingComponent 处理出错场景,比如:
export default class extends React.PureComponent {
render() {
if (process.env.NODE_ENV === 'development' && this.props.error) {
console.error(this.props.error.stack);
return <div>{this.props.error.stack}</div>;
}
return <div>loading...</div>;
}
};
这是因为 html 和 umi.js 的端口不一致。
比如:
然后你访问 html,并且在 html 里引用了 8000 端口的 umi.js,这样会导致 socket server 连接出错,触发了循环刷新问题。
配置 SOCKET_SERVER 到 umi dev 所在端口,比如 SOCKET_SERVER=8000 umi dev。(windows 下是 set SOCKET_SERVER=8000&&umi dev`)
给 dynamicImport 配置加上 loadingComponent: '() => <></>',比如:
export default {
plugins: [
['umi-plugin-react', {
dynamicImport: { loadingComponent: '() => <></>' },
}],
]
}
编辑 config/config.js,搜索 chainWebpack 并注释掉。
@xiaohuoni运行的时候有打印:
App running at:
- Local: http://localhost:8000/
- Network: http://192.168.199.147:8000/
需同时配置 urlLoaderExcludes,比如 md 用 raw-loader 的配置,
export default {
urlLoaderExcludes: [
/\.md$/,
],
chainWebpack(config) {
config.module.rule('md')
.test(/\.md$/)
.use('raw')
.loader('raw-loader')
}
}
推荐用 context 或者数据流方案,如果用 cloneElement 传值需要传两级,因为第一级是 Switch,然后才是 Route。
React.Children.map(children, child => {
return React.cloneElement(child, null, React.Children.map(child.props.children, child => {
return React.cloneElement(child, { test: 'test' });
}));
})
参考:
编辑 config/config.js,搜索 chainWebpack 并注释掉。
If the compilation is slow or gets stuck at 95%, go to config/config.js and then comment out chainWebpack.
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
eslint提示不显示具体哪个文件???

如何配置额外的 loader
需同时配置
urlLoaderExcludes,比如 md 用 raw-loader 的配置,export default { urlLoaderExcludes: [ /\.md$/, ], chainWebpack(config) { config.module.rule('md') .test(/\.md$/) .use('raw') .loader('raw-loader') } }
我在文档中找不到相关描述,请教一下如何配置rules的enforce,例如与下面的webpack配置等价的配置方法:
module.exports = {
module: {
rules: [
{
test: /\.js$/,
use: ["source-map-loader"],
enforce: "pre"
}
]
}
};
我在仓库源码中找到一条配置作为参考:
https://github.com/umijs/umi/blob/dcbd5d8cd470f10102044d044b16aca7670dd955/packages/af-webpack/src/getConfig/eslint.js#L22
但是并没有生效,仍然看不到sourcemap:
config.module.rule('source-map-loader')
.test(/\.js$/)
.enforce('pre')
.use('source-map-loader')
.loader('source-map-loader')
感觉现在ie下的错误,都是因为这个问题引起的。

主要是是否需要兼容旧版本不支持 es6 的浏览器,
minimizer 为 terserjs检查 targets 配置,确认是否有包含旧版本浏览器比如,
{
targets: { ie: 10 },
}
尝试构建,如果没有问题,则不用再执行下一步。
比如前面的,
># 如果你用 umi
$ COMPRESS=none umi build
# 如果你用 bigfish
$ COMPRESS=none bigfish build
找 vendors.async.js 的 193 行,看下是哪个包出错的,记录包名和版本号。
node_modules/es5-imcompatible-versions/package.json 文件,写入刚刚出错的包名和版本号。"antd-table-infinity": {
"^1.1.2": {
"version": "^1.1.2",
"reason": "https://github.com/Leonard-Li777/antd-table-infinity/blob/master/src/components/Table/InfinityTable/index.jsx#L7"
}
}
1、在编辑里面,把你刚才的修改,在这里也修改一下。
2、修改完,页面拉到最下方。创建一个分支(可能会是自动创建分支的情况,如果没得选择,这里不理会就好)点击绿色按钮 Propose file change

3、在跳转后的页面,点击绿色按钮 Create pull request

如:https://github.com/umijs/es5-imcompatible-versions/pull/36
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
umi 好像不支持 react.lazy,如果支持的话,怎样把 lazy 的组件单独打包成 async 的包?
有一个IE9以下浏览器没有获取到css样式的问题,项目用的umi+dva+antd,配置了按需加载。查找了一下打包完的dist文件夹,发现一个vendors.chunk.css文件,好像是antd库的打包。不知道是不是因为它有300多kb所以ie9无法读取,想请问一下:
1.umi-plugin-react这个插件下 的chunk项配置是什么意思,是否是用于css切割的
2.css-split-webpack-plugin这个插件如何在umi项目中使用
打包这部分不是很熟悉,半天没解决这个问题,希望赐教
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
如何声明路由参数类型?https://github.com/umijs/umi/issues/3983,路由参数捕获声明类型遇到问题,参照 react-router 的文档 也没有解决
ant design 4.0 发布了,umi create 创建的 pro项目模板啥时候更新下啊
我在仓库源码中找到一条配置作为参考:
https://github.com/umijs/umi/blob/dcbd5d8cd470f10102044d044b16aca7670dd955/packages/af-webpack/src/getConfig/eslint.js#L22但是并没有生效,仍然看不到sourcemap:
config.module.rule('source-map-loader') .test(/\.js$/) .enforce('pre') .use('source-map-loader') .loader('source-map-loader')
同样的问题,因为 umi 的依赖包比如 dva 是通过 father 编译的,本来就不带 sourcemap,编译的时候像 react-redux 这种库并没有编译进去
基于@umijs/plugin-layout 的侧边栏菜单配置中的icon是否能支持本地图片或者svg?,如果使用antd的icon打包下来的icon贼大。
我记得哪里看到说是可以按需加载?
@xiaohuoni 这里的问题整理到 https://umijs.org/zh-CN/docs/faq 吧。
有群地址吗
有群地址吗
首页,底部 https://umijs.org/
Most helpful comment