详解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 处理网页内容的实现代码
Feb 15 Javascript
在linux中使用包管理器安装node.js
Mar 13 Javascript
js实现鼠标经过表格行变色的方法
May 12 Javascript
JavaScript中的pow()方法使用详解
Jun 15 Javascript
ClearTimeout消除闪动实例代码
Feb 29 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
Feb 26 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
Nov 22 Javascript
解决vue接口数据赋值给data没有反应的问题
Aug 27 Javascript
Vue源码学习之关于对Array的数据侦听实现
Apr 23 Javascript
Vue商品控件与购物车联动效果的实例代码
Jul 21 Javascript
详解webpack的文件监听实现(热更新)
Sep 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
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
php 获取一个月第一天与最后一天的代码
2010/05/16 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
利用PHP扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
PHP 5.5 创建和验证哈希最简单的方法详解
2013/11/07 PHP
php使用mkdir创建多级目录入门例子
2014/05/10 PHP
在Yii框架中使用PHP模板引擎Twig的例子
2014/06/13 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
javascript为按钮注册回车事件(设置默认按钮)的方法
2015/05/09 Javascript
javascript日期处理函数,性能优化批处理
2015/09/06 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
Vue中的v-for循环key属性注意事项小结
2018/08/12 Javascript
让 babel webpack vue 配置文件支持智能提示的方法
2019/06/22 Javascript
微信公众号H5之微信分享常见错误和问题(小结)
2019/11/14 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
python实现12306火车票查询器
2017/04/20 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
Python爬虫文件下载图文教程
2018/12/23 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python如何将字符串转换为日期
2020/07/31 Python
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
学期自我鉴定
2013/11/04 职场文书
搞笑获奖感言
2014/01/30 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
家庭困难证明
2014/10/12 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript