html中require.config 缓存问题

栏目: IT技术 · 发布时间: 4年前

内容简介:在html中,require的但在实践过程中,我们可能会有很多需要配置的,比如jquery...然后我们大约会把这些配置写到配置文件,如下:

在html中,require的 官方基本 用法如下:

<!DOCTYPE html>
<html>
    <head>
        <title>My Sample Project</title>
        <!-- data-main attribute tells require.js to load
             scripts/main.js after require.js loads. -->
        <script data-main="scripts/main" src="scripts/require.js"></script>
    </head>
    <body>
        <h1>My Sample Project</h1>
    </body>
</html>

但在实践过程中,我们可能会有很多需要配置的,比如jquery...

然后我们大约会把这些配置写到配置文件,如下:

// require.config.js

require.config({
    paths: {
        jquery    : "/js/library/jquery.min",
    },
    shim : {
        
    }
});

然后,再在 main.js 中引用

//mian.js
require(["/js/require.config.js"],function(){
    "use strict";
    require(["jquery"], function ($) {
        //功能代码
    });
})

因为网页缓存问题,这种方式存在当 require.config.js 有修改时,客户端的 require.config.js 并不会更新的问题。同时如果有多个html都用了require,那每个模块的 main.js 都需要在头部加上述代码。

既然在require中引用 config,会有缓存问题,那我就把   require.config.js 放到 html ,并且增加版本控制。但需要注意的是,  rquire.config.js 必须放到   require.js 后面,因为他用到了require类。

如下

<!DOCTYPE html>
<html>
    <head>
        <title>My Sample Project</title>
        <!-- data-main attribute tells require.js to load
             scripts/main.js after require.js loads. -->
        <script data-main="scripts/main" src="scripts/require.js"></script>
        <script src="scripts/require.config.js?v=xxx"></script>
    </head>
    <body>
        <h1>My Sample Project</h1>
    </body>
</html>

这种形式会存在一个新的问题:当 require.config.js 修改后,由于   require.js 已经在浏览器缓存,所以很快(快到   require.config.js 还未加载完成)就会加载   main.js ,此时  man.js 没有享受到   require.config.js 中的配置。

这里我想到了 require.js 的模式(先加载   require.js , 再加载   main.js )与现在的需求(先加载  require.config.js ,再加载  main.js )大概相同。所以看了  require.js 中的实现,把相关部分的代码复制到   require.config.js

最终,我使用的代码样例如下:

需要注意的是:html 中,需要移动 data-main 的位置:

<!DOCTYPE html>
<html>
    <head>
        <title>My Sample Project</title>
        
             scripts/main.js after require.js loads. -->
        <script src="scripts/require.js"></script>
        <!-- data-main 移动到这里 -->
        <script src="scripts/require.config.js?v=xxx" data-main="scripts/main" ></script>
    </head>
    <body>
        <h1>My Sample Project</h1>
    </body>
</html>    
// require.config.js
;(function () {

    let rev = 'xxxx';


    let cfg = {
        // 不设置超时 = 0
        waitSeconds: 60,
        
        paths: {
            'jquery': '../../../../Common/Common/jquery-3.3.1/dist/jquery.min',
            
        },
        shim: {
            'jquery': {exports: 'jQuery'},
            
        },
        urlArgs: function (id, url) {
            if (url.indexOf('http') === 0) {
                return '';
            }
            let args = `rev=${rev}`;
            // /Common/Common 下的文件不用版本控制, 都是 3 方库
            if (url.indexOf('/Common/Common/') >= 0) {
                args = 'v=2'
            }
            return (url.indexOf('?') === -1 ? '?' : '&') + args;
        }
    };

    let dataMain = '';
    let scripts = document.getElementsByTagName('script');
    for (let i = scripts.length - 1; i > -1; i -= 1) {
        let script = scripts[i];
        let src = script.getAttribute('src');
        if (src.indexOf('require.common.config.js') > 0) {
            dataMain = script.getAttribute('data-main');
            if (dataMain) {
                //Preserve dataMain in case it is a path (i.e. contains '?')
                let mainScript = dataMain;

                //Set final baseUrl if there is not already an explicit one,
                //but only do so if the data-main value is not a loader plugin
                //module ID.
                if (!cfg.baseUrl && mainScript.indexOf('!') === -1) {
                    //Pull off the directory of data-main for use as the
                    //baseUrl.
                    src = mainScript.split('/');
                    mainScript = src.pop();
                    let subPath = src.length ? src.join('/') + '/' : './';

                    cfg.baseUrl = subPath;
                }
            }
            break;
        }
    }

    require.config(cfg);

    if (dataMain) {
        require([dataMain]);
    }

}());

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

浅薄

浅薄

[美]尼古拉斯·卡尔 / 刘纯毅 / 中信出版社 / 2015-11 / 49.00 元

互联网时代的飞速发展带来了各行各业效率的提升和生活的便利,但卡尔指出,当我们每天在翻看手机上的社交平台,阅读那些看似有趣和有深度的文章时,在我们尽情享受互联网慷慨施舍的过程中,我们正在渐渐丧失深度阅读和深度思考的能力。 互联网鼓励我们蜻蜓点水般地从多种信息来源中广泛采集碎片化的信息,其伦理规范就是工业主义,这是一套速度至上、效率至上的伦理,也是一套产量最优化、消费最优化的伦理——如此说来,互......一起来看看 《浅薄》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具