import() 动态加载component组件失败

在写 vue+element 从后台获取数据写导航栏 时,当我加载动态路由,import() 总是失败。

假设 path: “@/views/Home.vue”,name: “Home”。

一、使用 import() 语法加载组件

参考:“Cookysurongbin”的 解决vue动态路由异步加载import组件,加载不到module的问题

arr[i].children[j].component = () => import("@/views/Home.vue") //没有问题
arr[i].children[j].component = () => import(`${arr[i].children[j].component}`) //报错

在这里插入图片描述

1. 原因: 应该是在 webpack,webpack 编译 es6 动态引入 import() 时不能传入变量,因为 webpack 的现在的实现方式不能实现完全动态。

2. 解决办法: 可以通过字符串模板来提供部分信息给 webpack。

例如:import(@/${path}), 这样编译时会编译所有 @/views 下的模块,但运行时确定 path 的值才会加载,从而实现懒加载
如果写了@给webpack还是不能识别,那么可能你需要多些几级的路径,如:

arr[i].children[j].component = () => import(`@/views/${name}.vue`);

由于我粗心大意,不小心漏掉了 () => ,这样写完之后,报错(原本是没有错的):[Vue warn]: Failed to mount component: template or render function not defined.,很多文章上说使用 require 加载组件。


二、使用 require 加载组件
arr[i].children[j].component = (resolve) => require([`@/views/${name}.vue`], resolve);//成功

具体的可以去看掘金上 webpack动态导入和require.context分析及使用注意 这篇文章。

因为我让后台在每个子路由中都返回了 component 字段,所以上面这种情况不太现实。

arr[i].children[j].component = resolve => require([`@/views/${arr[i].children[j].component}.vue`],resolve); //报错

在这里插入图片描述
参考了 “ddx2019” 的 动态路由中,有一步需将后端传回的component 的字符串模式,改为我们前端路由需要的component模式,报错Cannot find module

function _import(str) { // views文件夹下的Home组件,传入的格式为 'Home'
  return function (resolve) {
    require([`@/views${str}.vue`], resolve);
  };
}

//使用
arr[i].children[j].component = _import(arr[i].children[j].component);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值