BundleTransformer.更少的注入变量取决于上下文/请求

本文关键字:取决于 上下文 请求 变量 注入 BundleTransformer | 更新日期: 2023-09-27 18:16:59

我们希望将System.Web.Optimization的捆绑机制与Less变压器结合使用。

问题是相同的应用程序/服务器为不同品牌的网站提供页面。因此,根据'SiteContext'相同的。less文件被使用,但不同的值应该由。less变量使用。所以我们希望(重新)使用相同的更少的文件,但根据请求的上下文使用不同的变量。

我尝试了几种不同的理论:

在这三种情况下,我根据SiteContext设置了不同的bundle。

1使用一个拦截变量的自定义VirtualPathProvider注入一个带有主题变量的@import指令。少文件。

所以我有:

  • 样式文件例如:header。less(导入变量文件)
  • 变量文件:variables.less
  • 主题变量文件:variables-theme。更少的注入变量。

这不起作用,因为BundleTransformer缓存将其视为相同的文件,并且不知道SiteContext。缓存键是基于IAsset的Url的,我们不能影响这个行为。

2替换变量。less import by variables themes。自定义变压器在less变压器之前运行。

还是没有运气,同样的缓存问题。

作为一个副作用,在调试中没有调用额外的变压器,因为资产没有捆绑,而是由LessAssetHandler单独调用。这可以通过编写自己的AssetHandler来解决,它调用所有需要的转换器。

3创建主题化资产名称,由自定义VirtualPathProvider解析如。添加header-themeX。对于bundle来说,这个文件不存在,但是您将这个文件解析为header。并使用方法2设置正确的变量文件导入。(替换变量的导入。

又一次没有运气。我认为这可以解决缓存问题,如果它不是为Bundle.Include(string virtualPath)做一个File.Exists(path)内部。它不通过CustomVirtualPathProvider .


我要解决这个问题是不是太深入了?所有的想法都是欢迎的,我可以想象,随着System.Web.Optimization库变得越来越流行,这将成为越来越多的人的问题。

请记住:

    我们有很多。less/css文件
  • 我们将有5个左右的主题
  • 我们喜欢让东西在visual studio中工作(这就是为什么header。less有一个参考变量。less)

感谢您的反馈

BundleTransformer.更少的注入变量取决于上下文/请求

Michael!

您使用Microsoft ASP。所以你需要替换System.Web.Optimization的一些组件,并创建自己版本的调试http处理程序(参见«问题:LESS文件导入被添加到bundlerresponse中。文件收集»讨论)。据我所知,Murat Cakir在SmartStore解决了所有这些问题。项目净。

在Bundle Transformer中,有两种方法可以注入LESS-variables:

  1. 查看LESS-translator的GlobalVariablesModifyVariables属性:

    using System.Collections.Generic;
    using System.Web.Optimization;
    using BundleTransformer.Core.Builders;
    using BundleTransformer.Core.Orderers;
    using BundleTransformer.Core.Transformers;
    using BundleTransformer.Core.Translators;
    using BundleTransformer.Less.Translators;
    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles)
        {
            var nullBuilder = new NullBuilder();
            var nullOrderer = new NullOrderer();
            var lessTranslator = new LessTranslator
            {
                GlobalVariables = "my-variable='Hurrah!'",
                ModifyVariables = "font-family-base='Comic Sans MS';body-bg=lime;font-size-h1=50px"
            };
            var cssTransformer = new CssTransformer(new List<ITranslator>{ lessTranslator });
            var commonStylesBundle = new Bundle("~/Bundles/BootstrapStyles");
            commonStylesBundle.Include(
               "~/Content/less/bootstrap-3.1.1/bootstrap.less");
            commonStylesBundle.Builder = nullBuilder;
            commonStylesBundle.Transforms.Add(cssTransformer);
            commonStylesBundle.Orderer = nullOrderer;
            bundles.Add(commonStylesBundle);
        }
    }
    
  2. 创建自定义项转换:

    using System.Text;
    using System.Web.Optimization;
    public sealed class InjectContentItemTransform : IItemTransform
    {
        private readonly string _beforeContent;
        private readonly string _afterContent;
        public InjectContentItemTransform(string beforeContent, string afterContent)
        {
            _beforeContent = beforeContent ?? string.Empty;
            _afterContent = afterContent ?? string.Empty;
        }
        public string Process(string includedVirtualPath, string input)
        {
            if (_beforeContent.Length == 0 && _afterContent.Length == 0)
            {
                return input;
            }
            var contentBuilder = new StringBuilder();
            if (_beforeContent.Length > 0)
            {
                contentBuilder.AppendLine(_beforeContent);
            }
            contentBuilder.AppendLine(input);
            if (_afterContent.Length > 0)
            {
                contentBuilder.AppendLine(_afterContent);
            }
            return contentBuilder.ToString();
        }
    }
    

并按如下方式注册这个转换:

    using System.Web.Optimization;
    using BundleTransformer.Core.Orderers;
    using BundleTransformer.Core.Bundles;
    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles)
        {
            var nullOrderer = new NullOrderer();
            const string beforeLessCodeToInject = @"@my-variable: 'Hurrah!';";
            const string afterLessCodeToInject = @"@font-family-base: 'Comic Sans MS';
@body-bg: lime;
@font-size-h1: 50px;";
            var commonStylesBundle = new CustomStyleBundle("~/Bundles/BootstrapStyles");
            commonStylesBundle.Include(
               "~/Content/less/bootstrap-3.1.1/bootstrap.less",
               new InjectContentItemTransform(beforeLessCodeToInject, afterLessCodeToInject));
            commonStylesBundle.Orderer = nullOrderer;
            bundles.Add(commonStylesBundle);
        }
    }

两种方法都有缺点:在调试模式下注入less -变量不起作用。