public SpeedyAssetLinks(SpeedyAssetLinks links)
 {
     this.Scripts   = links.Scripts;
     this.Styles    = links.Styles;
     PlainStyles    = links.PlainStyles;
     PrefetchStyles = links.PrefetchStyles;
 }
예제 #2
0
        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;
        }
예제 #3
0
 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\" />");
     }
 }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }
예제 #7
0
        /// <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());
        }
예제 #8
0
        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;
        }
예제 #9
0
        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);
        }
예제 #10
0
        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;
        }
예제 #11
0
        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);
        }
예제 #12
0
 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);
         }
     }
 }