详解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 相关文章推荐
点图片上一页下一页翻页效果
Jul 09 Javascript
javascript和jquery修改a标签的href属性
Dec 16 Javascript
JavaScript中提前声明变量或函数例子
Nov 12 Javascript
关于JavaScript作用域你想知道的一切
Feb 04 Javascript
jQuery fadeOut 异步实例代码详解
Aug 18 Javascript
JS html时钟制作代码分享
Mar 03 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
Mar 07 Javascript
JavaScript 异步调用
Oct 25 Javascript
spirngmvc js传递复杂json参数到controller的实例
Mar 29 Javascript
js使用formData实现批量上传
Mar 27 Javascript
layui使用form表单实现post请求页面跳转的方法
Sep 14 Javascript
手把手教您实现react异步加载高阶组件
Apr 07 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汉字转换拼音的类
2013/06/18 PHP
JavaScript中的其他对象
2008/01/16 Javascript
javascript 自动转到命名锚记
2009/01/10 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
2020/12/13 Javascript
EasyUI学习之DataGird分页显示数据
2016/12/29 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
layui分页效果实现代码
2017/05/19 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
javascript trie前缀树的示例
2018/01/29 Javascript
react以create-react-app为基础创建项目
2018/03/14 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
JS动态显示倒计时效果
2019/12/12 Javascript
微信小程序后端无法保持session的原因及解决办法问题
2020/03/20 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[01:38:19]夜魇凡尔赛茶话会 第五期
2021/03/11 DOTA
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
python实现决策树ID3算法的示例代码
2018/05/30 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
简述安装Slackware Linux系统的过程
2012/01/12 面试题
幼儿运动会邀请函
2014/01/17 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
欢迎横幅标语
2014/06/17 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
python可视化之颜色映射详解
2021/09/15 Python