整理 Vue2 项目中各种报错&警告-信息

本文记录了在Vue2项目开发中遇到的一些典型错误,如404请求错误、数组方法使用不当、计算属性缺失setter、未知组件注册问题以及Vue Router和浏览器性能警告等,并详细阐述了解决方案,旨在帮助开发者更好地理解和解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

( 1 ) [Vue warn]: Error in v-on handler (Promise/async): "Error: Request failed with status code 404"

( 2 ) [Vue warn]: Error in v-on handler: "TypeError: this.todos.push is not a function"

( 3 ) [Vue warn]: Computed property "IsDisabled" was assigned to but it has no setter.

( 4 ) [Vue warn]: Unknown custom element: - did you register the component correctly? For recursive components, make sure to provide the "name" option.

一、[vue-router] 's tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning :

二、[Violation] Addad non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.

三、路由跳转错误:Uncaught (in promise) Error: Redirected when going from "/..." to "/..." via a navigation guard.

四、[WDS] Disconnected!


自己平常 Vue2 项目 中出现的一些 Bug 和 警告⚠️ , 日常记录一下 : 

( 1 ) [Vue warn]: Error in v-on handler (Promise/async): "Error: Request failed with status code 404"

GET 发送 请求 报错 :

[Vue warn]: Error in v-on handler (Promise/async): "Error: Request failed with status code 404"

vue.config.js

// 此文件是 Vue 暴露给开发者来对 webpack 进行增量配置
// 此文件是给 NodeJs 运行 , 所以它使用 commonjs 规范
module.exports = {
  // 对于当前 Vue 项目服务器添加一个反向代理服务
  devServer: {
    // 配置代理  代理配置可以设置 n 多个
    proxy: {
      // 以什么样的请求 url 开始我才代理 此 url 一定是相对路径
      // 如果有 http / https ,则代理不生效
      '/api': {
        // 代理到的服务器是谁
        target: 'https://api.iynn.cn/film',
        // 修改 host 请求的域名为目标域名
        changeOrigin: true,
        // 请求 url 和目标 url 有一个对应关系
        // 请求 /api/login => 目标 /v1/api/login
        pathRewrite: { // 过滤 / 重写
          // '^xhl': ''
        }
      },

      'ajax': {
        target: 'https://m.maoyan.com',
        changeOrigin: true,
      }
    }
  }
}

将代理请求地址信息填写正确之后 : 重启一下 Vue 项目

数据请求成功 :


( 2 ) [Vue warn]: Error in v-on handler: "TypeError: this.todos.push is not a function"

调用 Vue 中提供的数组变更方法 ( push ) 完成对于数组数据的修改 时 发生 报错 :

因为 绑定了 v-model 指令的缘故 , 将 todos 数组类型转换成了字符串类型 , 所以 todos 就已经不能再使用 Vue 提供的 数组 变更方法了 , 就会一直报错 : this.todos 不是一个函数  ( 字符串类型不能使用 数组 的 方法 )

 

解决 : 将 input 输入框 上面绑定 的 v-model 指令 删除掉就 OK 了 ,

这样就不会影响到我们的 todos 的 数据类型了 

<!-- 建立一个输入框 -->
<input type="text" placeholder="请输入内容" @keyup.enter='onEnter'>

( 3 ) [Vue warn]: Computed property "IsDisabled" was assigned to but it has no setter.

[Vue warn]:计算属性 “IsDisabled” 已分配给,但它没有 setter。

项目中在 computed 计算属性中定义了一个 IsDisabled ,

但是它的状态是会发生改变的 , 但却只写了 函数 ( 相当于简写的 get )

所以这里控制台提示了报错信息

<el-button plain size="small" type="primary" :disabled="IsDisabled"
      >机构</el-button
    >
computed: {
    // 每个计算属性都包括一个getter(get)和一个setter(set)
    // 在计算属性内填写的函数相当于简写的get
    /* 因为 IsDisabled 值会改变, 所以不能只用下面的写法 */
    // IsDisabled() {
    //   // 计算属性函数中的return不能少
    //   return this.checkList.indexOf("isunlimit" !== -1);
    // },
    IsDisabled: {
      get: function () {
        console.log("调用了get方法");
        return this.checkList.indexOf("isunlimit" !== -1);
      },
      // 只有当 IsDisabled 中的值改变的时候才能触发set,传值的value是 IsDisabled 改变的值
      set: function (value) {
        console.log("调用了的set方法", value);
      },
    },
  },

( 4 ) [Vue warn]: Unknown custom element: <NavBar> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

组件注册不规范导致的报错问题 :

[Vue warn]:未知自定义元素:<NavBar>-是否正确注册了组件?对于递归组件,请确保提供“name”选项。

乍眼一看 , 我的注册步骤是挑不出任何问题滴 。。

但是往往没有问题还出现报错了 , 就很有可能是你的疏忽大意 ,

尤其是 单词写错 !

百度半天 , 试来试去 到都最后也没有解决 ,最后无意间发现

注册组件的单词敲错了啊 !!! 明明是 components , 我写成了 comments

只能说自己可真是瞎了眼啊 。。。


百度 Get 知识点 :

详细报错,可以看到页面渲染出来了




( 5 ) [Vue warn]:


一、[vue-router] <router-link>'s tag prop is deprecated and has been removed in Vue Router 4. Use the v-slot API to remove this warning :

https://router.vuejs.org/guide/migration/#removal-of-event-and-tag-props-in-router-link.

[vue路由器]<路由器链接>'s标记属性已弃用,并已在vue路由器4中删除。使用v-slot API删除此警告:

Migrating from Vue 2 | Vue Router

replace
<router-link to="/about" tag="span" event="dblclick">About Us</router-link>
with
<router-link to="/about" custom v-slot="{ navigate }">
  <span @click="navigate" @keypress.enter="navigate" role="link">About Us</span>
</router-link>
replace
<router-link active-class="back" to="/" tag="div">返 回</router-link>
with
<router-link to="/" custom v-slot="{ navigate }">
  <div class="back" @click="navigate" role="link">返 回</div>
</router-link>

解决方案二 :

replace
<router-link to="/" tag="div" active-class="back">返 回</router-link>
with
<div class="back" @click="goBack">返 回</div>

methods: {
  goBack() {
    this.$router.go(-1)
  }
}

二、[Violation] Addad non-passive event listener to a scroll-blocking 'mousewheel' event. Consider marking event handler as 'passive' to make the page more responsive.

See https://chromestatus.com/feature/5745543795965952

[冲突]将非被动事件侦听器添加到滚动阻止的“鼠标滚轮”事件。考虑将事件处理程序标记为“被动”,以使页面更具响应性。

See Passive event listeners - Chrome Platform Status


三、路由跳转错误:Uncaught (in promise) Error: Redirected when going from "/..." to "/..." via a navigation guard.

未捕获(承诺中)错误:从“/…”开始时重定向至“/…”通过导航卫士。

问题重现及产生原因

  1. 在项目开发中,并不是每一个路由跳转都是明确的。 例如很多页面跳转需要登录判断,如果你有登录,则跳转到指定页面,没有登录则跳转到登录页面。

项目代码:

  1. 项目中, 使用路由跳转页面, this.$router.push() 这个方法, 返回 Promise 对象, 如果不能正常跳转, 内部会抛出错误, 但是这个错误并不影响程序执行, 如果想解决控制台打印报错信息, 有 3 种方法

解决方式一: 投机取巧式

  • 在被路由导航守卫拦截后, 执行代码 console.clear() , 清空控制台的报错信息;
  • 注意: next() 方法是 异步函数, 需要在定时器中添加 console.clear() , 把这个操作添加进异步队列
router.beforeEach((to, from, next)=>{
  if(to.meta.isShow && !getToken()){
    next('/login')
    setTimeout('console.clear()', 300)  
    return
  }
  next()
})

解决方式二: 啰嗦式

// 使用编程式导航跳转时,每次使用,后面都跟上.catch方法,捕获错误信息
this.$router.push('/location').catch(err => ())

解决方式三: 高逼格式 (推荐)

  • 通过重写 VueRouter 原型对象上的 push 方法, 覆盖原来抛出异常的方法, "吞掉"异常
  • 切记: 一定要在 router 创建实例之前
import VueRouter from 'vue-router'

/* 在创建router实例对象之前,手动覆盖原型链的push来吞掉报错catch */
// 先存储默认底层的push
const originPush = VueRouter.prototype.push
// 覆盖原型链的push
VueRouter.prototype.push = function(location,resolve,reject){
    // this:路由实例对象
    
    // 判断用户有没有传后面两个可选参数
    if( resolve || reject ){
      return originPush.call(this,location,resolve,reject)
    }else{// 用户只传了第一个参数
      /* 
      默认底层: catch()方法代码  throw err : 抛出异常
      吞掉报错原理: 重写catch()方法,把默认底层的 throw err给去掉,就不会抛出异常
      */
      return originPush.call(this,location).catch(err => {
        //  throw err
      })
    }
}

const router = new VueRouter({
  routes
})

上述代码简化 :

import VueRouter from 'vue-router'

const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location, resolve, reject) {
    if ( resolve || reject ) return originalPush.call(this, location, resolve, reject)
    return originalPush.call(this, location).catch((e)=>{})
}

四、[WDS] Disconnected!

Vue 项目出现这个错误:[WDS] Disconnected! =>  [文字]已断开!

其实并没有对项目运行本身造成什么实质性的影响,

但是一条红色的提示摆在那里确实不太好看,还是把他给解决掉吧

在网上看好多人说

原因:
因为用了全局代理软件,所以需要将 config/index.js 中
{host:localhost} 改为
{host: 127.0.0.1} 刷新页面即可

但是我用起来并没有奏效,就另外找了一种解决方法:

打开 Application -> LocalStorage ,在 key 上添加 loglevel:webpack-dev-server ,

在 Value 上添加 SILENT 。

刷新页面以后错误就消失了。

( 这个是 webpack 的 热更新 配置 没搞好然后出来的问题,然后加的这个就不让它热更新了,

要么就是再改一下 , 去重新弄一下 webpack ) 


五、

&lt;think&gt;好的,我现在需要解决用户提出的Vue项目在生产构建时卡住且没有报错信息的问题。首先,我要回忆一下常见的导致构建卡住的原因,可能包括资源过大、内存不足、依赖问题、Webpack配置不当等。 首先,用户提到的是生产环境构建卡住,没有报错。这种情况下,通常构建进程没有崩溃,只是停滞了,所以可能需要检查构建过程中的性能瓶颈。比如,是否有大型文件或库被处理,导致Webpack打包时间过长。或者,可能是内存不足导致Node.js进程被终止,但用户说没有报错,所以可能进程还在运行,只是非常缓慢。 接下来,根据引用内容,用户之前提到过Element UI在Vue2中的问题,以及npm依赖版本的问题(引用1、3)。可能依赖版本不一致或某些包版本过新/旧导致构建过程卡住。例如,某些依赖在更新后可能与项目中的其他库不兼容,或者构建工具(如babel、webpack)的版本问题。 另外,用户还提到了使用vue-cli2(引用2),可能项目结构较旧,配置可能需要调整。例如,Webpack的配置可能需要优化,比如增加内存限制,或者排除不必要的文件处理。 可能的解决步骤包括: 1. **检查Node.js和npm版本**:确保与项目兼容,尤其是老旧项目可能对Node版本有要求。如果用户使用的是较新的Node版本,可能需要降级或使用nvm切换。 2. **增加构建内存**:通过Node的--max-old-space-size参数增加内存分配,防止内存不足导致进程卡住。例如,设置成4GB:`node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js build` 3. **检查依赖版本**:根据引用3中的内容,锁定依赖版本,特别是查看是否有依赖使用了^或~导致自动升级到不兼容版本。使用package-lock.json或yarn.lock确保依赖一致性,或者手动指定版本。 4. **分析构建过程**:使用Webpack的统计信息或分析工具,查看哪个阶段耗时最长。例如,运行构建时添加`--report`参数生成报告,或者使用`webpack-bundle-analyzer`检查包大小。 5. **排除第三方插件问题**:特别是Element UI(引用1),可能某个组件或配置导致构建缓慢。尝试注释掉部分代码,逐步排查。 6. **升级或调整构建工具**:如果项目使用旧版vue-cli,可能需要更新相关依赖,或者调整Webpack配置,比如优化loader、分割代码等。 7. **检查终端输出**:虽然用户说没有报错,但可能有一些警告或提示信息被忽略。仔细查看构建时的输出,是否有进度停滞在某个特定步骤,比如UglifyJS压缩阶段,这通常在大文件处理时较慢。 8. **环境问题**:检查CI/CD环境或本地环境的资源限制,比如磁盘空间、CPU使用率等是否导致进程卡住。 现在,需要将这些思路整理成结构化的解决方案,分步骤指导用户排查。同时,结合用户提供的引用内容,特别是关于依赖版本控制的部分,强调锁定版本或检查依赖冲突的重要性。可能还需要建议用户升级vue-cli到较新版本(如果可行),或者调整Webpack配置以优化构建性能。&lt;/think&gt;### 解决Vue项目生产构建卡住且无报错问题的分步指南 #### 1. **检查环境与依赖版本** - **Node.js版本兼容性**:老旧Vue2项目可能仅支持Node.js 14.x或更低版本。使用`node -v`确认版本,若过高则通过`nvm`切换至兼容版本[^2]。 - **锁定依赖版本**:检查`package.json`中是否有依赖使用`^`或`~`符号导致自动升级。参考引用[3],手动指定版本或添加`resolutions`字段强制锁定版本,例如: ```json { &quot;resolutions&quot;: { &quot;webpack&quot;: &quot;4.46.0&quot;, &quot;babel-loader&quot;: &quot;8.2.3&quot; } } ``` #### 2. **增加构建内存限制** - 在构建命令中显式分配更多内存: ```bash node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js build ``` - 若使用npm脚本,修改`package.json`: ```json &quot;scripts&quot;: { &quot;build&quot;: &quot;node --max_old_space_size=4096 node_modules/@vue/cli-service/bin/vue-cli-service.js build&quot; } ``` #### 3. **分析构建过程瓶颈** - **生成构建报告**:通过`--report`参数定位体积过大的模块: ```bash npm run build -- --report ``` 打开生成的`report.html`,使用`webpack-bundle-analyzer`查看模块占比,优化或拆分过大的第三方库(如Element UI组件按需引入)[^1]。 - **检查Webpack配置**:确认是否启用了耗时插件(如`UglifyJsPlugin`),可尝试关闭sourceMap加速构建: ```javascript // vue.config.js module.exports = { productionSourceMap: false } ``` #### 4. **排除第三方依赖问题** - **按需引入组件**:若使用Element UI,全局引入可能导致构建缓慢。改用按需加载: ```javascript import { Button, Table } from &#39;element-ui&#39; Vue.use(Button).use(Table) ``` - **临时注释代码**:逐步注释`main.js`中的插件注册和路由引入,定位卡住阶段。 #### 5. **优化Webpack配置** - **并行处理与缓存**:添加`thread-loader`和`cache-loader`加速构建: ```javascript // vue.config.js chainWebpack: config =&gt; { config.module .rule(&#39;js&#39;) .use(&#39;thread-loader&#39;) .loader(&#39;thread-loader&#39;) .options({ workers: 4 }) } ``` - **排除非必要文件**:如测试文件、文档等: ```javascript module.exports = { configureWebpack: { module: { rules: [ { test: /\.md$/, loader: &#39;ignore-loader&#39; } ] } } } ``` #### 6. **检查环境与日志细节** - **查看完整日志**:添加`--verbose`参数获取详细输出: ```bash npm run build -- --verbose ``` 观察卡在哪个loader或插件步骤(如`babel-loader`处理大型依赖时)。 - **清理缓存**:删除`node_modules/.cache`目录重新构建,避免缓存损坏。 #### 7. **升级构建工具(谨慎操作)** -项目允许,尝试逐步升级到Vue CLI 3+并保留配置: ```bash npm install -g @vue/cli vue upgrade ``` 注意备份原项目,避免直接升级导致兼容问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值