Razor 捆绑和拆分咖啡脚本的捆绑助手

Razor 捆绑和拆分咖啡脚本的捆绑助手,razor,asp.net-mvc-4,bundle,minify,Razor,Asp.net Mvc 4,Bundle,Minify,我在MVC4中尝试捆绑和缩小,遇到了一个有趣的问题。 我正在使用Coffeescript,我想要一个与@Scripts.Render()方法类似的渲染辅助程序 例如,假设我有一个bundle配置: new ScriptBundle("~/bundle/appfiles").Include( "~/Scripts/app/sample.js", "~/Scripts/app/myApp.js"); 在cshtml中,当我执行@Scripts.Render()时,我会根据web.c

我在MVC4中尝试捆绑和缩小,遇到了一个有趣的问题。 我正在使用Coffeescript,我想要一个与
@Scripts.Render()
方法类似的渲染辅助程序

例如,假设我有一个bundle配置:

new ScriptBundle("~/bundle/appfiles").Include(
    "~/Scripts/app/sample.js",
    "~/Scripts/app/myApp.js");
在cshtml中,当我执行
@Scripts.Render()
时,我会根据web.config中的调试设置得到不同的结果。如果debug为true,我将为每个文件获得一个脚本标记,否则我将获得一个脚本标记,返回绑定和缩小的js。这很好

现在让我们假设我想对我的咖啡脚本做同样的事情。我创建了一个包,如下所示:

new Bundle("~/bundle/appfiles", new CoffeeBundler(), new JsMinify()).Include(
    "~/Scripts/app/sample.coffee",
    "~/Scripts/app/myApp.coffee");
现在的问题是,如果我使用
@Scripts.Render()
,在调试时,我会得到每个文件一个脚本,但这是根本不转换的。我能做的唯一用途是:

<script type="text/javascript" src="@(BundleTable.Bundles.ResolveBundleUrl("~/bundle/appfiles"))"></script>

但即使在调试模式下,这也会将所有内容捆绑在一起,然后缩小,这当然不是我想要的

我尝试创建一个类似于脚本的
Coffee.Render()
帮助程序,但它使用System.Web.Optimization程序集内部的AssetManager类

我想知道您是否知道如何以干净的方式执行此操作(即:使用可用的公共类,不复制和粘贴整个AssetManager代码,在创建捆绑包时不执行奇特的Directory.Enumerate文件)

谢谢


PS:我知道一个更快的解决方案是使用Mindscape Workbench并捆绑生成的js文件,我正在寻找使用框架所拥有的东西,也许还可以避免告诉团队安装一个人们可能不喜欢的工具…

很抱歉,我没有回答您的确切问题,但是我想在文章的最后跟你的私人秘书谈谈

目前,我并不认为我们有一个“没有工具”的故事,但我确实同意“使用框架所拥有的东西”的观点

为此,我强烈建议使用TypeScript。您不必学习新的语言(就像您使用CoffeeScript一样),但它提供了一个强类型的JavaScript版本,您可以使用更像c#(带有类型验证等)的JavaScript

您需要花费20分钟来完成一些教程:

或者,更好的是,看看秋季的构建会话:

顺便说一句…如果这不是你想要的方向,不用担心…我只是发现很多开发人员甚至不知道TypeScript是一个选项

希望这有助于您为团队简化工作


干杯。

很抱歉,我没有回答您确切的问题,但我确实想在文章的最后与您的私人秘书谈谈

目前,我并不认为我们有一个“没有工具”的故事,但我确实同意“使用框架所拥有的东西”的观点

为此,我强烈建议使用TypeScript。您不必学习新的语言(就像您使用CoffeeScript一样),但它提供了一个强类型的JavaScript版本,您可以使用更像c#(带有类型验证等)的JavaScript

您需要花费20分钟来完成一些教程:

或者,更好的是,看看秋季的构建会话:

顺便说一句…如果这不是你想要的方向,不用担心…我只是发现很多开发人员甚至不知道TypeScript是一个选项

希望这有助于您为团队简化工作


干杯。

最后,我找到了一个HtmlHelper解决方案。仍处于早期阶段,但按照我的意愿工作。目前在a中有详细说明

这里是完整的帮助代码,以防博客丢失

public static class HtmlHelperExtensions
{
    public static MvcHtmlString RenderCoffeeBundle(this HtmlHelper htmlHelper, string virtualPath)
    {
        if (String.IsNullOrEmpty(virtualPath))
            throw new ArgumentException("virtualPath must be defined", "virtualPath");

        var list = GetPathsList(virtualPath);

        //TODO: Nice and cleaner EliminateDuplicatesAndResolveUrls(list);

        var stringBuilder = new StringBuilder();
        foreach (string path in list)
        {
            stringBuilder.Append(RenderScriptTag(path));
            stringBuilder.Append(Environment.NewLine);
        }
        return MvcHtmlString.Create(stringBuilder.ToString());
    }

    private static IEnumerable<string> GetPathsList(string virtualPath)
    {
        var list = new List<string>();

        if (BundleResolver.Current.IsBundleVirtualPath(virtualPath))
        {
            if (!BundleTable.EnableOptimizations)
            {
                foreach (var path in BundleResolver.Current.GetBundleContents(virtualPath))
                {
                    var bundlePath = "~/autoBundle" + ResolveVirtualPath(path.Replace("coffee", "js"));
                    BundleTable.Bundles.Add(new Bundle(bundlePath, new CoffeeBundler()).Include(path));
                    // TODO: Get the actual CustomTransform used in the Bundle
                    // rather than forcing "new CoffeeBundler()" like here
                    list.Add(bundlePath);
                }
            }
            else
                list.Add(BundleResolver.Current.GetBundleUrl(virtualPath));
        }
        else
            list.Add(virtualPath);
        return list.Select(ResolveVirtualPath).ToList();
    }

    private static string RenderScriptTag(string path)
    {
        return "<script src=\"" + HttpUtility.UrlPathEncode(path) + "\"></script>";
    }

    private static string ResolveVirtualPath(string virtualPath)
    {
        return VirtualPathUtility.ToAbsolute(virtualPath);;
    }
}
公共静态类HtmlHelperExtensions
{
公共静态MvcHtmlString RenderOfferBundle(此HtmlHelper HtmlHelper,字符串虚拟路径)
{
if(String.IsNullOrEmpty(virtualPath))
抛出新ArgumentException(“必须定义virtualPath”,“virtualPath”);
var list=GetPathsList(virtualPath);
//TODO:良好且更干净的已删除重复项和解决URL(列表);
var stringBuilder=新的stringBuilder();
foreach(列表中的字符串路径)
{
Append(RenderScriptTag(path));
stringBuilder.Append(Environment.NewLine);
}
返回MvcHtmlString.Create(stringBuilder.ToString());
}
私有静态IEnumerable GetPathsList(字符串virtualPath)
{
var list=新列表();
if(BundleResolver.Current.IsBundleVirtualPath(virtualPath))
{
如果(!BundleTable.EnableOptimizations)
{
foreach(BundleResolver.Current.GetBundleContents(virtualPath)中的变量路径)
{
var bundlePath=“~/autoBundle”+ResolveVirtualPath(path.Replace(“coffee”,“js”));
BundleTable.Bundles.Add(新Bundle(bundlePath,new CoffeeBundler()).Include(path));
//TODO:获取捆绑包中使用的实际CustomTransform
//而不是像这里这样强制使用“new CoffeeBundler()”
列表。添加(bundlePath);
}
}
其他的
添加(BundleResolver.Current.GetBundleUrl(virtualPath));
}
其他的
添加(虚拟路径);
return list.Select(ResolveVirtualPath.ToList();
}
私有静态字符串RenderScriptTag(字符串路径)
{
返回“”;
}
私有静态字符串ResolveVirtualPath(字符串virtualPath)
{
返回virtualPath实用性。到绝对值(virtualPath);;
}
}

最后,我为这个问题找到了一个HtmlHelper解决方案。仍处于早期阶段,但按照我的意愿工作。目前在a中有详细说明

这里是完整的帮助代码,以防博客丢失

public static class HtmlHelperExtensions
{
    public static MvcHtmlString RenderCoffeeBundle(this HtmlHelper htmlHelper, string virtualPath)
    {
        if (String.IsNullOrEmpty(virtualPath))
            throw new ArgumentException("virtualPath must be defined", "virtualPath");

        var list = GetPathsList(virtualPath);

        //TODO: Nice and cleaner EliminateDuplicatesAndResolveUrls(list);

        var stringBuilder = new StringBuilder();
        foreach (string path in list)
        {
            stringBuilder.Append(RenderScriptTag(path));
            stringBuilder.Append(Environment.NewLine);
        }
        return MvcHtmlString.Create(stringBuilder.ToString());
    }

    private static IEnumerable<string> GetPathsList(string virtualPath)
    {
        var list = new List<string>();

        if (BundleResolver.Current.IsBundleVirtualPath(virtualPath))
        {
            if (!BundleTable.EnableOptimizations)
            {
                foreach (var path in BundleResolver.Current.GetBundleContents(virtualPath))
                {
                    var bundlePath = "~/autoBundle" + ResolveVirtualPath(path.Replace("coffee", "js"));
                    BundleTable.Bundles.Add(new Bundle(bundlePath, new CoffeeBundler()).Include(path));
                    // TODO: Get the actual CustomTransform used in the Bundle
                    // rather than forcing "new CoffeeBundler()" like here
                    list.Add(bundlePath);
                }
            }
            else
                list.Add(BundleResolver.Current.GetBundleUrl(virtualPath));
        }
        else
            list.Add(virtualPath);
        return list.Select(ResolveVirtualPath).ToList();
    }

    private static string RenderScriptTag(string path)
    {
        return "<script src=\"" + HttpUtility.UrlPathEncode(path) + "\"></script>";
    }

    private static string ResolveVirtualPath(string virtualPath)
    {
        return VirtualPathUtility.ToAbsolute(virtualPath);;
    }
}
公共静态类HtmlHelp