详解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.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
Oct 11 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
Aug 15 Javascript
轻松实现javascript图片轮播特效
Jan 13 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
Aug 03 Javascript
表单元素值获取方式js及java方式的简单实例
Oct 15 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
Aug 25 Javascript
通俗易懂地解释JS中的闭包
Oct 23 Javascript
react 实现页面代码分割、按需加载的方法
Apr 03 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
Aug 10 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
Aug 28 Javascript
详解vue的数据劫持以及操作数组的坑
Apr 18 Javascript
js实现搜索提示框效果
Sep 05 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 正则表达式常用函数
2014/08/17 PHP
如何直接访问php实例对象中的private属性详解
2017/10/12 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
JavaScript中的数值范围介绍
2014/12/29 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
从零开始学习Node.js系列教程三:图片上传和显示方法示例
2017/04/13 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
js实现数字滚动特效
2019/12/16 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
python线程中的同步问题及解决方法
2019/08/29 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
Python Request类源码实现方法及原理解析
2020/08/17 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
公司庆典活动邀请函
2014/01/09 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
优质护理服务演讲稿
2014/05/07 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
计算机专业自荐信
2015/03/05 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
关于开学的感想
2015/08/10 职场文书
环保建议书作文500字
2015/09/14 职场文书
导游词之韩国济州岛
2019/10/28 职场文书
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
【2·13】一图读懂中国无线电发展
2022/02/18 无线电
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js
mysql 8.0.27 绿色解压版安装教程及配置方法
2022/04/20 MySQL