所述基于 Vue-Router 0.7 的 Vue 1.0 项目.

Vue-RouterWebpackCode-Splitting 功能结合起来可以实现组件的动态加载:

router.map({'/account-info': {component: function (resolve) {require(['./views/AccountInfo/index.vue'], resolve)}},'/about': {component (resolve) {require(['./views/About/index.vue'], resolve)          }},...
})

只有当访问到两个路由时组件才会被加载进来,节约资源。

不过当项目组件数量偏多的时候手工注册总归不是好办法,不如写成配置动态处理:

// 组件配置信息.
const viewConfig = {"account-info": {name: "account-info",link: "/account-info",view: "views/AccountInfo/index.vue"},"about": {name: "about",link: "/about",view: "views/About/index.vue"},...
}// 路由配置对象, 将交给 Vue-Router 处理.
const routeConfig = {}viewConfig.forEach(config => {routeConfig[config.link] = createRouteConfig(config.name, config.view)
})routerInstance.map(routeConfig)/***  创建路由配置对象.**  @param { string } name 具名路由名称.*  @param { string } view 组件文件所在路径.*  @return { object }  */
function createRouteConfig (name, view) {return {name,component (resolve) {require(['./' + view], resolve)}}
}

完美的出事了!Σ(゚д゚;)

只生成了一个超大的 JS 分片?!

只生成一个超大的 JS 分片,这不是我们要的嘛!

这时要请出 Webpack 的 bundle-loader,Webpack 的代码分片功能会将所有动态切分的模块打包到一起保证执行正确,而 bundle-loader 会将每一个动态切分的模块打包为独立文件.

因此改一下配置:

function createRouteConfig (name, view) {return {name,component (resolve) {// require(['./' + view], resolve)const handler = require('bundle!./' + view)handler(module => resolve(module))}}
}

完美地第二次出事!(゚Д゚≡゚д゚)!?

build 时出现 “Module not found: Error: a dependency to an entry point is not allowed” 报错?!

明明 dev 的时候是正确的,build 时就错了?

经过一番尝试,发现手工指定 babel-loader 可以解决问题,那么:

function createRouteConfig (name, view) {return {name,component (resolve) {// require(['./' + view], resolve)// const handler = require('bundle!./' + view)const handler = require('bundle!babel!./' + view)handler(module => resolve(module))}}
}

蛤蛤蛤,正常工作了!

但好像生成的分片文件数量却不得了?!

没多大的项目,竟然生成了快 100 个分片?ヽ(`Д´)ノ

出现这么多问题都是因为动态配置,因此是不是 Webpack 在分析词法的时候捉鸡了?

而且好像 handler 并没有过 vue-loader?(应该不会吧)那么就决定试试将 '.vue' 扩展名写死在代码中:

// 组件配置信息.
const viewConfig = {"account-info": {name: "account-info",link: "/account-info",// view: "views/AccountInfo/index.vue"view: "views/AccountInfo/index"},"about": {name: "about",link: "/about",// view: "views/About/index.vue"view: "views/About/index"},...
}// 路由配置对象, 将交给 Vue-Router 处理.
const routeConfig = {}viewConfig.forEach(config => {routeConfig[config.link] = createRouteConfig(config.name, config.view)
})routerInstance.map(routeConfig)/***  创建路由配置对象.**  @param { string } name 具名路由名称.*  @param { string } view 组件文件所在路径.*  @return { object }  */
function createRouteConfig (name, view) {return {name,component (resolve) {// require(['./' + view], resolve)// const handler = require('bundle!./' + view)// const handler = require('bundle!babel!./' + view)const handler = require('bundle!babel!./' + view + '.vue')handler(module => resolve(module))}}
}

蛤蛤蛤,竟然真的正常了!(=・ω・=)

处理 Vue-Router + Webpack 动态加载的一些小问题相关推荐

  1. Vue文件内动态加载JS

    Vue文件内动态加载JS let jsUrl = 'https://code.jquery.com/jquery-3.4.1.min.js' // JS地址 let jqueryJs = decode ...

  2. vue系统权限(动态加载路由方式)

    目录 1.注册vue-router 2.声明 默认路由 和权限路由 3.用vuex实现全局登录.退出登录等方法 4.用vuex模块单独写权限路由的判断 5.监听路由跳转实现动态加载权限菜单 需要用到动 ...

  3. vue组件的动态加载

    ​ 平常的vue项目开发,已经很难遇见一千行,甚至几千行代码的页面了,毕竟大家都会去拆分组件.但如果一个页面需要通过十几个组件或者几十个组件中的某几个组件去排列组合渲染,此时用动态加载就很有必要了. ...

  4. vue router按需加载

    1 import Vue from 'vue' 2 import Router from 'vue-router' 3 4 Vue.use(Router); 5 //按需加载,当渲染其他页面时才加载其 ...

  5. vue中echarts初次加载图很小的问题

    在vue的mounted中如果初始化数据的话,dom元素还没有完全加载完成,这时候echarts还是px和%混用,会造成加载出来的echarts很小 处理方式,加载完成之后重绘一下: $(docume ...

  6. Vue 使用v-html 动态加载代码 点击事件不管用 解决办法

    最近做一个项目,由于数据展示受限制,只能动态拼接代码,但是发现一个问题,在标签上写的@click="xxx()" 不管用,最后专业前端朋友与之解决,话不多说,看解决办法,相信你那么 ...

  7. 在 VUE中,动态加载JS文件

    需求 在vue组件中需要调用的函数方法名是相同的(接口相同),但是按照页面不同需要导入不同JS文件 .如下: 然而上面这种写法肯定是行不通的,但表达的需求很明确.根据menuId的不同从JS文件中获取 ...

  8. Vue + Spring Boot 项目实战(十五):动态加载后台菜单

    重要链接: 「系列文章目录」 「项目源码(GitHub)」 本篇目录 前言 一.后端实现 1.表设计 2.pojo 3.菜单查询接口(树结构查询) 二.前端实现 1.后台页面设计 2.数据处理 3.添 ...

  9. 使用九宫格的方式加载动态加载资源

    动态加载分块地形 我在cadn上看了很多的关于unity的动态加载的大佬思路,我都是感觉思路很清晰,理论高大上,但是真的到我们自己去做的时候,才会发现其实不是很容易.我不如那些大佬,只写了一点浅薄的动 ...

  10. 踩坑记15 动态路由 router.options.routes未更新 | vue升级 element-plus未适配vue3.2.x | vite glob导入动态加载组件,不能使用别名alias

    2021.8.12 坑50(vue-router4.addRoute().router.options.routes未更新):进行动态权限获取菜单的设置,使用了addRoute()来添加路由,但是ro ...

最新文章

  1. 2022-2028年中国醋酸行业投资分析及前景预测报告
  2. Python之sklearn:LabelEncoder函数简介(编码与编码还原)、使用方法、具体案例之详细攻略
  3. mysql 日期对比,varchar类型装换为datetime类型
  4. Android应用程序启动过程源代码分析(5)
  5. 美图2019年财报发布:“高级订阅”收入亮眼 成为重要商业模式
  6. Git-删除文件后找回-比较文件差异
  7. DB2中使用Excel文件数据转CSV格式后导入数据库
  8. php1到5000排序,常用的排序算法(一)--快速排序(PHP实现)
  9. java分部积分任务代码实现_数值积分 Java 实现
  10. c语言 屏幕亮度调节_4096级屏幕亮度调节:改善安卓机自动亮度调节顽疾
  11. 日常运维管理 常用命令(3)
  12. 打印预览和实际的打印不一致问题
  13. jvm内存模型、jvm内存结构、Java内存结构、Java内存模型(JMM)、Java对象模型的区别(吐血研究整理)
  14. STM8L的LCD接口详解及驱动程序
  15. PyCharm下载安装以及使用教程
  16. 码农翻身全年文章精华
  17. 打猎游戏——HTML版(JavaScript的应用)
  18. PopupWindow底部弹出,底部UI被遮盖问题
  19. 鸿蒙时期的修真等级,相关介绍关于小说里的修真和武器等级划分
  20. oracle数据库账号被锁

热门文章

  1. DesignPattern_Java:设计模式分类和设计原则
  2. c++ 类的定义和使用
  3. 分享一个强大的弹出框
  4. 查看linq的生成语句
  5. prml线性模型小结
  6. 《剑指offer》第二十三题(链表中环的入口结点)
  7. 【Go命令教程】11. go vet 与 go tool vet
  8. javaScript常见的五种数组去重(转载)
  9. 谈朋友圈——周围的朋友们
  10. linux系统root用户忘记密码的重置方法