使用自动注册的动态导入的 Vue 组件进行代码拆分

Posted

技术标签:

【中文标题】使用自动注册的动态导入的 Vue 组件进行代码拆分【英文标题】:Code splitting with auto-registered dynamically imported Vue components 【发布时间】:2019-08-14 19:08:54 【问题描述】:

我正在尝试使用this techniqe。简而言之,我正在尝试。我的文件结构是js/utils/vue.jsjs/components/***.vue

这是我的 Vue 组件的加载方式:

const files = require.context('../components', true, /\.vue$/i, 'lazy').keys();
files.forEach(file => 
    Vue.component(file.split('/').pop().split('.')[0], () => import(`$file`));
);

但是会导致错误:

[Vue 警告]:无法解析异步组件:function () return webpack_require("./resources/js/utils 惰性递归 ^.*$")("".concat(file)); 原因:错误:找不到模块'./MainNavbar.vue'

手动注册组件,同时仍然使用动态导入。 Vue.component('main-navbar', () => import('../components/MainNavbar.vue'));

为什么我会收到这个错误?

【问题讨论】:

【参考方案1】:

编辑:

我找到了适合我的 here:

const files = require.context('./', true, /\.vue$/i, 'lazy').keys();

files.forEach(file => 
    Vue.component(file.split('/').pop().split('.')[0], () => import(`$file`));
);

从错误消息来看,您的表达式 () => import($file) 需要预先添加上下文路径,因为您没有像 () => import('../components/MainNavbar.vue') 那样引用它

也许是这样的

const componentName = key.split('/').pop().split('.')[0]
Vue.component(file.split('/').pop().split('.')[0], () => import(`../components/$file`));

有效吗?

【讨论】:

以上是关于使用自动注册的动态导入的 Vue 组件进行代码拆分的主要内容,如果未能解决你的问题,请参考以下文章

批量自动化注册全局组件(Vue3)

vue路由自动加载、按组件异步载入vuex以及dll优化

Webpack 代码拆分使用 vueJs 组件中断 jest 导入

vue使用require.context,动态变量怎么办

在 Vue 功能组件中使用动态导入

vue + webpack:动态组件导入是如何工作的?