vue异步组件和vue.router异步加载

以前在使用angular进行开发时,始终没有处理好异步加载的问题,最多只能使用requirejs异步加载controller里面的内容。导致后来项目扩大的时候,性能问题十分蛋疼。最后我竟然把单页面引用拆成了多页面应用,感觉好囧。。。

后来尝试用vue写一个项目,配合则webpack,发现效果相当的好。但是vue的异步组件文档太误导人了,让我尝试了好久才发现怎么用。文档上是这样写的:

Vue.component(‘async-webpack-example‘, function (resolve) {
  // 这个特殊的 require 语法告诉 webpack
  // 自动将编译后的代码分割成不同的块,
  // 这些块将通过 ajax 请求自动下载。
  require([‘./my-async-component‘], resolve)
})

 这里直接用require是错误的, Webpack 的代码分割功能中对于AMD方式的模块加载其实是用的require.ensure.由于1.x版本还不支持ES6的module,所以想要这里vue不能用ES6写了。

Vue.component(‘asyncUserModal‘, function (resolve, reject) {
     require.ensure(["../modal/user-modal.vue"], function (require) {

          resolve(require("../modal/user-modal.vue"));
     });
});

但是这里还是有一个非常麻烦的问题,那就是我找了很多地方都没有看见动态加入子组件的方法,这会导致父子组件的事件通信无法触发。所以最后我只能把组件作为全局组件。

new Vue({
    el: ‘#js-modal-wrap‘,
    data: function(){
         return {};
    }      });

这种写法让人十分不爽,不知道有没有知道vue是否提供一种parentComponent.appChildComponent()之类的方法。如果知道,求告知。

上面这种异步组件可以用在我点击登录时,才去加载登录组件,这样就可以减少首屏请求内容过多的问题。

下面还有一种就是在单页面应用中,我们从首页进入其他页面的时候异步加载其他页面内容。这个在vue-router中有类似的方法。

router.map({
  ‘/‘:{
    name:‘home‘,
    component:home
  },
  ‘/video/:videoId‘:{
    name:‘player‘,
    component:function(resolve){
      require.ensure([‘./pages/player/player.vue‘], function(){
        resolve(require("./pages/player/player.vue"));
      });
    }
  }
}

在我个人看来,vue确实是一种非常不错的框架,目前看来是angular1.x的一种不错的代替方案。当然我也遇到一些奇怪的问题,还不知道是我没找对方法还是BUG,比如在vue-loader中使用less,会导致css的背景图无法加载。还有一个就是使用webpack的问题也挺麻烦的,就是很多第三方库使用闭包的时候都是IIFE,直接使用this代替window以便于在浏览器和nodejs端都能很好的运行。但是打包过后,this直接被webpack打包成undefined了。可能是我英语不好加上没有系统看webpack文档。不知道有没有人遇到这个问题?

时间: 2025-01-13 03:41:12

vue异步组件和vue.router异步加载的相关文章

js判断异步引入的js文件是否加载完毕

在正常的加载过程中,js的加载都是同步的,也就是在加载过程中,浏览器会阻塞接下来的内容的加载.这时候我们就要用到动态加载,动态加载是异步的,如果我们在后边要用到这个动态加载的js文件里的东西,就要保证这个文件加载完成后,再执行下面的内容. 如何判断js是否加载完成?(实现loadScript(url,callback)异步加载脚本,完成后执行回调函数,要求支持IE) <!DOCTYPE html> <html> <head> <meta charset="

iview Table组件使用过滤器时无法加载表头解决办法

title: iview Table组件使用过滤器时无法加载表头解决办法 date: 2018-10-01 15:08:50 tags: JavaScript 前端 vue iview 所遇到的问题 使用iview搭建社团用人员管理时,Table组件的columns中filters属性设置为Vue data 中的另一个对象 如下: data() { groupFilter: [], memberCol: [ { title: "组别", render: (h, params) =>

在Vue中的load或ready的加载时机

1.我们来插入一段代码来分析: Js代码如下 <script type="text/javascript"> var app = new Vue({ el: '#app', data: {}, mounted: function () { var interval = 2000; Resize(); Map(); setInterval("Map()", interval); dateTimer(); setInterval("dateTime

vue自定义组件(通过Vue.use()来使用)即install的使用

在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个loading.vue文件 // Cmponent.vue <template> <div> ...loading </div> </template> <script> export default { } </script> <style scoped> div{ font-size:40px

用apicloud+vue的VueLazyload实现缓存图片懒加载

<img v-lazy="remoteUrl + pics_url" class="xunjian_pics" v-for="pics_url in item.pics_text"> Vue.use(VueLazyload, { preLoad: 1.3, error: '../../image/error.png', attempt: 1, filter: { progressive(listener, options) { //

vue 实现滚动到页面底部开始加载更多

直接上代码: <template> <div class="newsList"> <div v-for="(items, index) in newsList"> <div class="date">{{showDay(index)}}</div> <div class="list" > <ul> <li class="list

vue.js学习笔记(二):如何加载本地json文件

在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发.但是,如何在一个vue.js 项目中引入本地的json文件呢,下面就将步骤贴出来.(此时项目是由webpack打包而成). 整个项目是由webpack打包而成,具体步骤上网查找.具体项目结构如下: 1:我们找到bulid>dev-server.js,然后打开 2:在里面加入这段代码. var app = express() var appDa

[转] vue自定义组件(通过Vue.use()来使用)即install的使用

在vue项目中,我们可以自定义组件,像element-ui一样使用Vue.use()方法来使用,具体实现方法: 1.首先新建一个Cmponent.vue文件 // Cmponent.vue<template> <div> 我是组件 </div></template> <script> export default { }</script> <style scoped> div{ font-size:40px; color:

vue.js学习之 如何在better-scroll加载完成后,自动滚动到最底部

首先我们需要使用scrollTo这个方法: scrollTo(x, y, time, easing) 参数: {Number} x 横轴坐标(单位 px) {Number} y 纵轴坐标(单位 px) {Number} time 滚动动画执行的时长(单位 ms) {Object} easing 缓动函数,一般不建议修改,如果想修改,参考源码中的 ease.js 里的写法 为了组件的复用性,我们需要在scroll组件的props添加一个flag,可以监听父元素是否开启滚动到最底部. scrollT