详解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 相关文章推荐
项目实践之javascript技巧
Dec 06 Javascript
基于JQuery的6个Tab选项卡插件
Sep 03 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 Javascript
Javascript封装DOMContentLoaded事件实例
Jun 12 Javascript
AngularJS入门教程之服务(Service)
Jul 27 Javascript
网页中右键功能的实现方法之contextMenu的使用
Feb 20 Javascript
node.js中axios使用心得总结
Nov 29 Javascript
Angular 开发学习之Angular CLI的安装使用
Dec 31 Javascript
Vue使用axios出现options请求方法
May 30 Javascript
vue props对象validator自定义函数实例
Nov 13 Javascript
微信小程序云函数添加数据到数据库的方法
Mar 04 Javascript
uni-app 微信小程序授权登录的实现步骤
Feb 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
如何把PHP转成EXE文件
2006/10/09 PHP
MySQL授权问题总结
2007/05/06 PHP
实用函数8
2007/11/08 PHP
网页游戏开发入门教程二(游戏模式+系统)
2009/11/02 PHP
基于PHP+mysql实现新闻发布系统的开发
2020/08/06 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
artDialog 4.1.5 Dreamweaver代码提示/补全插件 附下载
2012/07/31 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
Jquery 实现grid绑定模板
2015/01/28 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
解决vue attr取不到属性值的问题
2018/09/18 Javascript
vue + typescript + 极验登录验证的实现方法
2019/06/27 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
分析python动态规划的递归、非递归实现
2018/03/04 Python
python selenium 弹出框处理的实现
2019/02/26 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
python写一个随机点名软件的实例
2019/11/28 Python
python3 xpath和requests应用详解
2020/03/06 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
美国最灵活的移动提供商:Tello
2017/07/18 全球购物
北美Newegg打造的全球尖货海购平台:tt海购
2018/09/28 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
几个常见的消息中间件(MOM)
2014/01/08 面试题
赡养老人协议书
2014/04/21 职场文书
节能宣传周活动总结
2014/05/08 职场文书
小学运动会演讲稿
2014/08/25 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
南湾猴岛导游词
2015/02/09 职场文书
公司会议开幕词
2016/03/03 职场文书
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记