前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >umi3升级umi4报错问题汇总,附解决方法

umi3升级umi4报错问题汇总,附解决方法

作者头像
德顺
发布于 2023-08-25 05:29:32
发布于 2023-08-25 05:29:32
4.3K00
代码可运行
举报
文章被收录于专栏:前端资源前端资源
运行总次数:0
代码可运行

Umi v3 升级 Umi v4 遇到一系列问题,整理汇总了一下:

yarn start 报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fatal - TypeError: api.modifyBabelOpts is not a function
    at inspectorPlugin (...\node_modules\react-dev-inspector\plugins\umi\react-inspector.js:18:9)
    at Service.initPlugin (...\node_modules\umi\node_modules\@umijs\core\dist\service\service.js:346:40)
    at Service.run (...\node_modules\umi\node_modules\@umijs\core\dist\service\service.js:223:18)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Service.run2 (...\node_modules\umi\dist\service\service.js:58:12)
    at async ...\node_modules\umi\dist\cli\forkedDev.js:24:5

解决方法:

删除 package.json 中的 react-dev-inspector ,从新 yarn 一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-  "react-dev-inspector": "^1.7.0",

并且要删除配置文件中的相应的插件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   plugins: [
     // https://github.com/zthxxx/react-dev-inspector
-    'react-dev-inspector/plugins/umi/react-inspector',
+    // 'react-dev-inspector/plugins/umi/react-inspector',
   ],

然后又报新的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fatal - AssertionError [ERR_ASSERTION]: Invalid config values: fastRefresh, dva
Invalid value for fastRefresh:
"value" must be a boolean,Invalid value for dva:
"hmr" is not allowed
    at Function.validateConfig (...\node_modules\umi\node_modules\@umijs\core\dist\config\config.js:174:31)
    at Config.getConfig (...\node_modules\umi\node_modules\@umijs\core\dist\config\config.js:60:12)
    at Service.resolveConfig (...\node_modules\umi\node_modules\@umijs\core\dist\service\service.js:280:97)
    at Service.run (...\node_modules\umi\node_modules\@umijs\core\dist\service\service.js:237:50)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Service.run2 (...\node_modules\umi\dist\service\service.js:58:12)
    at async ...\node_modules\umi\dist\cli\forkedDev.js:24:5 {    
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '=='
}

fastRefresh 配置,umi@4 必须是 booleanumi@3 需要是 object 。/config/config.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-  fastRefresh: {},
+  fastRefresh: true,

然后又报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fatal - AssertionError [ERR_ASSERTION]: Invalid config values: dva
Invalid value for dva:
"hmr" is not allowed
    at Function.validateConfig (...\node_modules\umi\node_modules\@umijs\core\dist\config\config.js:174:31)
    at Config.getConfig (...\node_modules\umi\node_modules\@umijs\core\dist\config\config.js:60:12)
    at Service.resolveConfig (...\node_modules\umi\node_modules\@umijs\core\dist\service\service.js:280:97)
    at Service.run (...\node_modules\umi\node_modules\@umijs\core\dist\service\service.js:237:50)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Service.run2 (...\node_modules\umi\dist\service\service.js:58:12)        
    at async ...\node_modules\umi\dist\cli\forkedDev.js:24:5 {
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '=='
}

其实仔细阅读官方文档可以规避上面两个问题:

umi@4 不再支持 hmr 参数,存在的差异项如下 /config/config.ts :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { defineConfig, utils } from 'umi';
 
export default defineConfig({
-  fastRefresh: {},
+  fastRefresh: true,
  dva: {
   // 不再支持 hmr 这个参数
-    hmr: true,
   },
// 默认 webpack5
-   webpack5: {},
})

还会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fatal - AssertionError [ERR_ASSERTION]: Invalid config keys: devServer, dynamicImport, esbuild, nodeModulesTransform, exportStatic, inspectorConfig
    at Function.validateConfig (...\node_modules\umi\node_modules\@umijs\core\dist\config\config.js:179:31)
    at Config.getConfig (...\node_modules\umi\node_modules\@umijs\core\dist\config\config.js:60:12)
    at Service.resolveConfig (...\node_modules\umi\node_modules\@umijs\core\dist\service\service.js:280:97)
    at Service.run (...\node_modules\umi\node_modules\@umijs\core\dist\service\service.js:237:50)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async Service.run2 (...\node_modules\umi\dist\service\service.js:58:12)        
    at async ...\node_modules\umi\dist\cli\forkedDev.js:24:5 {
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '=='
}

这个的意思是说,有一些无效配置,在 umi@4 中已经被剔除或者是默认开启,不需再配置了,我直接把 /config/config.dev.ts 文件删掉了,然后把 /config/config.ts 中的这些配置项删掉。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default defineConfig({
-  devServer: {
-    headers: {
-      'Access-Control-Allow-Origin': '*',
-    },
-  },
-  dva: {
-    hmr: true,
-  },
-  dynamicImport: {
-    loading: '@ant-design/pro-layout/es/PageLoading',
-  },
-  esbuild: {},
-  nodeModulesTransform: { type: 'none' },
-  exportStatic: {},
});

然后报了一堆 less 文件的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error - ./src/global.less.webpack[javascript/auto]!=!./node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[5].oneOf[1].use[1]!./node_modules/@umijs/bundler-webpack/compiled/postcss-loader/index.js??ruleSet[1].rules[5].oneOf[1].use[2]!./node_modules/@umijs/bundler-webpack/compiled/less-loader/index.js??ruleSet[1].rules[5].oneOf[1].use[3]!./src/global.less
Module build failed (from ./node_modules/css-loader/dist/cjs.js):
ValidationError: Invalid options object. CSS Loader has been initialized using an options object that does not match the API schema.
 - options has an unknown property 'localsConvention'. These properties are valid:
   object { url?, import?, modules?, sourceMap?, importLoaders?, esModule?, exportType? }   
    at validate (...\node_modules\@umijs\bundler-webpack\compiled\webpack\index.js:47119:11)
    at Object.getOptions (...\node_modules\@umijs\bundler-webpack\compiled\webpack\index.js:82998:19)
    at Object.loader (...\node_modules\css-loader\dist\index.js:31:27)

这里还需要把 cssLoader 属性删掉 /config/config.ts :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-  cssLoader: {
-    localsConvention: 'camelCase',
-  },

还可能会报 @umijs/plugin-access 的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error - ./src/.umi/plugin-access/runtime.tsx:11:0-43
Module not found: Error: Can't resolve '@@/plugin-model' in '...\src\.umi\plugin-access'

安装 @umijs/plugin-access

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# npm
npm install @umijs/plugin-access --save
# or yarn 
yarn add @umijs/plugin-access

不过这里的根源应该不是确实依赖,根据报错信息,找到 src/.umi/plugin-access/runtime.tsx 文件,可以看到引入了 @@/plugin-model

我费了半天劲,在 github umi 仓库找到一个 issue :umi4,qiankun没有导出useModel

使用 useModel 要使用 @umijs/max 或者加载 model 插件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add @umijs/plugins

/config/config.ts

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default {
  plugins: [
    '@umijs/plugins/dist/model'
  ],
  model: {}
};

这时肯定会报下面的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
modules/@umijs/plugins/dist/model.js, plugin from .../node_modules/@umijs/plugins/dist/model.js register failed.
    at Service.initPlugin (...\node_modules\@umijs\core\dist\service\service.js:312:31)
    at Service.run (...\node_modules\@umijs\core\dist\service\service.js:223:18)     at processTicksAndRejections (node:internal/process/task_queues:96:5)    at async Service.run2 (...\node_modules\umi\dist\service\service.js:58:12)   
    at async ...\node_modules\umi\dist\cli\forkedDev.js:24:5 {  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '=='
}

使用 @umi/max 的话 不需要加插件配置,只需要加 model: {} ,官方文档也有说明。

嗯,继续报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fatal - Error: ENOTEMPTY: directory not empty, rmdir '...\src\.umi\core'
    at Object.rmdirSync (node:fs:1167:10)
    at rmkidsSync (...\node_modules\@umijs\utils\compiled\rimraf\index.js:1:38989)
    at rmdirSync (...\node_modules\@umijs\utils\compiled\rimraf\index.js:1:38827)
    at rimrafSync (...\node_modules\@umijs\utils\compiled\rimraf\index.js:1:38448)
    at ...\node_modules\@umijs\utils\compiled\rimraf\index.js:1:38909
    at Array.forEach (<anonymous>)
    at rmkidsSync (...\node_modules\@umijs\utils\compiled\rimraf\index.js:1:38897)
    at rmdirSync (...\node_modules\@umijs\utils\compiled\rimraf\index.js:1:38827)
    at Function.rimrafSync [as sync] (...\node_modules\@umijs\utils\compiled\rimraf\index.js:1:38448)
    at Command.fn (...\node_modules\@umijs\preset-umi\dist\commands\dev\dev.js:68:27) {
  errno: -4051,
  syscall: 'rmdir',
  code: 'ENOTEMPTY',
  path: 'D:\\Pansoft\\fmis-apps\\main\\src\\.umi\\core'
}

删除 src/.umi 文件夹。

继续报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
error - AssertionError [ERR_ASSERTION]: filePath not found of umi-request
    at Dep.buildExposeContent (...\node_modules\@umijs\mfsu\dist\dep\dep.js:70:31)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async DepBuilder.writeMFFiles (...\node_modules\@umijs\mfsu\dist\depBuilder\depBuilder.js:154:23)
    at async DepBuilder.build (...\node_modules\@umijs\mfsu\dist\depBuilder\depBuilder.js:132:7)
    at async MFSU.buildDeps (...\node_modules\@umijs\mfsu\dist\mfsu\mfsu.js:200:5) {
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: null,
  expected: true,
  operator: '=='
}
Error: ENOENT: no such file or directory, open '...\node_modules\.cache\mfsu\mf-va_remoteEntry.js'
    at Object.openSync (node:fs:585:3)
    at readFileSync (node:fs:453:35)
    at ...\node_modules\@umijs\mfsu\dist\mfsu\mfsu.js:225:56
    at DepBuilder.onBuildComplete (...\node_modules\@umijs\mfsu\dist\depBuilder\depBuilder.js:147:7)
    at ...\node_modules\@umijs\mfsu\dist\mfsu\mfsu.js:219:27
    at Layer.handle [as handle_request] (...\node_modules\@umijs\bundler-utils\compiled\express\index.js:171:647)
    at trim_prefix (...\node_modules\@umijs\bundler-utils\compiled\express\index.js:164:2659)
    at ...\node_modules\@umijs\bundler-utils\compiled\express\index.js:164:2215  
    at Function.process_params (...\node_modules\@umijs\bundler-utils\compiled\express\index.js:164:2798)
    at next (...\node_modules\@umijs\bundler-utils\compiled\express\index.js:164:2115)

确认 umi 和相关插件的依赖是否最新,这里我安装一下 umi-presets-pro 就可以了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add umi-presets-pro -D

可以正常运行了,继续报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Unhandled Rejection (Error): register failed, invalid key initialStateConfig from plugin .../src/app.tsx.

这里需要在配置里面启用一下 initialState , /config/config.ts :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default defineConfig({
  hash: true,
  model: {},
  request: {},
+ initialState: {},
  antd: {},
  ...
})

还会报错的话,检查一下 src/app.tsx ,将 initialStateConfig 删除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- /** 获取用户信息比较慢的时候会展示一个 loading */
- export const initialStateConfig = {
-   loading: <PageLoading />,
- };

写在 /config/config.ts 里面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-  initialState: {},
+  initialState: {
+    loading: 'src/components/PageLoading',
+  },

启动命令:

如果使用了 @umijs/max 可以使用 max 命令来替换 umimax devmax build 等。

umi@4 将一些项目前置操作放到了 setup 命令中,如 umi@3 中的 umi g tmp 等命令,需要使用 max setup 替换。

package.json:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "scripts": {
    "build": "umi build",
    "build": "max build",
    "postinstall": "umi g tmp",
    "postinstall": "max setup",
    "start": "umi dev",
    "start": "max dev",
  }
}

未经允许不得转载:w3h5-Web前端开发资源网 » umi3升级umi4报错问题汇总,附解决方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JS 数组、对象的深拷贝
以上是简单数组、对象的深拷贝方法,但是对于二维数组、对象数组、对象里包含对象,以上方法均达不到深拷贝方法
Krry
2019/04/23
8.4K0
JavaScript之深拷贝和浅拷贝
工作中会经常遇到操作数组、对象的情况,你肯定会将原数组、对象进行‘备份’ 当真正对其操作时发现备份的也发生改变,此时你一脸懵逼,到时是为啥,不是已经备份了么,怎么备份的数组、对象也会发生变化。 如果你对拷贝原理理解的不透彻,此文或许能提供一点帮助。
Jack Chen
2018/12/13
5220
JavaScript之深拷贝和浅拷贝
前端的浅拷贝和深拷贝区别_解构赋值是深拷贝还是浅拷贝
对于浅拷贝来说,比如一个数组(数组是一种对象),只要我们修改了一个拷贝数组,那么原数组也会改变!
全栈程序员站长
2022/11/14
4930
前端的浅拷贝和深拷贝区别_解构赋值是深拷贝还是浅拷贝
day035: JS中浅拷贝的手段有哪些?
这是直接赋值的情况,不涉及任何拷贝。当改变newArr的时候,由于是同一个引用,arr指向的值也跟着改变。
用户3806669
2021/03/11
8420
js对象的直接赋值、浅拷贝与深拷贝
最近Vue项目中写到一个业务,就是需要把对话框的表单中的数据,每次点击提交之后,就存进一个el-table表格中,待多次需要的表单数据都提交进表格之后,再将这个表格提交,实现多个表单数据的同时提交,期间还可以用表格进行预览、修改等其他操作。将每个表单数据存进表格的代码大致代码如下:
OwenZhang
2021/12/08
4.4K0
js对象的直接赋值、浅拷贝与深拷贝
前端开发知识汇总--JS
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/67642677
j_bleach
2019/07/02
1.3K0
一文搞懂JS中的赋值·浅拷贝·深拷贝
为什么写拷贝这篇文章?同事有一天提到了拷贝,他说赋值就是一种浅拷贝方式,另一个同事说赋值和浅拷贝并不相同。我也有些疑惑,于是我去MDN搜一下拷贝相关内容,发现并没有关于拷贝的实质概念,没有办法只能通过实践了,同时去看一些前辈们的文章总结了这篇关于拷贝的内容,本文也属于公众号【程序员成长指北】学习路线中【JS必知必会】内容。
coder_koala
2019/07/30
3.2K0
一文搞懂JS中的赋值·浅拷贝·深拷贝
理解JS的深浅拷贝以及深度拷贝解决双向绑定的问题
浅度拷贝保存了一个指向该对象的指针,所有的操作都是对该引用的操作,所以对对象的修改会影响其他的复制对象。
前端迷
2018/12/06
7550
搞不懂JS中赋值·浅拷贝·深拷贝的请看这里
百科定义:拷贝就是拷贝指向对象的指针,意思就是说:拷贝出来的目标对象的指针和源对象的指针指向的内存空间是同一块空间,浅拷贝只是一种简单的拷贝,让几个对象公用一个内存,然而当内存销毁的时候,指向这个内存空间的所有指针需要重新定义,不然会造成野指针错误。
Tz一号
2020/09/10
8030
​深度解析Python的赋值、浅拷贝、深拷贝
拷贝 就是把原数据复制一份,在复制的数据上随意改动不会影响到其原数据。也就是这里讲的深拷贝。
忆想不到的晖
2021/04/04
5K0
ES6复制拷贝数组,对象,json数组
数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。
TimothyJia
2019/11/12
2.3K0
javascript关于浅拷贝、深拷贝解析应用,数组的深拷贝
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情
鳄鱼儿
2024/05/22
1190
javascript关于浅拷贝、深拷贝解析应用,数组的深拷贝
js 数组对象深拷贝
formData本来是父组件传过来的,但是我不想直接用,于是我直接赋值给一个formDataCopy的对象。
Daotin
2019/08/12
4.8K0
js基础之数据类型和拷贝
了解数据类型前先说说栈(stack)和堆(heap) *** stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小也不一定会自动释放 ***
用户1974410
2022/09/20
3470
js基础之数据类型和拷贝
python按引用赋值和深、浅拷贝
在计算机语言中,有两种赋值方式:按引用赋值、按值赋值。其中按引用赋值也常称为按指针传值(当然,它们还是有点区别的),后者常称为拷贝副本传值。它们的区别,详细内容参见:按值传递 vs. 按指针传递。
py3study
2020/01/20
7680
js浅拷贝和深拷贝的区别_前端面试深拷贝和浅拷贝
基本数据类型:Boolean、String、Number、null、undefined 引用数据类型:Object、Array、Function、RegExp、Date等
全栈程序员站长
2022/11/15
1.1K0
js浅拷贝和深拷贝的区别_前端面试深拷贝和浅拷贝
js深拷贝和浅拷贝具体使用区别_es6深拷贝和浅拷贝
对于这个问题,可以考虑从深拷贝和浅拷贝的使用或者起源说起,也就是为什么会出现这个问题。
全栈程序员站长
2022/08/04
6650
【前端芝士树】浅拷贝、深拷贝以及Object.assign()的作用、克隆对象、复制数组
基本类型值是指在栈内存保存的简单数据段,在复制基本类型值的时候,会开辟出一个新的内存空间,将值复制到新的内存空间,举个栗子:
CloudCat
2019/05/26
1.9K0
前端面试(8)拷贝
js 的基本数据类型的赋值,就是值传递。引用类型对象的赋值是将对象地址的引用赋值。这时候修改对象中的属性或者值,会导致所有引用这个对象的值改变。如果想要真的复制一个新的对象,而不是复制对象的引用,就要用到对象的深拷贝。
leader755
2022/03/09
3270
前端面试(8)拷贝
JavaScript数组(对象)的深拷贝和浅拷贝
在JavaSCript中的数据类型中,分为两种:原始类型(number/string/boolean/null/undefined)和引用类型(array/object/function)。
celineWong7
2020/11/05
2.4K0
推荐阅读
相关推荐
JS 数组、对象的深拷贝
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验