详解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 load方法用法集锦
Dec 06 Javascript
js 实现日期灵活格式化的小例子
Jul 14 Javascript
JQ技术实现注册页面带有校验密码强度
Jul 27 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
js图片上传前预览功能(兼容所有浏览器)
Aug 24 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
Oct 14 Javascript
AngularJS 仿微信图片手势缩放的实例
Sep 28 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
react-router v4如何使用history控制路由跳转详解
Jan 09 Javascript
web页面和微信小程序页面实现瀑布流效果
Sep 26 Javascript
JavaScript交换变量的常用方法小结【4种方法】
May 07 Javascript
js实现上传图片到服务器
Apr 11 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
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
详解PHP中的8个魔术常量
2020/07/06 PHP
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
jquery实现可关闭的倒计时广告特效代码
2015/09/02 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
jQuery实现每隔几条元素增加1条线的方法
2016/06/27 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
使用Python对Excel进行读写操作
2017/03/30 Python
Python MySQL数据库连接池组件pymysqlpool详解
2017/07/07 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
Python高级用法总结
2018/05/26 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
简单介绍django提供的加密算法
2019/12/18 Python
Python sys模块常用方法解析
2020/02/20 Python
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
总经理办公室主任岗位职责
2013/11/12 职场文书
企业文化建设实施方案
2014/03/22 职场文书
高一学生期末评语
2014/04/25 职场文书
消防志愿者活动方案
2014/08/23 职场文书
计划生育证明书写要求
2014/09/17 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
《去年的树》教学反思
2016/02/18 职场文书
解析Java中的static关键字
2021/06/14 Java/Android
PHP中多字节字符串操作实例详解
2021/08/23 PHP
java executor包参数处理功能 
2022/02/15 Java/Android