Uncaught TypeError:Cannot redefine property: $router报错解决方案

本文介绍了如何解决在使用Vue.js进行项目开发时遇到的$router重复定义的问题。该问题通常发生在通过webpack配置加载外部CDN资源时,在开发环境下也会错误地加载vue-router的情况。文章提供了具体的解决方案,包括如何正确配置vue.config.js以及index.html文件。

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

原因:就如报错提示所描述的,不能重新定义$router,说明是重复定了$router。通常是因为在项目中安装了vue-router的依赖并且用Vue.use()使用了vue-router,还在index.html页面引入了vue-router.js文件。

项目打包优化阶段,为了解决打包成功后,单文件体积过大的问题 ,可以通过 webpack 的 externals 节点,来配置并加载外部的 CDN 资源。

若只在发布阶段配置了externals节点:


  • vue.config.js文件中的配置
config.when(process.env.NODE_ENV === 'production', config => {
            config.entry('app').clear().add('./src/main-prod.js')

            config.set('externals', {
                vue: 'Vue',
                'vue-router': 'VueRouter',
                axios: 'axios',
                lodash: '_',
                echarts: 'echarts',
                nprogress: 'NProgress'
            })
        })
  • public/index.html文件中的配置

    <!-- nprogress 的样式表文件 -->
        <link href="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.css" rel="stylesheet">
        <!-- element-ui的样式表文件 -->
        <link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.6/theme-chalk/index.css" rel="stylesheet">
    
    
        <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
        <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>
        <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.24.0/axios.min.js"></script>
        <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
        <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.2.2/echarts.min.js"></script>
        <script src="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.js"></script>
    
        <!-- element-ui 的 js文件 -->
        <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.6/index.js"></script>

此时,若在开发阶段运行项目(npm run serve):

项目报错:Uncaught TypeError:Cannot redefine property: $router

原因:就如报错提示所描述的,不能重新定义$router,说明是重复定了$router。通常是因为在项目中安装了vue-router的依赖并且用Vue.use()使用了vue-router,还在index.html页面引入了vue-router.js文件,也就是vue-router重复使用导致。

解决方案:

可在public/index.html 中加入if判断:

<!-- 只有prod(发布阶段)生效 -->
<% if(htmlWebpackPlugin.options.isProd){ %> 
    <!-- nprogress 的样式表文件 -->
    <link href="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.css" rel="stylesheet">
    <!-- element-ui的样式表文件 -->
    <link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.6/theme-chalk/index.css" rel="stylesheet">


    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/3.2.0/vue-router.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.24.0/axios.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.2.2/echarts.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.js"></script>

    <!-- element-ui 的 js文件 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.6/index.js"></script>

    <% } %>
<!-- 只有prod(发布阶段)生效 -->

### 解析 Uncaught TypeError: Cannot read property '$$' of undefined 当遇到 `Uncaught TypeError: Cannot read property '$$' of undefined` 这样的错误时,通常意味着试图访问的对象未被正确定义或初始化。具体来说: - 此类错误可能发生在框架内部处理逻辑中[^2]。 - 如果是在 Vue.js 中发生,则可能是由于组件生命周期管理不当造成的[^1]。 #### 可能的原因分析 1. **对象为空** 尝试操作的对象实际上为 `undefined` 或者 `null`,这表明该对象并没有成功创建或者已经被销毁。 2. **异步加载失败** 当涉及到网络请求或其他异步过程时,如果数据未能及时返回并赋值给目标变量,也会引发此类异常。 3. **第三方库兼容性问题** 特定版本的开发工具或者其他依赖项可能存在某些已知缺陷,特别是在较新环境下运行旧版代码时更易出现问题。 4. **模板编译期间发生的渲染层错误** 对于像小程序这样的环境而言,这类错误还可能源自视图更新过程中对于特定属性的操作失误[^3]。 #### 解决方案建议 为了有效排查和修复上述提到的问题,可以采取以下几个措施: - **检查对象状态** 确认所有预期存在的实例都已被正确声明并且处于可用状态之前再对其进行任何成员函数调用或属性读取操作。 - **调试异步流程** 使用断点调试器逐步跟踪程序执行路径,特别是那些涉及回调函数的地方,确保每一步都能按计划完成而不会提前结束导致后续步骤缺失必要的输入参数。 - **升级/降级相关包** 查阅官方文档以及社区反馈来了解是否存在针对当前使用的软件组合所特有的解决方案;必要时考虑调整项目中的部分依赖关系以规避潜在冲突。 - **增强健壮性的编码实践** 应用防御式编程原则,在每次尝试获取某个复杂结构下的深层字段前先验证其父节点的存在性和合法性。例如: ```javascript const safeGetProp = (obj, propPath) => { try { return propPath.split('.').reduce((acc, key) => acc && acc[key], obj); } catch (_) { console.error(`Failed to get ${propPath} from object`); return undefined; } }; ``` 通过以上方法可以帮助定位并修正引起 `Cannot read property '$$' of undefined` 的根本原因。
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codeMak1r.小新

感谢大佬的资瓷!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值