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

Ste*_*n-v 5 javascript webpack vue.js vue-component laravel-mix

目前,我正在使用加载所有Vue组件require.context,这会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'));
Run Code Online (Sandbox Code Playgroud)

看来唯一的方法就是手动声明我的所有组件,这很麻烦。

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

会有更好的方法去做吗?

S M*_*rul 5

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
    }, {})
Run Code Online (Sandbox Code Playgroud)