详解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 相关文章推荐
js的闭包的一个示例说明
Nov 18 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
Feb 13 Javascript
JavaScript DOM元素尺寸和位置
Apr 13 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
Oct 16 Javascript
JS实现探测网站链接的方法【测试可用】
Nov 08 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
node.js + socket.io 实现点对点随机匹配聊天
Jun 30 Javascript
详解SPA中前端路由基本原理与实现方式
Sep 12 Javascript
vue 优化CDN加速的方法示例
Sep 19 Javascript
深入理解移动前端开发之viewport
Oct 19 Javascript
jQuery实现的老虎机跑动效果示例
Dec 29 jQuery
ES6如何用一句代码实现函数的柯里化
Jan 18 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
ThinkPHP分页实例
2014/10/15 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
用jQuery技术实现Tab页界面之二
2009/09/21 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
jQuery使用andSelf()来包含之前的选择集
2014/05/19 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
JavaScript实现职责链模式概述
2018/01/25 Javascript
详解Chart.js轻量级图表库的使用经验
2018/05/22 Javascript
es6中reduce的基本使用方法
2019/09/10 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
详解python中requirements.txt的一切
2017/03/03 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
Python内置模块logging用法实例分析
2018/02/12 Python
使用Python从零开始撸一个区块链
2018/03/14 Python
Python 忽略warning的输出方法
2018/10/18 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
Keras自动下载的数据集/模型存放位置介绍
2020/06/19 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
竞争性谈判邀请书
2014/02/06 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
写给老师的感谢信
2015/01/20 职场文书