Browse Source

Load script/style asynchronously.

Resolve #10306
pull/10317/head
maliming 5 years ago
parent
commit
54871ac651
No known key found for this signature in database GPG Key ID: 96224957E51C89E
  1. 1
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelperService.cs
  2. 1
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleTagHelperService.cs
  3. 5
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpScriptBundleTagHelper.cs
  4. 5
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpScriptTagHelper.cs
  5. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpStyleBundleTagHelper.cs
  6. 5
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpStyleTagHelper.cs
  7. 5
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs
  8. 24
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs
  9. 24
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptStyleLoadingOptions.cs
  10. 28
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs

1
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleItemTagHelperService.cs

@ -28,6 +28,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
{ {
await ResourceService.ProcessAsync( await ResourceService.ProcessAsync(
TagHelper.ViewContext, TagHelper.ViewContext,
TagHelper,
context, context,
output, output,
new List<BundleTagHelperItem> new List<BundleTagHelperItem>

1
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpBundleTagHelperService.cs

@ -20,6 +20,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
{ {
await ResourceService.ProcessAsync( await ResourceService.ProcessAsync(
TagHelper.ViewContext, TagHelper.ViewContext,
TagHelper,
context, context,
output, output,
await GetBundleItems(context, output), await GetBundleItems(context, output),

5
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpScriptBundleTagHelper.cs

@ -5,10 +5,13 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
[HtmlTargetElement("abp-script-bundle", TagStructure = TagStructure.NormalOrSelfClosing)] [HtmlTargetElement("abp-script-bundle", TagStructure = TagStructure.NormalOrSelfClosing)]
public class AbpScriptBundleTagHelper : AbpBundleTagHelper<AbpScriptBundleTagHelper, AbpScriptBundleTagHelperService>, IBundleTagHelper public class AbpScriptBundleTagHelper : AbpBundleTagHelper<AbpScriptBundleTagHelper, AbpScriptBundleTagHelperService>, IBundleTagHelper
{ {
[HtmlAttributeName("defer")]
public bool Defer { get; set; }
public AbpScriptBundleTagHelper(AbpScriptBundleTagHelperService service) public AbpScriptBundleTagHelper(AbpScriptBundleTagHelperService service)
: base(service) : base(service)
{ {
} }
} }
} }

5
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpScriptTagHelper.cs

@ -5,6 +5,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
[HtmlTargetElement("abp-script", TagStructure = TagStructure.NormalOrSelfClosing)] [HtmlTargetElement("abp-script", TagStructure = TagStructure.NormalOrSelfClosing)]
public class AbpScriptTagHelper : AbpBundleItemTagHelper<AbpScriptTagHelper, AbpScriptTagHelperService>, IBundleItemTagHelper public class AbpScriptTagHelper : AbpBundleItemTagHelper<AbpScriptTagHelper, AbpScriptTagHelperService>, IBundleItemTagHelper
{ {
[HtmlAttributeName("defer")]
public bool Defer { get; set; }
public AbpScriptTagHelper(AbpScriptTagHelperService service) public AbpScriptTagHelper(AbpScriptTagHelperService service)
: base(service) : base(service)
{ {
@ -16,4 +19,4 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
return "js"; return "js";
} }
} }
} }

3
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpStyleBundleTagHelper.cs

@ -5,6 +5,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
[HtmlTargetElement("abp-style-bundle", TagStructure = TagStructure.NormalOrSelfClosing)] [HtmlTargetElement("abp-style-bundle", TagStructure = TagStructure.NormalOrSelfClosing)]
public class AbpStyleBundleTagHelper : AbpBundleTagHelper<AbpStyleBundleTagHelper, AbpStyleBundleTagHelperService>, IBundleTagHelper public class AbpStyleBundleTagHelper : AbpBundleTagHelper<AbpStyleBundleTagHelper, AbpStyleBundleTagHelperService>, IBundleTagHelper
{ {
[HtmlAttributeName("preload")]
public bool Preload { get; set; }
public AbpStyleBundleTagHelper(AbpStyleBundleTagHelperService service) public AbpStyleBundleTagHelper(AbpStyleBundleTagHelperService service)
: base(service) : base(service)
{ {

5
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpStyleTagHelper.cs

@ -5,6 +5,9 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
[HtmlTargetElement("abp-style", TagStructure = TagStructure.NormalOrSelfClosing)] [HtmlTargetElement("abp-style", TagStructure = TagStructure.NormalOrSelfClosing)]
public class AbpStyleTagHelper : AbpBundleItemTagHelper<AbpStyleTagHelper, AbpStyleTagHelperService>, IBundleItemTagHelper public class AbpStyleTagHelper : AbpBundleItemTagHelper<AbpStyleTagHelper, AbpStyleTagHelperService>, IBundleItemTagHelper
{ {
[HtmlAttributeName("preload")]
public bool Preload { get; set; }
public AbpStyleTagHelper(AbpStyleTagHelperService service) public AbpStyleTagHelper(AbpStyleTagHelperService service)
: base(service) : base(service)
{ {
@ -16,4 +19,4 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
return "css"; return "css";
} }
} }
} }

5
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperResourceService.cs

@ -36,6 +36,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
public virtual async Task ProcessAsync( public virtual async Task ProcessAsync(
[NotNull] ViewContext viewContext, [NotNull] ViewContext viewContext,
[NotNull] TagHelper tagHelper,
[NotNull] TagHelperContext context, [NotNull] TagHelperContext context,
[NotNull] TagHelperOutput output, [NotNull] TagHelperOutput output,
[NotNull] List<BundleTagHelperItem> bundleItems, [NotNull] List<BundleTagHelperItem> bundleItems,
@ -72,7 +73,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
if (file.Length > 0) if (file.Length > 0)
{ {
AddHtmlTag(viewContext, context, output, bundleFile + "?_v=" + file.LastModified.UtcTicks); AddHtmlTag(viewContext, tagHelper, context, output, bundleFile + "?_v=" + file.LastModified.UtcTicks);
} }
} }
@ -84,7 +85,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
protected abstract Task<IReadOnlyList<string>> GetBundleFilesAsync(string bundleName); protected abstract Task<IReadOnlyList<string>> GetBundleFilesAsync(string bundleName);
protected abstract void AddHtmlTag(ViewContext viewContext, TagHelperContext context, TagHelperOutput output, string file); protected abstract void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file);
protected virtual string GenerateBundleName(List<BundleTagHelperItem> bundleItems) protected virtual string GenerateBundleName(List<BundleTagHelperItem> bundleItems)
{ {

24
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptService.cs

@ -4,27 +4,27 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.VirtualFileSystem;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
{ {
public class AbpTagHelperScriptService : AbpTagHelperResourceService public class AbpTagHelperScriptService : AbpTagHelperResourceService
{ {
protected AbpTagHelperScriptStyleLoadingOptions LoadingOptions { get; }
public AbpTagHelperScriptService( public AbpTagHelperScriptService(
IBundleManager bundleManager, IBundleManager bundleManager,
IOptions<AbpBundlingOptions> options, IOptions<AbpBundlingOptions> options,
IWebHostEnvironment hostingEnvironment IWebHostEnvironment hostingEnvironment,
) : base( IOptions<AbpTagHelperScriptStyleLoadingOptions> loadingOptions) : base(
bundleManager, bundleManager,
options, options,
hostingEnvironment) hostingEnvironment)
{ {
LoadingOptions = loadingOptions.Value;
} }
protected override void CreateBundle(string bundleName, List<BundleTagHelperItem> bundleItems) protected override void CreateBundle(string bundleName, List<BundleTagHelperItem> bundleItems)
@ -41,9 +41,19 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
return await BundleManager.GetScriptBundleFilesAsync(bundleName); return await BundleManager.GetScriptBundleFilesAsync(bundleName);
} }
protected override void AddHtmlTag(ViewContext viewContext, TagHelperContext context, TagHelperOutput output, string file) protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file)
{ {
output.Content.AppendHtml($"<script src=\"{viewContext.GetUrlHelper().Content(file.EnsureStartsWith('~'))}\"></script>{Environment.NewLine}"); var defer = tagHelper switch
{
AbpScriptTagHelper scriptTagHelper => scriptTagHelper.Defer,
AbpScriptBundleTagHelper scriptBundleTagHelper => scriptBundleTagHelper.Defer,
_ => false
};
var deferText = (defer || LoadingOptions.GlobalDeferScript || LoadingOptions.DeferScripts.Any(x => file.StartsWith(x, StringComparison.OrdinalIgnoreCase)))
? "defer"
: string.Empty;
output.Content.AppendHtml($"<script {deferText} src=\"{viewContext.GetUrlHelper().Content(file.EnsureStartsWith('~'))}\"></script>{Environment.NewLine}");
} }
} }
} }

24
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperScriptStyleLoadingOptions.cs

@ -0,0 +1,24 @@
using System.Collections.Generic;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
{
public class AbpTagHelperScriptStyleLoadingOptions
{
public bool GlobalDeferScript { get; set; }
public List<string> DeferScripts { get; }
public bool GlobalPreloadStyle { get; set; }
public List<string> PreloadStyles { get; }
public AbpTagHelperScriptStyleLoadingOptions()
{
GlobalDeferScript = false;
DeferScripts = new List<string>();
GlobalPreloadStyle = false;
PreloadStyles = new List<string>();
}
}
}

28
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling/Volo/Abp/AspNetCore/Mvc/UI/Bundling/TagHelpers/AbpTagHelperStyleService.cs

@ -4,27 +4,27 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Razor.TagHelpers; using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.VirtualFileSystem;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
{ {
public class AbpTagHelperStyleService : AbpTagHelperResourceService public class AbpTagHelperStyleService : AbpTagHelperResourceService
{ {
protected AbpTagHelperScriptStyleLoadingOptions LoadingOptions { get; }
public AbpTagHelperStyleService( public AbpTagHelperStyleService(
IBundleManager bundleManager, IBundleManager bundleManager,
IOptions<AbpBundlingOptions> options, IOptions<AbpBundlingOptions> options,
IWebHostEnvironment hostingEnvironment IWebHostEnvironment hostingEnvironment,
) : base( IOptions<AbpTagHelperScriptStyleLoadingOptions> loadingOptions) : base(
bundleManager, bundleManager,
options, options,
hostingEnvironment) hostingEnvironment)
{ {
LoadingOptions = loadingOptions.Value;
} }
protected override void CreateBundle(string bundleName, List<BundleTagHelperItem> bundleItems) protected override void CreateBundle(string bundleName, List<BundleTagHelperItem> bundleItems)
@ -41,9 +41,23 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bundling.TagHelpers
return await BundleManager.GetStyleBundleFilesAsync(bundleName); return await BundleManager.GetStyleBundleFilesAsync(bundleName);
} }
protected override void AddHtmlTag(ViewContext viewContext, TagHelperContext context, TagHelperOutput output, string file) protected override void AddHtmlTag(ViewContext viewContext, TagHelper tagHelper, TagHelperContext context, TagHelperOutput output, string file)
{ {
output.Content.AppendHtml($"<link rel=\"stylesheet\" href=\"{viewContext.GetUrlHelper().Content(file.EnsureStartsWith('~'))}\" />{Environment.NewLine}"); var preload = tagHelper switch
{
AbpStyleTagHelper styleTagHelper => styleTagHelper.Preload,
AbpStyleBundleTagHelper styleBundleTagHelper => styleBundleTagHelper.Preload,
_ => false
};
if (preload || LoadingOptions.GlobalPreloadStyle || LoadingOptions.PreloadStyles.Any(x => file.StartsWith(x, StringComparison.OrdinalIgnoreCase)))
{
output.Content.AppendHtml($"<link rel=\"preload\" href=\"{viewContext.GetUrlHelper().Content(file.EnsureStartsWith('~'))}\" as=\"style\" onload=\"this.rel='stylesheet'\" />{Environment.NewLine}");
}
else
{
output.Content.AppendHtml($"<link rel=\"stylesheet\" href=\"{viewContext.GetUrlHelper().Content(file.EnsureStartsWith('~'))}\" />{Environment.NewLine}");
}
} }
} }
} }

Loading…
Cancel
Save