-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
V9: Fix backoffice javascript loading slowly (#11714)
* Update Smidge * Add SmidgeRequestHelper to override the compression order By default Smidge will always try and use Brotli (br), this compression is good in the the sense that it compresses the file quite a bit, but sadly it's super super slow, like 10 seconds for backoffice js slow. * Remove unnecessary new keyword Co-authored-by: nikolajlauridsen <[email protected]>
- Loading branch information
1 parent
b5a895e
commit 980cf00
Showing
3 changed files
with
82 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
78 changes: 78 additions & 0 deletions
78
src/Umbraco.Web.Common/RuntimeMinification/SmidgeRequestHelper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
using System.Collections.Generic; | ||
using Microsoft.AspNetCore.Http; | ||
using Microsoft.Extensions.Primitives; | ||
using Microsoft.Net.Http.Headers; | ||
using Smidge; | ||
using Smidge.Models; | ||
|
||
namespace Umbraco.Cms.Web.Common.RuntimeMinification | ||
{ | ||
public class SmidgeRequestHelper : IRequestHelper | ||
{ | ||
private RequestHelper _wrappedRequestHelper; | ||
|
||
public SmidgeRequestHelper(IWebsiteInfo siteInfo) | ||
{ | ||
_wrappedRequestHelper = new RequestHelper(siteInfo); | ||
} | ||
|
||
/// <inheritdoc/> | ||
public string Content(string path) => _wrappedRequestHelper.Content(path); | ||
|
||
/// <inheritdoc/> | ||
public string Content(IWebFile file) => _wrappedRequestHelper.Content(file); | ||
|
||
/// <inheritdoc/> | ||
public bool IsExternalRequestPath(string path) => _wrappedRequestHelper.IsExternalRequestPath(path); | ||
|
||
/// <summary> | ||
/// Overrides the default order of compression from Smidge, since Brotli is super slow (~10 seconds for backoffice.js) | ||
/// </summary> | ||
/// <param name="headers"></param> | ||
/// <returns></returns> | ||
public CompressionType GetClientCompression(IDictionary<string, StringValues> headers) | ||
{ | ||
var type = CompressionType.None; | ||
|
||
if (headers is not IHeaderDictionary headerDictionary) | ||
{ | ||
headerDictionary = new HeaderDictionary(headers.Count); | ||
foreach ((var key, StringValues stringValues) in headers) | ||
{ | ||
headerDictionary[key] = stringValues; | ||
} | ||
} | ||
|
||
var acceptEncoding = headerDictionary.GetCommaSeparatedValues(HeaderNames.AcceptEncoding); | ||
if (acceptEncoding.Length > 0) | ||
{ | ||
// Prefer in order: GZip, Deflate, Brotli. | ||
for (var i = 0; i < acceptEncoding.Length; i++) | ||
{ | ||
var encoding = acceptEncoding[i].Trim(); | ||
|
||
CompressionType parsed = CompressionType.Parse(encoding); | ||
|
||
// Not pack200-gzip. | ||
if (parsed == CompressionType.GZip) | ||
{ | ||
return CompressionType.GZip; | ||
} | ||
|
||
if (parsed == CompressionType.Deflate) | ||
{ | ||
type = CompressionType.Deflate; | ||
} | ||
|
||
// Brotli is typically last in the accept encoding header. | ||
if (type != CompressionType.Deflate && parsed == CompressionType.Brotli) | ||
{ | ||
type = CompressionType.Brotli; | ||
} | ||
} | ||
} | ||
|
||
return type; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters