6
votes

I'm relatively new to Vuejs and I’ve been stuck on with the following error for a while now: (Appears when page loads)

Uncaught TypeError: Cannot redefine property: $router
  at Function.defineProperty ()
  at Function.install (VM2179 vue-router.esm.js:526)
  at Function.Vue.use (vue.js:4738)
  at eval (VM2179 vue-router.esm.js:2447)
  at Object../node_modules/vue-router/dist/vue-router.esm.js (VM2105 app.js:1615)
  at __webpack_require__ (VM2105 app.js:712)
  at fn (VM2105 app.js:95)
  at eval (VM2178 index.js:3)
  at Object../src/router/index.js (VM2105 app.js:2415)
  at __webpack_require__ (VM2105 app.js:712)

This issue doesn't seem to be affecting the usability of the webapp and I’m pretty sure I’m not declaring Vue.use(Router) more than once…

Here is my index.js file: (in src/router)

import Vue from 'vue'
import Router from 'vue-router'
import Blog from '../components/Blog.vue'
import BlogPost from '../components/BlogPost.vue'

Vue.use(Router)
Vue.config.silent = true

export default new Router({
  routes: [
    {
      path: '/blog',
      name: 'Blog',
      component: Blog
    },
    {
      path: '/blog/:slug',
      name: 'Blog-post',
      component: BlogPost
    }
  ]
})

app.ts: (in src, main entry point)

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store/simple_store'
import '../assets/app.css'
import './assets/main_logo.css'
import './assets/pages/page_header_animation.css'

new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
})

Please help! Thank you!!

4
It might be that your app is getting loaded twice on the same page?thanksd
I agree, import the router in you main.js with something like "import router from './router'", but not in your app.ts file.Dylan
It appears to me that app.ts IS the main js file. I assume also, that the index.js file you have mentioned is ./router/index.js is that correct?Daniel
Hi @Daniel Yes app.ts is the main js file and index.js is in ./router/index.jsMeko Deng
@Phil Oh! I see it now, I did somehow include <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script> in my index.html file... This is where the problem was. Thank you!!Meko Deng

4 Answers

2
votes

This is due to the following code in vue-router

if (inBrowser && window.Vue) {
  window.Vue.use(VueRouter);
}

which is really only present for when you're including files in <script> blocks (ie, no build system).

Remove any <script> elements relating to Vue or related components; you don't need them when using Webpack.

11
votes

Solved!

In my index.html file, I had imported vue again:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>Meko Deng</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script> -->
</body>
</html>

Commenting that out did the trick!

1
votes

Looks like you used Webpack and had forgotten set

externals: {
  Vue: 'vue'
}

In this case you had initialized vue and vue-router twice in the external CND and in the webpacks's lib.

0
votes

If you are pretty sure that you are not using the below line two times.

Vue.use(VueRouter);

Then this is happening because you added the script two times.

<script src="{{ asset('js/app.js') }}" defer></script>

remove duplicate script, Laravel by default add this script tag inside the head section of the app.blade.php file