vue-router 按需加载 component: () => import() 报错的解决


Posted in Javascript onSeptember 22, 2020

vue的单页面(SPA)项目,必然涉及路由按需的问题。

以前我们是这么做的

//require.ensure是webpack里面的,这样做会将单独拉出来作为一个chunk文件

const Login = r => require.ensure( [], () => r (require('../component/Login.vue')));

但现在vue-router的官网看看,推荐这种方式:

//vue异步组件和webpack的【代码分块点】功能结合,实现了按需加载

const App = () => import('../component/Login.vue');

可是,很多情况下,我们这么写npm run dev控制台直接报错,这是为什么呢?

Module build failed: SyntaxError: Unexpected token

原来是import这儿报错了,这就需要babel的插件了,vue-router官网上有一段提示:

如果您使用的是 Babel,你将需要添加 syntax-dynamic-import 插件,才能使 Babel 可以正确地解析语法。

至此,问题全部解决了。

如果使用vue-cli生成项目,很可能在babel-loader没有配置上面的插件,这时需要我们自己去安装此插件:

cnpm install babel-plugin-syntax-dynamic-import --save-dev

然后修改webpack的js的loader部分:

{
test: /\.js$/,
loader:'babel-loader',
options:{
plugins:['syntax-dynamic-import']
},
},
 

增加了option选项,至此,能识别我们:

const App = () => import('../component/Login.vue');

的语法了,页面出来了:

vue-router 按需加载 component: () => import() 报错的解决

在打包的时候,发现我们如果只是这么写,出现的chunk包名字都是乱的,如果我们指定命名,该怎么办呢?webpack3提供了Magic Comments(魔法注释)

const App = () => import(/* webpackChunkName:'login'*/ '../component/Login.vue');

这样我们就为打包出来的chunk指定一个名字,最终生成login.js的chunk包。

补充知识:Vue根据是否授权,跳转不同的路由(vue-router动态路由)

功能点:项目一运行需要先请求后台,根据后台返回结果跳转对应路由,如果用户已经授权跳转首页,如果用户没有授权,跳转授权页面进行授权。

实现代码如下:

router文件夹中的index.js

import Vue from "vue";
import Router from "vue-router";
Vue.use(Router);
let router =new Router({
 routes:[]
});
//全局路由钩子函数
router.beforeEach((to,from,next)=>{
 //不加这个判断,路由会陷入死循环重复添加路由
 if(!to.name){
 alert("请上传有效的License文件,以正常使用系统功能");
 next("/licenseManage");
 }else{
 next();
 }
})
export default router;

router文件夹的accessRouters.js(定义好不同的路由)

import index from "@/views/index";
export default{
 //已授权路由列表
 hasAccessRouters:[
 {
  path:"/",
  name:"index",
  component:index,
  redirect:"preIntegrationTest",
  children:[
  {
   path:"/preIntegrationTest",
   name:"preIntegrationTest",
   components:{
   listPage:resolve =>{ 
    require(["@/views/pages/preIntegrationTest"],resolve)
   }
   },
   props:{}
  },{
   path:"/about",
   name:"about",
   components:{
   listPage:resolve =>{ 
    require(["@/views/pages/about"],resolve)
   }
   },
   props:{}
  },{
   path:"/help",
   name:"help",
   components:{
   listPage:resolve =>{ 
    require(["@/views/pages/help"],resolve)
   }
   },
   props:{}
  }
  }
  ],
  //没有授权的路由列表
  noAccessRouters:[
  {
   path:"/",
   name:"index",
   component:index,
   redirect:"licenseManage",
   children:[
   {
    path:"/licenseManage",
    name:"licenseManage",
    components:{
    listPage:resolve =>{ 
     require(["@/views/systemSetting/licenseManage"],resolve)
    }
    },
    props:{}
   }
  }
  ]
 }
 ]
}

store中的index.js定义仓库中的变量

import Vue from "vue";
import Vuex from "vuex";
import mutations from "./mutations";
import actions from "actions";
Vue.use(Vuex);
const store = new Vuex.store({
 state:{
 axios:axios.create({baseURL:"",transformRequest:[]}),
 authorized:false
 },
 getters:{},
 mutations,
 actions
});
export default store;

mutation.js定义改变状态库中authorized的值的方法并加载动态路由

import router from "@/router/index";
import accessRouters from "@/router/accessRouters";
const mutations={
 setAuthorized(state,payload){
 if(payload){
  //已授权
  //加载路由为已授权定义的路由列表并跳转/preIntegrationTest
  router.addRoutes(accessRouters.hasAccessRouters);
  let url=location.hash.substring(1)==='/'?'/preIntegrationTest':location.hash.substring(1);
  router.push('url');
 }else{
  //没有授权,跳转授权页面
  router.push('/licenseManage');
 }
 //更改状态值
 state.authorized=payload;
 }
}
export default mutations;

action.js请求后台接口返回结果,赋值给store状态库中的变量

const actions={
 addInterceptors({state,commit}){
 //响应拦截--配置请求回来的信息
 state.axios.interceptors.response.use(
  function(response){
  // 处理响应数据
  return response
  },function(error){
  if(error.response.status === 403){
   commit("setAuthorized",false)
  }
  //处理响应失败
  return Promise.reject(error)
  }
 )
 },
 setAuthorized({dispatch,state}){
 dispatch("addInterceptors");
 state.axios.get('url****').then(function(response){
  if(response.data.code === "1"){
  state.authorized = true;
  router.addRoutes(accessRouters.hasAccessRouters);
  let url=location.hash.substring(1)==="/"?"/preIntegrationTest":location.hash.substring(1);
  router.push(url);
   
  }else{
  //没有授权 跳转授权页面
  state.authorized = false;
  router.addRoutes(accessRouters.noAccessRouters);
  router.push("/licenseManage");
  }
  
 }).catch(function(error){
  console.log(error)
  //没有授权 跳转授权页面
  state.authorized = false;
  router.addRoutes(accessRouters.noAccessRouters);
  router.push("/licenseManage");
 })
 }
}
export default actions;

以上这篇vue-router 按需加载 component: () => import() 报错的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript中3个需要注意的运算符
Apr 02 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
Mar 01 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
Mar 25 Javascript
微信小程序利用co处理异步流程的方法教程
May 20 Javascript
jQuery开源组件BootstrapValidator使用详解
Jun 29 jQuery
微信小程序实现轮播图效果
Sep 07 Javascript
使用classList来实现两个按钮样式的切换方法
Jan 24 Javascript
Vue无限滑动周选择日期的组件的示例代码
Jul 18 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
Aug 16 Javascript
JavaScript中的函数式编程详解
Aug 22 Javascript
vue 实现基础组件的自动化全局注册
Dec 25 Vue.js
如何理解Vue前后端数据交互与显示
May 10 Vue.js
解决vue2中使用elementUi打包报错的问题
Sep 22 #Javascript
element-ui中dialog弹窗关闭按钮失效的解决
Sep 22 #Javascript
小程序实现录音功能
Sep 22 #Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
Sep 22 #Javascript
JavaScript实现多层颜色选项卡嵌套
Sep 21 #Javascript
JS实现无限轮播无倒退效果
Sep 21 #Javascript
js+canvas绘制图形验证码
Sep 21 #Javascript
You might like
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
javascript new一个对象的实质
2010/01/07 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
在JavaScript中使用JSON数据
2016/02/15 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
通过学习bootstrop导航条学会修改bootstrop颜色基调
2017/06/11 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
jquery实现二级导航下拉菜单效果实例
2019/05/14 jQuery
js字符串类型String常用操作实例总结
2019/07/05 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
对numpy中的数组条件筛选功能详解
2018/07/02 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
中国电视购物:快乐购
2017/02/04 全球购物
eBay澳大利亚站:eBay.com.au
2018/02/02 全球购物
澳大利亚优质葡萄酒专家:Vintage Cellars
2019/01/08 全球购物
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
新浪微博实习心得体会
2014/01/27 职场文书
小学敬老月活动方案
2014/02/11 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
市场部经理岗位职责
2015/02/02 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
敬老院活动感想
2015/08/07 职场文书
银行求职信怎么写
2019/06/20 职场文书