vue+webpack实现异步组件加载的方法


Posted in Javascript onFebruary 03, 2018

8.9更新:之前想搬迁到csdn的时候由于邀请码问题迟迟没把博客转过来,所以跑去博客园了,今天发现csdn已经帮我把文章搬过来,有必要修正一下这篇文章。

写这篇文章的时候因为刚接触vue,所以捣鼓的时候有些迷糊。

----------------/*以下可以跳过*/-----------------

本来很简单的事情折腾好久。

1.vue文档只给出了Vue.component('comp_name',function(resolve,reject){})在回调里ajax加载组件定义内容的例子,但现在习惯.vue文件写组件,在点击路由获取.vue的时候怎么弄呢?

2.webpack的coding-split支持commonjs/amd语法,即有不同的实现。网上查了n多案例乱七八糟的,最后确定两种写法

commonjs语法:const setting = resolve => require.ensure([], ()=> resolve(require('./components/setting.vue')),'setting');

文档的写法:resolve =>require(['./components/setting.vue')],resolve);//懒加载

当时我是结合了路由一起练习,用的第一种,在github上看到的,require.ensure是webpack的语法,在打包的时候将require.ensure部分指定的代码切割出来打包在另一个chunk上,webpack.config.js里面加上chunkFileName项即可。require.ensure的三个参数分别是:依赖的url,回调,自定义的chunk的名字。

其实,code split本质上就是,将你require的模块单独出来另外打包,等用到的时候再由浏览器发起异步获取,并通过scriptdom的形式插入到head中,这是它的底层实现。我自己尝试的时候,每获取一次异步组件,head中都会插入两个标签,一个script,yigestyle,因为.vue文件最终会解析成html,css和js。

PS:其实webpack官网的示例代码并没有resolve=>这种写法,直接在函数里require.ensure就是了,一开始有点疑惑,网上找不到讲解,自己研究发现require.ensure这个函数,webpack打包编译之后

是一个_webpack_require_.e的函数,其本身是一个一个thenable实例,require.ensure的回调放到_webpack_require_.e.then(fn)里面,这下子就很明显了,webpack的这个语法本身应该是一个promise实例,只是上面获取vue组件的写法里,因为require.ensure是封装好的语法,只好把resolve传入其父函数中,在require.ensure的回调里通过作用域链获取并调用。这也揭露了,resolve函数不一定要在promise的函数参数中,其出现位置可以灵活设置,在阮一峰老师的ES6入门里提到过,resolve函数是js引擎能提供的,不需要自己部署。

------------------/*以上可跳过*/------------------

首先,异步组件的使用没刚接触时以为的那么复杂。

1.如果套用官网的方式是可以的:

HTML:

<input type="button" @click="showchild" value="show"> //点击按钮后,show为真,先获取child组件,再渲染div内容
<div id="contain" v-if="show">
 <child></child>
 </div>

JS:

//...
data () {
  return {
   msg: 'Welcome to Your Vue.js App',
   show:false
  }
 },
 methods: {
  showchild:function(){
   this.show=true;
   }
 },
 components: {
   'child': function(resolve) {
    require(['./components/child.vue'], resolve);
 }

*注意:加载异步组件的时候,组件名后边的.vue不要忽略。

这个例子应该比较直观了。点击按钮之后改变了变量show的布尔值为真,由于child.vue是异步组件,所以会先ajax获取组件然后渲染。

在很多情况下异步组件会配合vue-router使用来切换视图,其实这时候用哪种语法的都可以。

vue+webpack实现异步组件加载的方法

以上这篇vue+webpack实现异步组件加载的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Firefox 无法获取cssRules 的解决办法
Oct 11 Javascript
js向上无缝滚动,网站公告效果 具体代码
Nov 18 Javascript
JavaScript判断变量是对象还是数组的方法
Aug 28 Javascript
详解js图片轮播效果实现原理
Dec 17 Javascript
JS &amp; JQuery 动态添加 select option
Jun 08 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
Jun 14 Javascript
异步加载JS、CSS代码(推荐)
Jun 15 Javascript
React Native使用Modal自定义分享界面的示例代码
Oct 31 Javascript
jQuery使用bind动态绑定事件无效的处理方法
Dec 11 jQuery
vue-cli配置全局sass、less变量的方法
Jun 06 Javascript
使用vant的地域控件追加全部选项
Nov 03 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
基于vue-resource jsonp跨域问题的解决方法
Feb 03 #Javascript
vue.js使用代理和使用Nginx来解决跨域的问题
Feb 03 #Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
Feb 03 #Javascript
JavaScript设计模式之调停者模式实例详解
Feb 03 #Javascript
JavaScript实现求最大公共子串的方法
Feb 03 #Javascript
Node.js实现mysql连接池使用事务自动回收连接的方法示例
Feb 03 #Javascript
js删除数组中的元素delete和splice的区别详解
Feb 03 #Javascript
You might like
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
黑夜路人出的几道php笔试题
2009/08/04 PHP
解析php dirname()与__FILE__常量的应用
2013/06/24 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
PHP实现可精确验证身份证号码的工具类示例
2018/05/31 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
vue实现ajax滚动下拉加载,同时具有loading效果(推荐)
2017/01/11 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
深入理解Vue生命周期、手动挂载及挂载子组件
2017/09/27 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
2020/01/14 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
JavaScript如何实现防止重复的网络请求的示例
2021/01/28 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
Python编程实现蚁群算法详解
2017/11/13 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
python os用法总结
2018/06/08 Python
Python代码太长换行的实现
2019/07/05 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
python要安装在哪个盘
2020/06/15 Python
Django视图、传参和forms验证操作
2020/07/15 Python
navabi英国:设计师大码女装
2019/06/25 全球购物
小学教师岗位职责
2013/11/25 职场文书
农村婚礼证婚词
2014/01/08 职场文书
环保项目建议书
2014/08/26 职场文书
同意迁入证明模板
2014/10/26 职场文书
2014年机关党委工作总结
2014/12/11 职场文书
springboot应用服务启动事件的监听实现
2022/04/06 Java/Android
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python