详解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下用层来实现select的title提示属性
Feb 23 Javascript
理解Javascript_06_理解对象的创建过程
Oct 15 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
Jun 24 Javascript
浅谈关于JavaScript API设计的一些建议和准则
Jun 24 Javascript
js实现汉字排序的方法
Jul 23 Javascript
jQuery添加options点击事件并传值实例代码
May 18 Javascript
vue.js+boostrap项目实践(案例详解)
Sep 21 Javascript
JS表单数据验证的正则表达式(常用)
Feb 18 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
Mar 17 Javascript
利用nginx + node在阿里云部署https的步骤详解
Dec 19 Javascript
react-router 路由切换动画的实现示例
Dec 03 Javascript
用webpack4开发小程序的实现方法
Jun 04 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实现操作redis的封装类完整实例
2015/11/14 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
javascript Demo模态窗口
2009/12/06 Javascript
jquery select下拉框操作的一些说明
2010/04/02 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
Lua表达式和控制结构学习笔记
2014/12/15 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
2015/06/01 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
vue实现简单表格组件实例详解
2017/04/16 Javascript
JS实现获取数组中最大值或最小值功能示例
2019/03/02 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
python如何实现word批量转HTML
2020/09/30 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
HTML5+CSS3 诱人的实例:3D立方体旋转动画实例
2016/12/30 HTML / CSS
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
英国复古服装购物网站:Collectif
2019/10/30 全球购物
网页美工求职信
2014/02/15 职场文书
学习决心书
2014/03/11 职场文书
道德之星事迹材料
2014/05/03 职场文书
2014报到证办理个人委托书
2014/10/08 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
公司行政管理制度范本
2015/08/05 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
2019年警察入党转正申请书最新范文
2019/09/03 职场文书