详解webpack异步加载业务模块

虽然把我们用到的JS文件全部打包一个可以节省请求数,但如果打包后的JS文件过大,那么也容易出现白屏现象,许多操作失灵。而且一些区域是点到才出现,那么相关的JS其实可以剥离出这个大JS文件外。这就涉及到异步加载了。异步加载是SPA的重要构建方式之一。

我们沿着上一篇的目录,这次学习webpack的require.ensure API。此文件也叫做ensure.html,涉及到avalon,jquery,还有两个业务代码ensure.js与ensure_a.js.

先看我们的页面

rush:xhtml;">
<title>require.ensure</title>

<<a href="https://www.jb51.cc/tag/Meta/" target="_blank" class="keywords">Meta</a> charset="UTF-8"&gt;

<<a href="https://www.jb51.cc/tag/Meta/" target="_blank" class="keywords">Meta</a> name="viewport" content="width=device-width"&gt;

<script src="<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>t/common.js"&gt;</script>

<script src="<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>t/ensure.js"&gt;</script>

<body ms-controller="test">

<p><button type="button" ms-click="click"&gt;{{aaa}}</button></p>

<div id="add"&gt;</div>

我们的目的是在点击按钮后,再动态生成一个HTML区域,里面使用avalon进行渲染。

rush:js;"> //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("<a href="https://www.jb51.cc/tag/diaoyong/" target="_blank" class="keywords">调用</a>完require.ensure")

  })

}

}

})

它需要动态加载另一个业务代码,并且必须待到jquery加载回来才执行。

rush:js;"> var avalon = require("avalon")

var $ = require("jquery")

avalon.log("这是异步加载的脚本")

$("#add").html("<div ms-controller="bbb">{{bbb}}

")

var vm = avalon.define({

$id: "bbb",bbb: "这是新加的内容"

})

avalon.scan($("#add")[0],vm)

最后我们看重头戏的webpack.config.js, 为了抽象异步的部分为一个独立的文件,我们需要为它指定名字,这使用output.chunkFilename配置项实现,还需要指定路径,这使用output.publicPath配置项实现。

rush:js;"> var webpack = require("webpack");

var path = require("path");

var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js');

module.exports = {

entry: {

index: './dev/index',//我们开发时的入口<a href="https://www.jb51.cc/tag/wenjian/" target="_blank" class="keywords">文件</a>

router: './dev/router',router2: './dev/router2',ensure: './dev/ensure'

},output: {

path: path.join(__dirname,"<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>t"),filename: "[name].js",publicPath:"<a href="https://www.jb51.cc/tag/dis/" target="_blank" class="keywords">dis</a>t/",//给require.ensure用

chunkFilename: "[name].chunk.js"//给require.ensure用

},//页面引用的文件

module: {

loaders: [

  {test: /\.css$/,loader: 'style-loader!<a href="https://www.jb51.cc/tag/css/" target="_blank" class="keywords">css-</a>loader'}

],preLoaders: [

  {test: /\.js$/,loader: "amd<a href="https://www.jb51.cc/tag/css/" target="_blank" class="keywords">css-</a>loader"}

]

},plugins: [commonsPlugin],resolve: {

extensions: ['.js',"",".css"],alias: {

  jquery: path.join(__dirname,'dev/jquery/jquery.js'),avalon: path.join(__dirname,'dev/avalon/avalon.shim'),//在正常情况下我们以Commo<a href="https://www.jb51.cc/tag/njs/" target="_blank" class="keywords">njs</a>风格引用avalon,以require('avalon')

  '../avalon': path.join(__dirname,'dev/avalon/avalon.js')//由于on<a href="https://www.jb51.cc/tag/iui/" target="_blank" class="keywords">iui</a>都以是../avalon来引用avalon的,需要<a href="https://www.jb51.cc/tag/zaizheli/" target="_blank" class="keywords">在这里</a>进行别名

}

}

}

后执行webpack命令就能看到效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...