详解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 相关文章推荐
DHTML Slide Show script图片轮换
Mar 03 Javascript
让你的网站可编辑的实现js代码
Oct 19 Javascript
JQuery 引发两次$(document.ready)事件
Jan 15 Javascript
日期处理的js库(迷你版)--自建js库总结
Nov 21 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
Jun 09 Javascript
jquery实现可旋转可拖拽的文字效果代码
Jan 27 Javascript
Bootstrap3多级下拉菜单
Feb 24 Javascript
TypeScript入门-接口
Mar 30 Javascript
JavaScript对JSON数据进行排序和搜索
Jul 24 Javascript
Vue.extend实现挂载到实例上的方法
May 01 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 Javascript
vue中使用mockjs配置和使用方式
Apr 06 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
PHP4引用文件语句的对比
2006/10/09 PHP
让Json更懂中文(JSON_UNESCAPED_UNICODE)
2011/10/27 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
使用PHPExcel导出Excel表
2018/09/08 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
使用vue重构资讯页面的实例代码解析
2019/11/26 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
Python set常用操作函数集锦
2017/11/15 Python
python引入不同文件夹下的自定义模块方法
2018/10/27 Python
简单了解python协程的相关知识
2019/08/31 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
html5如何在Canvas中实现自定义路径动画示例
2017/09/18 HTML / CSS
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
尼克松手表官网:Nixon手表
2019/03/17 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
别名指示符是什么
2012/10/08 面试题
运动会广播稿60字
2014/01/15 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书