完美解决了报错:app.js:249 Uncaught TypeError: Cannot redefine property: $router

news2024/11/16 21:34:18

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

 

原因:报错的原因就是重新定义了$router,因为在项目中安装了vue-router的依赖并且用Vue.use()使用了vue-router,还在index.html页面引入了vue-router.js文件

此处介绍两种解决办法

报错如下 

 第一种办法(比较简洁的):

在public/index.html文件中加入if判断

<% if(htmlWebpackPlugin.options.isProd){ %>
    <link rel="stylesheet" href="https://unpkg.com/element-ui@2.15.8/lib/theme-chalk/index.css">
    <link rel="stylesheet" href="https://unpkg.com/quill@1.3.7/dist/quill.core.css">
    <link rel="stylesheet" href="https://unpkg.com/quill@1.3.7/dist/quill.snow.css">
    <link rel="stylesheet" href="https://unpkg.com/quill@1.3.7/dist/quill.bubble.css">


    <script src="https://unpkg.com/echarts@5.3.2/dist/echarts.min.js"></script>
    <script src="https://unpkg.com/vue@2.6.11/dist/vue.js"></script>
    <script src="https://unpkg.com/vue-router@3.2.0/dist/vue-router.js"></script>
    <script src="https://unpkg.com/vuex@3.6.2/dist/vuex.js"></script>
    <script src="https://unpkg.com/axios@1.1.3/dist/axios.min.js"></script>
    <script src="https://unpkg.com/dayjs@1.11.7/dayjs.min.js"></script>
    <script src="https://unpkg.com/element-ui@2.15.10/lib/index.js"></script>
    <script src="https://unpkg.com/quill@1.3.7/dist/quill.js"></script>
    <script src="https://unpkg.com/vue-quill-editor@3.0.6/dist/vue-quill-editor.js"></script>
    <script src="https://unpkg.com/vuex-persistedstate@3.2.1/dist/vuex-persistedstate.umd.js"></script>

    <% } %>

这样就可以正常运行了

第二种、在vue.config.js中定义只有在生产环境中引入响应的CDN地址 :

        1、首先需要定义一个CDN对象,用来配置CDN链接

       

 let CDN = { css: [], js: [] }

        2、在判断为生产环境中,给CDN赋值

        

// 判断是否为生产环境
const isProduction = process.env.NODE_ENV === 'production'
// 如果是生产环境,需要执行以下逻辑
if (isProduction) {
  externals = {
    /**
     * externals 对象属性解析:
     * '包名':'在项目中引入的名字'
     * 以element-ui 举例:我在main.js里是以 import ELEMENT from 'element-ui'
     * Vue.use(ELEMENT)
     * 这样引入的,所以我的 externals 的属性值应该是 ELEMENT,一定要去main.js设置
     */
    echarts: 'echarts',
    vue: 'vue',
    'vue-router': 'VueRouter',
    vuex: 'vuex',
    axios: 'axios',
    days: 'days',
    'element-ui': 'ELEMENT', // 因为在cdn源码里,ELEMENT是大写,所以在这里需要大写,并且把项目中(elementUi/index.js)引入这个插件的地方也改成大写
    'vue-quill-editor': 'VueQuillEditor',
    'vuex-persistedstate': 'createPersistedState'
  }
  CDN = { 
    css: [// element-ui css样式表
      'https://unpkg.com/element-ui@2.15.8/lib/theme-chalk/index.css',
      'https://unpkg.com/quill@1.3.7/dist/quill.core.css',
      'https://unpkg.com/quill@1.3.7/dist/quill.snow.css',
      'https://unpkg.com/quill@1.3.7/dist/quill.bubble.css'
    ],
    js: [
      'https://unpkg.com/echarts@5.3.2/dist/echarts.min.js',
      'https://unpkg.com/vue@2.6.11/dist/vue.js',
      'https://unpkg.com/vue-router@3.2.0/dist/vue-router.js',
      'https://unpkg.com/vuex@3.6.2/dist/vuex.js',
      'https://unpkg.com/axios@1.1.3/dist/axios.min.js',
      'https://unpkg.com/dayjs@1.11.7/dayjs.min.js',
      'https://unpkg.com/element-ui@2.15.10/lib/index.js',
      'https://unpkg.com/quill@1.3.7/dist/quill.js',
      'https://unpkg.com/vue-quill-editor@3.0.6/dist/vue-quill-editor.js',
      'https://unpkg.com/vuex-persistedstate@3.2.1/dist/vuex-persistedstate.umd.js'
    ]
  }
}

        3、将配置的css/js地址注入到html页面中

module.exports = defineConfig({
    chainWebpack (config) {
    // 注入cdn变量(打包时会执行)
    config.plugin('html').tap(args => {
      // 参数对象添加属性叫cdn,值就是上面的CDN对象
      args[0].cdn = CDN// 配置CDN给插件
      return args
    })
})

        4、在public/index.html页面中设置对应的导入信息

        导入样式

<% for(var css of htmlWebpackPlugin.options.cdn.css) { %>
        <link rel="stylesheet" href="<%=css%>" as="style">
      <% } %>

        导入JS

<% for(var js of htmlWebpackPlugin.options.cdn.js) { %>
        <script src="<%=js%>"></script>
      <% } %>

到这就结束了,打包后的体积会很小,达到了只有在生产环境中,才会在public/index.html页面中导入CDN地址,开发环境还是从node_modules中引入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/160640.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享134个ASP源码,总有一款适合您

ASP源码 分享134个ASP源码&#xff0c;总有一款适合您 134个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1eZwPKoGGSnzItVBM3_Z77w?pwdxvqz 提取码&#xff1a;xvqz 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&am…

详细搞懂vue2.0 3.0区别-summernote富文本使用

文章目录背景介绍必备知识实操安装回退脚手架vue cli版本vue-使用summernote富文本功能&#xff08;不失效版&#xff09;小知识如果感觉有用点个关注&#xff0c;一键三连吧&#xff01;蟹蟹&#xff01;&#xff01;&#xff01;背景 一开始只是准备实现summernote富文本&…

Stitch it in Time: GAN-Based Facial Editing of Real Videos翻译

代码地址 论文下载 摘要 生成对抗网络在其潜空间内编码丰富语义的能力已被广泛用于面部图像编辑。然而&#xff0c;事实证明&#xff0c;在视频上复制他们的成功具有挑战性。高质量的面部视频集是缺乏的&#xff0c;在视频上存在一个需要克服的基本障碍——时间一致性。我们认…

【Leetcode面试常见题目题解】6. 电话号码的字母组合

题目描述 本文是LC第17题&#xff0c;电话号码的字母组合&#xff0c;题目描述如下&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意…

智能遍历测试在回归测试与健壮性测试的应用

首先来看业界用的较早也是经常听过的一款工具—— Monkey。这是 Android 官方提供的一个工具。谷歌原本设计这款工具是为了对 App 进行压力测试的。谷歌早期在设计 Android 的时候&#xff0c;Android 需要响应滑动、输入、音量、电话等事件&#xff0c;早期 activity 设计不完…

常见的 5 种 消息队列 使用场景

消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题。 实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。 使用较多的消息队列有 RocketMQ&#xff0c;RabbitMQ&#xff0c;Kafka&#xf…

Android实战场景 - 输入手机号、银行卡号、身份证号时动态格式化

在日常项目开发中&#xff0c;如果稍微严谨点的话&#xff0c;其中关于手机号、银行卡号、身份证号的输入格式有做了限制格式化操作&#xff0c;主要是为了给用户带来更好的体验感&#xff1b; 最近同事正好问到了我这个问题&#xff0c;虽然以前做过这类型功能&#xff0c;但是…

你了解RTK技术吗?—— 揭秘GNSS中的定位技术

上期文章中我们一起探讨了GNSS仿真及其对测试验证的重要意义&#xff0c;今天我们将一起走进GNSS中的定位技术—RTK技术。什么是RTK技术&#xff1f;传统RTK技术与网络RTK技术又有什么区别呢&#xff1f;随着GNSS系统的迅速发展&#xff0c;RTK技术由于可以在作业区域内提供实时…

OpenMLDB v0.7.0 发布

2023 新年伊始&#xff0c;OpenMLDB v0.7.0 正式发布。本次版本更新重点增强了易用性和稳定性&#xff0c;下文将详细介绍主要改进和更新内容。更多 0.7.0 版本内容详见链接&#xff1a;Release v0.7.0 4paradigm/OpenMLDB 系统性改进消息和错误码&#xff0c;提升易用性 在…

【数据库概论】第二章 关系数据库

第二章 关系数据库 目录第二章 关系数据库2.1 关系数据结构2.1.1关系2.1.2关系模式2.1.3关系数据库2.2 关系操作2.2.1 基本的关系操作2.2.2关系数据语言的分类2.3 关系的完整性2.3.1 实体完整性2.3.2 参照完整性2.3.3 用户定义的完整性2.4 关系代数2.4.1 传统集合运算2.4.2 专门…

multimodal remote sensing survey 遥感多模态综述阅读

遥感多模态 参考&#xff1a;From Single- to Multi-modal Remote Sensing Imagery Interpretation: A Survey and Taxonomy Keywords&#xff1a;multimodal remote sensing 文章目录遥感多模态AbstractIntroductionTaxonomy1. Multi-source Alignment1.1 Spatial Alignment1…

《MySQL系列-InnoDB引擎15》慢查询日志拓展-如何开启MySQL慢查询日志?

慢查询日志拓展-如何开启MySQL慢查询日志&#xff1f; 1.查看MySQL慢查询日志是否开启&#xff1f; show variables like %query%; 查询出的结果中&#xff0c;主要观察如下三条&#xff1a; long_query_time 通过long_query_time设置阈值&#xff0c;设置阈值后&#xff0c…

Linux学习笔记 超详细 0基础(中)

Vi/Vim编辑器在Linux下一切皆文件&#xff0c;Vi编辑器和Vim编辑器是可以直接对文本文件进行编辑和操作&#xff0c;没什么大区别&#xff0c;vim有颜色区分更美观&#xff0c;vim 文件路径文件名即可进入一般模式&#xff0c;一般模式就是只读文件&#xff0c;不可进行操作。V…

K8s: Windows 下安装 K8s 开源桌面面板工具 OpenLens 查看集群信息

写在前面 分享一个桌面端的 k8s 面板工具 OpenLens博文内容为 OpenLens 简单介绍和 下载安装教程。安装非常简单,感兴趣的小伙伴快去尝试吧理解不足小伙伴帮忙指正 我所渴求的&#xff0c;無非是將心中脫穎語出的本性付諸生活&#xff0c;為何竟如此艱難呢 ------赫尔曼黑塞《德…

《c++ primer》第三章 字符串、vector、数组

前言 本章内容相比第二章要简单不少&#xff0c;里面比较重要的内容主要是vector和迭代器&#xff0c;这里只是很简单的介绍了一下&#xff0c;在后续的章节会有更详细、复杂的说明。以下记录的都是比较重要或者易混淆的知识点&#xff0c;对于像string、vector只列举了部分方法…

Sentienl一:下载,启动

Hystrix &#xff1a;1需要自己搭建监控平台 2 没有一套web界面可以给我们进行更加细粒度化的配置流控&#xff0c;速率控制 服务熔断&#xff0c;服务降级 Sentinel: 1 单独一个组件&#xff0c;可以独立出来 2 直接界面化的细粒度统一配置 一&#xff1a;丰富的应用场景&…

【Linux】分布式版本控制工具Git的学习 | 在Linux上使用git

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;安度因的学习社区 &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、历史背景三、版本控制1、何为版本控制2、版本控制工具① 集中式版本控制工具② 分布式版本控制工具四、代码托管平…

React 学习笔记总结(八)

react-router6版本的学习笔记。 文章目录一、React Router 6二、router6版本的 安装 和 一级路由1. 安装router6版本2. Routes组件 和 Route的 element属性三、router6 之 重定向四、router6的 NavLink高亮五、router6 的 useRoutes路由表(重要)六、router6 的 嵌套路由七、rou…

编写自己的OPTEE CA/TA demo

前言 &#xff08;默认你对optee有一点点点点了解&#xff09; 一、hello_world分析 在\optee_examples\hello_world目录下&#xff0c;optee给出了一个简单的CA/TA示例。 hello_world的结构如下&#xff1a; 1、CA端 A.main.c main.c文件有效代码如下&#xff1a; #incl…

vue2组件之间的数据传递(组件之间使用mitt第三方模块创建事件中心进行订阅与发布)

目录 一、组件之间的通信 1、组件之间的关系&#xff1a;父子关系、兄弟关系、跨级关系 2、父子组件之间的通信(数据传递)&#xff1a; 3、兄弟组件之间的通信&#xff08;数据传输&#xff09;&#xff1a; 4、跨级组件之间的通信&#xff1a;provide / inject 类似于消息…