Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

webpack异步加载业务模块

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

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

先看我们的页面:

<!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命令就能看到效果:

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(17089)  评论(2编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2013-11-20 迷你MVVM框架 avalonjs 0.98发布
2012-11-20 Mozilla Firefox 17 正式发布
2011-11-20 node.js 一个简单的页面输出
2009-11-20 jQuery源码学习笔记二
2009-11-20 jQuery源码学习笔记一
点击右上角即可分享
微信分享提示