Skip to content

Instantly share code, notes, and snippets.

@reinink
Created November 2, 2018 12:56
Show Gist options
  • Star 39 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save reinink/a18985cee35a41f3a63585c043926981 to your computer and use it in GitHub Desktop.
Save reinink/a18985cee35a41f3a63585c043926981 to your computer and use it in GitHub Desktop.
Auto register Vue components
/**
* First we will load all of this project's JavaScript dependencies which
* includes Vue and other libraries. It is a great starting point when
* building robust, powerful web applications using Vue and Laravel.
*/
require('./bootstrap');
window.Vue = require('vue');
/**
* Next, we will create a fresh Vue application instance and attach it to
* the page. Then, you may begin adding components to this application
* or customize the JavaScript scaffolding to fit your unique needs.
*/
const files = require.context('./', true, /\.vue$/i)
files.keys().map(key => {
const name = _.last(key.split('/')).split('.')[0]
return Vue.component(name, files(key))
})
const app = new Vue({
el: '#app'
});
@mikemand
Copy link

mikemand commented Nov 2, 2018

Can this be done without the bloated Lodash/Underscore?

@StefanoGroenland
Copy link

Looks awesome!

@koraykupe
Copy link

It gives "[Vue warn]: Error in nextTick: "RangeError: Maximum call stack size exceeded" error. I think this code is only suitable for small apps.

@acacha
Copy link

acacha commented Sep 12, 2019

see Laravel 6 and new laravel/ui comment in app.js https://github.com/laravel/ui/blob/master/src/Presets/vue-stubs/app.js

@yaman3bd
Copy link

yaman3bd commented Apr 18, 2021

use this for vue 3:

window.Vue = require('vue');

const app = Vue.createApp({});

const files = require.context('./', true, /.vue$/i);
files.keys().map(function (key) {
app.component(key.split('/').pop().split('.')[0], files(key).default);
});

app.mount('#app');

@haghanihakimi
Copy link

I receive "Failed to mount component: template or render function not defined." error right after placing these two lines of codes!
I also use this in webpack.mix.js to compile Vue JS codes

mix.js('resources/js/app.js', 'public/js')
.vue()

@hjJunior
Copy link

hjJunior commented Dec 27, 2021

I have created mine to work with subfolders:

const requireComponent = require.context(
  '../components',
  true,
  /[A-Z]\w+\.(vue|js)$/
)

requireComponent.keys().forEach(fileName => {
  const componentConfig = requireComponent(fileName)
  const componentName = fileName.split('/').slice(1).join('').split('.')[0];

  Vue.component(
    componentName,
    componentConfig.default || componentConfig
  )
})

This folder structure:

- components
  - Base
    - Button
    - Title

It will register all components will the following names:

  • BaseButton
  • BaseTitle

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment