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)
感谢您的反馈
Michael!
您使用Microsoft ASP。所以你需要替换System.Web.Optimization的一些组件,并创建自己版本的调试http处理程序(参见«问题:LESS文件导入被添加到bundlerresponse中。文件收集»讨论)。据我所知,Murat Cakir在SmartStore解决了所有这些问题。项目净。
在Bundle Transformer中,有两种方法可以注入LESS-variables:
-
查看LESS-translator的
GlobalVariables
和ModifyVariables
属性: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); } }
-
创建自定义项转换:
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 -变量不起作用。