"捆绑;仅适用于HTML/JS的解决方案
"Bundling" solution for HTML/JS only?
我相信有人会告诉我为什么这是一个糟糕的想法,但它可能比我们已经做的要好。因此,我们所有的插件都被复制/粘贴到了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
});
问题是脚本在之前没有完成加载
- 循环中的下一个增量
- 页面上依赖Master.js的其他脚本
通常,可以使用jquery延迟对象来强制执行脚本的顺序/完成,因此这可能在加载第一个脚本(jquery)i>0之后使用,但这并不能解决脚本在master之外运行的问题。
这是脚本加载程序/打包程序的领域。您可能会考虑使用RequireJS,即开箱即用解决方案的Webpack。如果你仍然想自己滚动,请继续阅读。
我会用这种更有弹性的结构来替换你的文件名数组
var manifest = [
{key: 'jquery', file: 'jquery-1.10.2.min.js'}
...
}
这应该可以处理任何未来可能弹出的版本控制问题。数组结构还保留了您的加载顺序(不建议使用这样的方法)。
在页面加载时,只会加载上面描述的清单。您想要调用的任何on load
函数都必须延迟,直到加载脚本为止。我建议使用类似于广告经理(例如,谷歌广告)处理它的方法
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 */
});
相关文章:
- 在向下滚动JS/HTML/CSS wordpress网站时替换徽标图像
- 将Rails后端添加到JS/HTML/CSS应用程序时,正确的文件位置是什么
- 可以't在Angular js/HTML中获取单个记录
- 如何在angular js/HTML中处理数组
- JS HTML CSS Accordion
- 当包含在CSS/JS/HTML中时,我如何得出正确的目录路径
- JS/HTML function
- 如何在JS/HTML中将函数输出发送到表单元格
- 挖空 JS html 绑定返回奇怪的代码而不是 html 字符串
- 下划线.js HTML 元素中的模板
- Knockout.js - “html”绑定中的“值”绑定
- Angular.js & HTML / 如何并排组合 2 个元素
- DevExpress (JS / HTML) 将事件附加到弹出窗口中的元素
- 将数据从 C# 传递到 angular js html
- 我如何在我的 AngularJS 中获取这个 D3.js HTML 元素,以便我可以操作它
- 强制设备方向通过 CSS/JS/HTML 横向
- 动态更新地铁列表在水平滚动时查看 (JS/HTML)
- WinJS UI JS/HTML 控件是否可以在 Metro 之外使用
- 如何使网页一次只能访问一次?(JS+HTML)
- 如何在 JS / HTML 中添加更改图像的文本