如何在使用require.context后动态加载Vue组件?

时间:2018-04-25 13:09:58

标签: javascript webpack vue.js vue-component laravel-mix

目前我正在使用require.context加载我的所有Vue组件,这会在我的components目录中搜索.vue个文件的正则表达式。这工作正常,但我想加载异步组件以及动态导入。

目前,当我使用require.context所有文件都被加载时,即使我想使用动态导入,我的文件已经加载,没有任何反应。

我需要一种方法从我的require.context电话中排除某些文件。我无法动态创建正则表达式,因为这不适用于require.context

// How I currently load my Vue components.

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

components.keys().forEach((filePath) => {
    const component = components(filePath);
    const componentName = path.basename(filePath, '.vue');

    // Dynamically register the component.
    Vue.component(componentName, component);
});

// My component that I would like to load dynamically.
Vue.component('search-dropdown', () => import('./search/SearchDropdown'));

似乎唯一的方法是手动声明我的所有组件,这是一个很大的麻烦。

或创建一个静态正则表达式,跳过名称中包含Async的文件。这迫使我对异步组件采用某种命名约定。也不理想。

有没有更好的方法来做这件事?

1 个答案:

答案 0 :(得分:1)

const requireContext = require.context('./components', false, /.*\.vue$/)

const dynamicComponents = requireContext.keys()
    .map(file =>
        [file.replace(/(^.\/)|(\.vue$)/g, ''), requireContext(file)]
    )
    .reduce((components, [name, component]) => {
        components[name] = component.default || component
        return components
    }, {})