Uncaught TypeError: Cannot redefine property: $router

简介: Uncaught TypeError: Cannot redefine property: $router

问题

今天vuecli3打包完之后,线上访问页面报错:无法重新定义属性:$router ,错误如下:

原因以及解决方式

https://stackoverflow.com/questions/52209717/vuejs-uncaught-typeerror-cannot-redefine-property-router

报这个错误的原因就是多次引入了 vue-router,我的 tpl.html 添加了cdn

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <div id="app"></div>
    <% if (NODE_ENV === 'production') { %>
      <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>
    <% } %>
  </body>
</html>

然后 vue.config.js 配置如下:

const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
module.exports = {
    publicPath: process.env.NODE_ENV === "production" ? "/kaimo/" : "/kaimo",
    // 将构建好的文件输出到哪里
    outputDir: "kaimo",
    pages: {
        index: {
            entry: "src/main.js",
            template: "src/tpl.html",
            filename: "index.html",
            title: "测试页面",
            chunks: ["chunk-vendors", "chunk-common", "index"]
        },
    },
    // 生产环境下的sourceMap
    productionSourceMap: false,
    chainWebpack: config => {
    },
    configureWebpack: config => {
        if (process.env.NODE_ENV === "production") {
            config.optimization.minimizer = [
                new UglifyJsPlugin({
                    sourceMap: false,
                    uglifyOptions: {
                        output: {
                            comments: true, // 删除注释
                        },
                        warnings: false,
                        compress: {
                            drop_console: true,
                            drop_debugger: true, // 删除debugger
                            pure_funcs: ["console.log"],
                        }
                    }
                })
            ];
        }
    }
};

我们可以看到 vue-router 打包到 bundle 中了,然后我又加了cdn,这样就会多了一次。

我们可以在 vue.config.js 中配置 externals,或者去掉 cdn 的引入,直接用打包的。下面讲一下配置 externals 的方式。

externals 它配置项提供了阻止将某些 import 的包打包到 bundle 中的功能,在运行时再从外部获取这些扩展依赖。

config.externals({
    key: value
});
  • key:是第三方依赖库的名称
  • value:值可以是字符串、数组、对象。CDN引入的 js 文件赋值给window的全局变量名称。

这里我们配置忽略打包文件:

const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
module.exports = {
    publicPath: process.env.NODE_ENV === "production" ? "/kaimo/" : "/kaimo",
    // 将构建好的文件输出到哪里
    outputDir: "kaimo",
    pages: {
        index: {
            entry: "src/main.js",
            template: "src/tpl.html",
            filename: "index.html",
            title: "测试页面",
            chunks: ["chunk-vendors", "chunk-common", "index"]
        },
    },
    // 生产环境下的sourceMap
    productionSourceMap: true,
    chainWebpack: config => {
        if (process.env.NODE_ENV === "production") {
            // 忽略的打包文件
             config.externals({
                 "vue": "Vue",
                 "vue-router": "VueRouter"
             });
         }
    },
    configureWebpack: config => {
        if (process.env.NODE_ENV === "production") {
            config.optimization.minimizer = [
                new UglifyJsPlugin({
                    sourceMap: true,
                    uglifyOptions: {
                        output: {
                            comments: true, // 删除注释
                        },
                        warnings: false,
                        compress: {
                            drop_console: true,
                            drop_debugger: true, // 删除debugger
                            pure_funcs: ["console.log"],
                        }
                    }
                })
            ];
        }
    }
};

这个样我们就不会报错了。

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
TypeError:Joi.validate is not a function 解决办法
TypeError:Joi.validate is not a function 解决办法
|
6月前
|
前端开发 小程序 JavaScript
微信小程序-Unhandled promise rejection TypeError: Cannot read property ‘get‘ of undefined
微信小程序-Unhandled promise rejection TypeError: Cannot read property ‘get‘ of undefined
|
4月前
|
JavaScript 前端开发
15 Uncaught TypeError: Cannot set properties of null (setting ‘onclick‘)
这篇文章解释了在HTML文档中因JavaScript代码在页面元素加载之前执行导致的"Cannot set properties of null (setting ‘onclick’)"错误,并提供了将JavaScript代码置于`<body>`标签内或使用`window.onload`事件确保DOM完全加载后再绑定事件处理器的解决办法。
15 Uncaught TypeError: Cannot set properties of null (setting ‘onclick‘)
|
4月前
|
前端开发 JavaScript
VUE——Uncaught (in promise) TypeError: Cannot read property '__esModule' of undefined
VUE——Uncaught (in promise) TypeError: Cannot read property '__esModule' of undefined
96 0
|
7月前
|
前端开发
使用ffmpeg-core的时候报错,解决Uncaught (in promise) ReferenceError: SharedArrayBuffer is not defined
使用ffmpeg-core的时候报错,解决Uncaught (in promise) ReferenceError: SharedArrayBuffer is not defined
项目打包优化上线Uncaught TypeError: Cannot redefine property: $router
项目打包优化上线Uncaught TypeError: Cannot redefine property: $router
|
7月前
|
JavaScript 前端开发
Vue报错“ Uncaught TypeError: Cannot read property ‘use‘ of undefined”
Vue报错“ Uncaught TypeError: Cannot read property ‘use‘ of undefined”
390 1
|
自然语言处理 JavaScript
Uncaught TypeError: Cannot read property of undefined
vue中出现这种错误导致这种错误产生的原因是在选项 property 或回调上使用箭头函数 created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod()) 1 2 因为箭头函数并没有 this,this 会作为变量一直向上级词法作用域查找,直至找到为止
126 0
|
JavaScript
成功解决:Uncaught TypeError: Cannot read property 'search' of undefined
成功解决:Uncaught TypeError: Cannot read property 'search' of undefined
|
JavaScript 内存技术
vue template 里使用可选链操作符( ?. )报错:Errors compiling template:invalid expression: Unexpected token ‘.‘ i
vue template 里使用可选链操作符( ?. )报错:Errors compiling template:invalid expression: Unexpected token ‘.‘ i
1355 0
vue template 里使用可选链操作符( ?. )报错:Errors compiling template:invalid expression: Unexpected token ‘.‘ i