public SpeedyAssetLinks(SpeedyAssetLinks links) { this.Scripts = links.Scripts; this.Styles = links.Styles; PlainStyles = links.PlainStyles; PrefetchStyles = links.PrefetchStyles; }
private void GenerateSpeedyScripts(SpeedyAssetLinks assetLinks) { assetLinks.ClientScriptsRendered = ""; string result = string.Empty; string resultPreloaded = string.Empty; int count = 0; foreach (var scripts in assetLinks.Scripts) { string comma = ","; if (count == assetLinks.Scripts.Count) { comma = string.Empty; } result += $"'{scripts}'{comma}"; resultPreloaded += $"<link rel=\"prefetch\" href=\"{scripts}\" as=\"script\">"; count++; } var phase = $"var clientScripts = [{result}]\r"; assetLinks.ClientScriptsRendered += phase; assetLinks.ClientScriptsPreload = resultPreloaded; }
public void AddUrlIncludeSpeedy(UrlInclude urlInclude, SpeedyAssetLinks result) { if (urlInclude.Type == AssetType.Script) { result.Scripts.Add($"{urlInclude.Url}"); } else { result.PlainStyles.Add(urlInclude.Url); result.Styles.Add($"<link async=\"true\" href=\"{urlInclude.Url}\" rel=\"stylesheet\" />"); } }
protected virtual void AddThemeIncludeSpeedy(ThemeInclude themeInclude, SpeedyAssetLinks result, IThemesProvider themesProvider) { Item item = themeInclude.Theme; if (item == null && !themeInclude.ThemeId.IsNull) { item = ContentRepository.GetItem(themeInclude.ThemeId); } if (item != null) { Log.Debug($"Starting optimized files generation process for {item.Name} with following configuration {_configuration}"); IList <Item> allThemes = ServiceLocator.ServiceProvider.GetService <IThemingContext>().GetAllThemes(item); GetLinksSpeedy(allThemes.FilterBaseThemes(), _configuration.ScriptsMode, _configuration.StylesMode, result); GetLinksSpeedy(themesProvider.GetThemes(item, allThemes), _configuration.ScriptsMode, _configuration.StylesMode, result); } }
public static SpeedyAssetLinks GenerateDeferedLinks(IThemesProvider themesProvider) { if (AssetContentRefresher.IsPublishing() || IsAddingRendering()) { return(new SpeedyAssetLinks()); } var assetsGenerator = new SpeedyAssetLinksGenerator(); var links = assetsGenerator.GenerateSpeedyAssetLinks(themesProvider); var linkSpeedy = new SpeedyAssetLinks(links); var AreScriptsDeferred = SpeedyGenerationSettings.IsCriticalJavascriptEnabledAndPossible(Sitecore.Context.Item); if (AreScriptsDeferred) { string deferredSriptsCacheKey = $"speedy-deferred-page-scripts-{Sitecore.Context.Item.ID}"; string preloadSriptsCacheKey = $"speedy-preload-page-scripts-{Sitecore.Context.Item.ID}"; string deferredSriptsCache = HttpContext.Current.Cache[deferredSriptsCacheKey] as string; string preloadSriptsCache = HttpContext.Current.Cache[preloadSriptsCacheKey] as string; if (SpeedyGenerationSettings.IsDebugModeEnabled()) { deferredSriptsCache = null; preloadSriptsCache = null; } if (!string.IsNullOrWhiteSpace(deferredSriptsCache) && !string.IsNullOrWhiteSpace(preloadSriptsCache)) { linkSpeedy.ClientScriptsRendered = deferredSriptsCache; linkSpeedy.ClientScriptsPreload = preloadSriptsCache; } else { assetsGenerator.GenerateSpeedyScripts(linkSpeedy); CacheObject(deferredSriptsCacheKey, linkSpeedy.ClientScriptsRendered, GetDependencies(null)); CacheObject(preloadSriptsCacheKey, linkSpeedy.ClientScriptsPreload, GetDependencies(null)); } } else { var linksa = AssetLinksGenerator.GenerateLinks(new ThemesProvider()); linkSpeedy.Scripts = linksa.Scripts; } return(linkSpeedy); }
public virtual SpeedyAssetLinks GenerateSpeedyAssetLinks(IThemesProvider themesProvider) { AssetsArgs assetsArgs = new AssetsArgs(); CorePipeline.Run("assetService", assetsArgs); string text = GenerateCacheKey(assetsArgs.GetHashCode()) + "speedylinks-" + Sitecore.Context.Item.ID; SpeedyAssetLinks assetLinks = HttpContext.Current.Cache[text] as SpeedyAssetLinks; if (SpeedyGenerationSettings.IsDebugModeEnabled()) { assetLinks = null; } if (assetLinks == null || _configuration.RequestAssetsOptimizationDisabled) { assetLinks = new SpeedyAssetLinks(); if (!assetsArgs.AssetsList.Any()) { return(assetLinks); } assetsArgs.AssetsList = (from a in assetsArgs.AssetsList orderby a.SortOrder select a).ToList(); foreach (AssetInclude assets in assetsArgs.AssetsList) { if (assets is ThemeInclude) { AddThemeIncludeSpeedy(assets as ThemeInclude, assetLinks, themesProvider); } else if (assets is UrlInclude) { AddUrlIncludeSpeedy(assets as UrlInclude, assetLinks); } else if (assets is PlainInclude) { AddPlainInclude(assets as PlainInclude, assetLinks); } } CacheLinks(text, assetLinks, GetDependencies(this.DatabaseRepository)); } return(assetLinks); }
/// <summary> /// Throwing the entire CSS block inside the Critical head block is not the most streamlined method. Ideally the web team would use the NPM Critical /// package. However This is fallback for the lazy web team that ultimately just won't do that. /// Loop over the CSS assets, download the contents and append to one big Critical block /// </summary> /// <param name="assetLinks"></param> /// <returns></returns> private static string BuildEntireCssBlock(SpeedyAssetLinks assetLinks) { StringBuilder entireCriticalBlock = new StringBuilder(); // Lookup the filters var nameValueListString = SpeedyGenerationSettings.GetGlobalSettingsItemFromContext()[SpeedyConstants.GlobalSettings.Fields.CSSFilter]; //Converts the string to NameValueCollection System.Collections.Specialized.NameValueCollection nameValueList = Sitecore.Web.WebUtil.ParseUrlParameters(nameValueListString); foreach (var style in assetLinks.PlainStyles) { ApplyStyleFile(nameValueList, entireCriticalBlock, style); } entireCriticalBlock = entireCriticalBlock.Replace("font-family:", "font-display:swap;font-family:"); return(entireCriticalBlock.ToString()); }
private static void LoadCssIntoModel(SpeedyLayoutModel model, SpeedyAssetLinks speedyLinks) { string largeCiticalCssBlockCacheKey = $"speedy-entire-css-critical-page-block-{Sitecore.Context.Item.ID}"; string largeCriticalCssBlockCache = HttpContext.Current.Cache[largeCiticalCssBlockCacheKey] as string; if (SpeedyGenerationSettings.IsDebugModeEnabled()) { largeCriticalCssBlockCache = null; } if (!string.IsNullOrWhiteSpace(largeCriticalCssBlockCache)) { model.CriticalHtml = largeCriticalCssBlockCache; } else { model.CriticalHtml = BuildEntireCssBlock(speedyLinks); CacheObject(largeCiticalCssBlockCacheKey, model.CriticalHtml, GetDependencies(null)); } model.SpecialCaseCriticalCss = Sitecore.Context.Item.Fields[SpeedyConstants.Fields.SpecialCaseCriticalCss].Value; }
public virtual SpeedyAssetLinks GenerateSpeedyAssetLinks(IThemesProvider themesProvider) { AssetsArgs assetsArgs = new AssetsArgs(); CorePipeline.Run("assetService", assetsArgs); string text = GenerateCacheKey(assetsArgs.GetHashCode()) + "speedylinks"; SpeedyAssetLinks assetLinks = HttpContext.Current.Cache[text] as SpeedyAssetLinks; if (assetLinks == null || _configuration.RequestAssetsOptimizationDisabled) { assetLinks = new SpeedyAssetLinks(); if (!assetsArgs.AssetsList.Any()) { return(assetLinks); } assetsArgs.AssetsList = (from a in assetsArgs.AssetsList orderby a.SortOrder select a).ToList(); foreach (AssetInclude assets in assetsArgs.AssetsList) { if (assets is ThemeInclude) { AddThemeIncludeSpeedy(assets as ThemeInclude, assetLinks, themesProvider); } else if (assets is UrlInclude) { AddUrlIncludeSpeedy(assets as UrlInclude, assetLinks); } else if (assets is PlainInclude) { AddPlainInclude(assets as PlainInclude, assetLinks); } } CacheLinks(text, assetLinks, (DatabaseRepository.GetContentDatabase().Name.ToLower() == GlobalSettings.Database.Master) ? AssetContentRefresher.MasterCacheDependencyKeys : AssetContentRefresher.WebCacheDependencyKeys); } return(assetLinks); }
private void GenerateSpeedyScripts(SpeedyAssetLinks assetLinks) { assetLinks.ClientScriptsRendered = ""; string result = string.Empty; int count = 0; foreach (var scripts in assetLinks.Scripts) { string comma = ","; if (count == assetLinks.Scripts.Count) { comma = string.Empty; } result += $"'{scripts}'{comma}"; count++; } var phase = $"var clientScripts = [{result}]\r"; assetLinks.ClientScriptsRendered += phase; }
public static SpeedyAssetLinks GenerateDeferedLinks(IThemesProvider themesProvider) { if (AssetContentRefresher.IsPublishing() || IsAddingRendering()) { return(new SpeedyAssetLinks()); } var assetsGenerator = new SpeedyAssetLinksGenerator(); var links = assetsGenerator.GenerateSpeedyAssetLinks(themesProvider); var linkSpeedy = new SpeedyAssetLinks(links); var AreScriptsDeferred = SpeedyGenerationSettings.IsCriticalJavascriptEnabledAndPossible(Sitecore.Context.Item); if (AreScriptsDeferred) { assetsGenerator.GenerateSpeedyScripts(linkSpeedy); } else { var linksa = AssetLinksGenerator.GenerateLinks(new ThemesProvider()); linkSpeedy.Scripts = linksa.Scripts; } return(linkSpeedy); }
protected virtual void GetLinksSpeedy(IEnumerable <Item> allThemes, AssetServiceMode scriptsMode, AssetServiceMode stylesMode, SpeedyAssetLinks result) { foreach (Item allTheme in allThemes) { AssetLinks assetLinks = new AssetLinks(); GetScriptLinks(allTheme, scriptsMode, assetLinks); GetStylesLinks(allTheme, stylesMode, assetLinks); foreach (string item in from link in assetLinks.Styles select $"<link async=\"true\" href=\"{link}\" rel=\"stylesheet\" />") { var cssFileUri = item.Replace($"<link async=\"true\" href=\"", string.Empty).Replace($"\" rel=\"stylesheet\" />", string.Empty); var prefetchInclude = item.Replace($"async=\"true\"", $"async=\"true\" rel=\"prefetch\""); result.PlainStyles.Add(cssFileUri); result.PrefetchStyles.Add(prefetchInclude); result.Styles.Add(item); } foreach (string item2 in from link in assetLinks.Scripts select link) { result.Scripts.Add(item2); } } }