详解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 相关文章推荐
任意位置显示html菜单
Feb 01 Javascript
js 第二代身份证号码的验证机制代码
May 12 Javascript
页面实时更新时间的JS实例代码
Dec 18 Javascript
js实现回放拖拽轨迹从过程上进行分析
Jun 26 Javascript
JavaScript的面向对象编程基础
Aug 13 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
May 17 Javascript
jQuery中的AjaxSubmit使用讲解
Sep 25 Javascript
微信小程序 Record API详解及实例代码
Sep 30 Javascript
Node.js 实现简单的接口服务器的实例代码
May 23 Javascript
vue鼠标悬停事件实例详解
Apr 01 Javascript
JavaScript怎样在删除前添加确认弹出框?
May 27 Javascript
vue如何批量引入组件、注册和使用详解
May 12 Vue.js
详解微信第三方小程序代开发
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的autoload自动加载机制使用说明
2010/12/28 PHP
phpcms配置列表页以及获得文章发布时间
2017/07/04 PHP
用PHP做了一个领取优惠券活动的示例代码
2019/07/05 PHP
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
javascript正则表达式基础知识入门
2015/04/20 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
ionic实现下拉刷新载入数据功能
2017/05/11 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
vue项目打包上传github并制作预览链接(pages)
2019/04/19 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
vue-router路由模式详解(小结)
2019/08/26 Javascript
对layui中table组件工具栏的使用详解
2019/09/19 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
2020/02/21 Python
Python实现汇率转换操作
2020/05/03 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
css3 flex布局 justify-content:space-between 最后一行左对齐
2020/01/02 HTML / CSS
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
La Senza官网:北美顶尖性感内衣品牌
2018/08/03 全球购物
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
个人合作协议书范本
2014/04/18 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
纪检监察建议书
2014/05/19 职场文书
2014年班务工作总结
2014/12/02 职场文书
欢迎词范文
2015/01/27 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书