- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望优化在我的 MVC 项目中加载较大的 javascript 文件的方式。我已经在使用捆绑和缩小,但我真的想在加载 HTML 和 CSS 之后只加载其中的一些。我在看这种方法:
https://varvy.com/pagespeed/defer-loading-javascript.html
在这种方法中,在加载正文后,在加载/加载事件中使用 javascript 将脚本标记注入(inject)。我的问题是我想与框架提供的捆绑和缩小一起使用,但我还没有找到一个好的方法来做到这一点。
我只是想知道是否有人已经成功地将这种方法用于 MVC 项目,以及是否可能已经有一个库(在 Nuget 或其他方面)来促进这一点。
已编辑:这是我目前的解决方案,但我不确定我是否喜欢它。
由于捆绑框架可以返回单个脚本标签或它们的列表,具体取决于您是否在调试中运行,我们需要提取这些标签的源值。为此,我创建了一个静态助手。
public static string ExtactFromScriptBundle(string aBundle)
{
List<string> returnValue = new List<string>();
var jQueryString = Scripts.Render(aBundle).ToHtmlString();
var reg = new Regex("\".*?\"");
var matches = reg.Matches(jQueryString);
foreach (var match in matches)
{
returnValue.Add(match.ToString().Replace("\"", ""));
}
return Json.Encode(returnValue);
}
在 _layout.cshtml 中,您可以在标记之前插入如下所示的 block :
<script>
function downloadJSAtOnload() {
createScripElementsFromArray(@Html.Raw(ScriptHelper.ExtactFromScriptBundle("~/bundles/jquery")));
createScripElementsFromArray(@Html.Raw(ScriptHelper.ExtactFromScriptBundle("~/bundles/bootstrap")));
}
function createScripElementsFromArray(fileNameList) {
var arrayLength = fileNameList.length;
for (var i = 0; i < arrayLength; i++) {
createScripElement(fileNameList[i]);
}
}
function createScripElement(fileName) {
var element = document.createElement("script");
element.src = fileName;
document.body.appendChild(element);
console.log(fileName + " was loaded");
}
if (window.addEventListener)
window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
window.attachEvent("onload", downloadJSAtOnload);
else window.onload = downloadJSAtOnload;
</script>
在我看来这有点麻烦,因为我渲染包只是为了解析输出,但我想我也可以缓存这些输出以进一步优化页面渲染。
最佳答案
通过 Occam's Razor , 最好的解决方案是使用 defer 属性 ...
<script src='myJavaScriptFile.js' defer></script>
如果你想在 ASP.NET MVC 中使用它,那么你将这样做:
像这样创建一个新的 Razor 命令:
public static class Scripts
{
public static IHtmlString RenderDeferred(params string[] paths)
{
return Scripts.RenderFormat(@"<script src='{0}' defer></script>", paths);
}
}
然后像这样使用它:
@Scripts.RenderDeferred("~/myBundle/myJavaScriptBundle")
关于javascript - 延迟在 asp.net MVC 中加载 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32616517/
我正在开发一个需要能够平均三个数字的 Facebook 应用程序。但是,它总是返回 0 作为答案。这是我的代码: $y = 100; $n = 250; $m = 300; $number = ($y
我只是无法弄清楚这一点,也找不到任何对我来说有意义的类似问题。我的问题:我从数据库中提取记录,并在我的网页上以每个面板 12 条的倍数显示它们。因此,我需要知道有多少个面板可以使用 JavaScrip
我是一名优秀的程序员,十分优秀!