仅限HTML / JS的“捆绑”解决方案?

时间:2016-04-12 11:30:25

标签: javascript jquery bundling-and-minification deferred

我确信有人会告诉我为什么这是一个糟糕的想法,但它可能比我们已经发生的事情更好。所以我们所有的插件都被复制/粘贴到Master.js脚本中,这是一个更新或排序的噩梦。大多数插件都是缩小的(这很好),但我真的想从.net / c#/ aspx中获取捆绑的想法,并实现一些类似的东西来摆脱这个Master.js文件。复制/粘贴新脚本通常会冻结项目,其中几乎所有内容都已过时 - 所以这是我疯狂的科学:

在Master.js中,创建一个包含所有脚本的数组:

var scripts = [
    'jquery-1.10.2.min.js', // jQuery v1.10.2 | 2005 (https://code.jquery.com/)
    'jquery-migrate-1.2.1.min.js', // jQuery Migrate v1.2.1 | 2005 (https://code.jquery.com/)
    'jquery-ui.min.js', // jQuery UI v1.10.3 | 2014-09-14 (https://code.jquery.com/)
    'bootstrap.min.js', // Bootstrap v3.1.0 | 2014 (http://getbootstrap.com)
];

并创建一个循环以向页面添加脚本:

for (var i = 0; i < scripts.length; i++) {

    var link = 'MainJS/' + scripts[i];

    LoadJsCssFilePortal(link, 'js');

};

function LoadJsCssFilePortal(filename, filetype, callback) {

    // if filename is a external JavaScript file
    if (filetype == "js") {
        var fileref = document.createElement('script');
        fileref.setAttribute("type", "text/javascript");
        fileref.setAttribute("src", filename);

    };

    if (typeof fileref != "undefined") {

        // add this script to the document
        document.getElementsByTagName("head")[0].appendChild(fileref);
    };


};

我也有功能

function LoadAndRunPortalJS(url, callback) {

        var script = document.createElement("script")
        script.type = "text/javascript";

        if (script.readyState) {  //IE
            script.onreadystatechange = function () {
                if (script.readyState === "loaded" || script.readyState === "complete") {
                    script.onreadystatechange = null;
                    callback();
                }
            };
        } else {  //Others
            script.onload = function () {
                callback();
            };
        }

        script.src = url;
        document.getElementsByTagName("head")[0].appendChild(script);


};

具有内置回调并且被称为

LoadAndRunPortalJS(link, function () {
    // when done load next
});

问题是脚本未在

之前完成加载
  1. 循环中的下一个增量
  2. 页面上依赖于Master.js的其他脚本
  3. 通常,可以使用jquery延迟对象来强制执行脚本的顺序/完成,这样可以在加载第一个脚本(jquery)之后使用i&gt; 0 - 但这并不能解决在master之外运行的脚本问题。

1 个答案:

答案 0 :(得分:0)

这是脚本加载器/捆绑器的域。您可以考虑使用RequireJSWebpack来获得开箱即用的解决方案。如果你还想自己动手,请继续阅读。

我会用更具弹性的排序结构

替换你拥有的文件名数组
var manifest = [
    {key: 'jquery', file: 'jquery-1.10.2.min.js'}
    ...
}

这应该可以处理任何可能弹出的版本问题(它会)。数组结构也保留了你的加载顺序(不推荐这样的方法)。

在页面加载时,仅加载上述清单。您要调用的任何on load函数都必须延迟,直到加载脚本为止。我建议使用类似于广告管理员(例如,Google广告)处理它的方法。

var onBootloaderInit = [/* array of functions */];
....
onBootloaderInit.push(
    function() {
        /* Code inside can now use jQuery or the likes */
    }
);

加载完成后,您现在只需遍历onBootloaderInit数组,然后执行每个函数。

要确保脚本按您需要的顺序加载,并等待已排队的脚本,请使用脚本加载器(例如,LABjs)。

$LAB.script('<path to jQuery>').wait(function() {
    /* Code that depends on jQuery */
});