详解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+Dhtml:WEB程序员简易开发工具包(预先体验版)
Nov 07 Javascript
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
Apr 24 Javascript
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
Oct 14 Javascript
js实时获取系统当前时间实例代码
Jun 28 Javascript
一个js控制的导航菜单实例代码
Dec 03 Javascript
js身份证判断方法支持15位和18位
Mar 18 Javascript
教你用jquery实现iframe自适应高度
Jun 11 Javascript
jQuery+CSS3实现树叶飘落特效
Feb 01 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
Jan 26 Javascript
深入理解node exports和module.exports区别
Jun 01 Javascript
对称加密与非对称加密优缺点详解
Feb 06 Javascript
JS实现运动缓冲效果的封装函数示例
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对mongodb的扩展(初出茅庐)
2012/11/11 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
解决vue中使用Axios调用接口时出现的ie数据处理问题
2018/08/13 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
Vue实现多页签组件
2021/01/14 Vue.js
[04:45]DOTA2上海特级锦标赛主赛事第四日RECAP
2016/03/06 DOTA
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
python logging设置level失败的解决方法
2020/02/19 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
美国网上花店:JustFlowers
2017/02/12 全球购物
医药工作岗位求职信分享
2013/12/31 职场文书
简单的项目建议书模板
2014/03/12 职场文书
家长寄语大全
2014/04/02 职场文书
家长会学生演讲稿
2014/04/26 职场文书
项目建议书范文
2014/05/12 职场文书
经验交流材料格式
2014/12/30 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
项目投资意向书范本
2015/05/09 职场文书
导游词之云南丽江-泸沽湖
2019/09/26 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android