详解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 相关文章推荐
javascript 有用的脚本函数
May 07 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
Mar 23 Javascript
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
Javascript学习笔记之 对象篇(三) : hasOwnProperty
Jun 24 Javascript
jquery+css实现动感的图片切换效果
Nov 25 Javascript
jQuery实现的导航动画效果(附demo源码)
Apr 01 Javascript
angularjs实现多张图片上传并预览功能
Feb 24 Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
Aug 29 Javascript
bootstrap模态框关闭后清除模态框的数据方法
Aug 10 Javascript
浅谈v-for 和 v-if 并用时筛选条件方法
Nov 07 Javascript
微信小程序实现锚点功能
Nov 20 Javascript
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 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
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
DOM基础教程之使用DOM控制表格
2015/01/20 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
python学习教程之使用py2exe打包
2017/09/24 Python
Python实现的用户登录系统功能示例
2018/02/05 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
Tensorflow实现神经网络拟合线性回归
2019/07/19 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
python剪切视频与合并视频的实现
2020/03/03 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
教师自荐信范文
2013/12/09 职场文书
会计专业个人自我鉴定
2014/03/21 职场文书
一年级学生期末评语
2014/04/21 职场文书
机电专业求职信
2014/06/14 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2014年创卫工作总结
2014/11/24 职场文书
暖春观后感
2015/06/08 职场文书
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js