详解webpack异步加载业务模块


Posted in Javascript onJune 23, 2017

虽然把我们用到的JS文件全部打包一个可以节省请求数,但如果打包后的JS文件过大,那么也容易出现白屏现象,许多操作失灵。而且一些区域是点到才出现,那么相关的JS其实可以剥离出这个大JS文件外。这就涉及到异步加载了。异步加载是SPA的重要构建方式之一。

我们沿着上一篇的目录,这次学习webpack的require.ensure API。此文件也叫做ensure.html,涉及到avalon, jquery,还有两个业务代码ensure.js与ensure_a.js.

详解webpack异步加载业务模块

先看我们的页面:

<!DOCTYPE html>

<html>

  <head>

    <title>require.ensure</title>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width">

    <script src="dist/common.js"></script>

    <script src="dist/ensure.js"></script>

 

  </head>

  <body ms-controller="test">

    <p><button type="button" ms-click="click">{{aaa}}</button></p>

    <div id="add"></div>

  </body>

</html>

我们的目的是在点击按钮后,再动态生成一个HTML区域,里面使用avalon进行渲染。

//ensure.js

var avalon = require("avalon")

 

avalon.define({

  $id: "test",

  aaa: "测试require.ensure效果",

  click: function () {

    avalon.log("进入点击事件回调")

    if (!avalon.vmodels.bbb) {

      require.ensure(["jquery"], function () {//这里是异步的

        console.log("进入require.ensure回调")

        require("./ensure_a.js")

        console.log("调用完require.ensure")

      })

    }

  }

})

它需要动态加载另一个业务代码,并且必须待到jquery加载回来才执行。

var avalon = require("avalon")

var $ = require("jquery")

 

avalon.log("这是异步加载的脚本")

$("#add").html("<div ms-controller="bbb">{{bbb}}</div>")

var vm = avalon.define({

  $id: "bbb",

  bbb: "这是新加的内容"

})

avalon.scan($("#add")[0], vm)

最后我们看重头戏的webpack.config.js, 为了抽象异步的部分为一个独立的文件,我们需要为它指定名字,这使用output.chunkFilename配置项实现,还需要指定路径,这使用output.publicPath配置项实现。

var webpack = require("webpack"); 

var path = require("path");

var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js');

module.exports = {

  entry: {

    index: './dev/index', //我们开发时的入口文件

    router: './dev/router',

    router2: './dev/router2',

    ensure: './dev/ensure'

  },

  output: {

    path: path.join(__dirname, "dist"), 

    filename: "[name].js",

    publicPath:"dist/", //给require.ensure用

    chunkFilename: "[name].chunk.js"//给require.ensure用

  }, //页面引用的文件

   

  module: {

    loaders: [

      {test: /\.css$/, loader: 'style-loader!css-loader'}

    ],

    preLoaders: [

      {test: /\.js$/, loader: "amdcss-loader"}

    ]

  },

  plugins: [commonsPlugin],

  resolve: {

    extensions: ['.js', "", ".css"],

    alias: {

      jquery: path.join(__dirname, 'dev/jquery/jquery.js'),

      avalon: path.join(__dirname, 'dev/avalon/avalon.shim'), //在正常情况下我们以CommonJS风格引用avalon,以require('avalon')

      '../avalon': path.join(__dirname, 'dev/avalon/avalon.js')//由于oniui都以是../avalon来引用avalon的,需要在这里进行别名

    }

  }

}

然后执行webpack命令就能看到效果:

详解webpack异步加载业务模块

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery 学习之一 对象访问
Nov 23 Javascript
JavaScript创建一个object对象并操作对象属性的用法
Mar 23 Javascript
JS实现适合于后台使用的动画折叠菜单效果
Sep 21 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
Nov 26 Javascript
jquery及js实现动态加载js文件的方法
Jan 21 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
vue router2.0二级路由的简单使用
Jul 05 Javascript
seajs中最常用的7个功能、配置示例
Oct 10 Javascript
JavaScript数据结构之双向链表和双向循环链表的实现
Nov 28 Javascript
详解基于mpvue微信小程序下载远程图片到本地解决思路
May 16 Javascript
详解Node.js异步处理的各种写法
Jun 09 Javascript
关于vue 结合原生js 解决echarts resize问题
Jul 26 Javascript
详解微信第三方小程序代开发
Jun 23 #Javascript
Easyui在treegrid添加控件的实现方法
Jun 23 #Javascript
详解用vue.js和laravel实现微信支付
Jun 23 #Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 #Javascript
妙用Angularjs实现表格按指定列排序
Jun 23 #Javascript
VUE中v-model和v-for指令详解
Jun 23 #Javascript
JavaScript正则表达式简单实用实例
Jun 23 #Javascript
You might like
PHP函数http_build_query使用详解
2014/08/20 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
dedecms中使用php语句指南
2014/11/13 PHP
php数组查找函数总结
2014/11/18 PHP
PHP扩展开发入门教程
2015/02/26 PHP
php HTML无刷新提交表单
2016/04/05 PHP
Jquery截取中文字符串的实现代码
2010/12/22 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
Django与JS交互的示例代码
2017/08/23 Python
Python基于百度云文字识别API
2018/12/13 Python
利用Django提供的ModelForm增删改数据的方法
2019/01/06 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
Pycharm小白级简单使用教程
2020/01/08 Python
详解pandas中iloc, loc和ix的区别和联系
2020/03/09 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
python网络编程之五子棋游戏
2020/05/14 Python
python实现最短路径的实例方法
2020/07/19 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
如何查询Oracle数据库中已经创建的索引
2013/10/11 面试题
C#面试题问题集
2016/04/02 面试题
委托书范本
2014/09/13 职场文书
工厂标语大全
2014/10/06 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
公司管理制度范本
2015/08/03 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
个人向公司借款协议书
2016/03/19 职场文书