在 .net 中缩小和合并文件

Posted

技术标签:

【中文标题】在 .net 中缩小和合并文件【英文标题】:Minifying and combining files in .net 【发布时间】:2011-05-19 07:45:15 【问题描述】:

我正在考虑围绕我的 javascript/css 实施一些性能优化。特别是希望实现此类的缩小和组合。我正在开发 .net/c# Web 应用程序。

我有几个选项,并正在寻找关于每个选项的反馈:

第一个是我遇到的一个聪明的工具 Chirpy,它通过 Visual Studio 组合、缩小等 -> http://chirpy.codeplex.com/ 这是一个 Visual Studio 插件,但由于我在团队环境中,这个工具并不理想。

我的下一个选择是使用 Msbuild 任务 (http://yuicompressor.codeplex.com/) 来缩小文件并合并它们(可能从 xml 文件中读取需要合并的内容)。虽然这有助于缩小罚款,但我担心的是我必须保持必须合并的内容,这可能会让人头疼。

第三个选项是使用 msbuild 任务仅用于缩小和在运行时使用一些帮助程序类,在每页的基础上组合文件。这将合并文件,为其命名并为其添加一个版本。

我还可以考虑其他选择吗?我对最后一个选项的担忧是它可能存在性能问题,因为我必须从本地驱动器打开文件,读取其内容,然后合并文件。这是运行时的大量处理。我在看类似 Squishit - https://github.com/jetheredge/SquishIt/downloads 这会在运行时缩小文件,但我会考虑在编译时这样做。

所以对我的方法有任何反馈会很棒吗?如果第 3 个选项不会导致性能问题,那么我将走向它。

【问题讨论】:

可能相关***.com/q/4234213/340760 【参考方案1】:

我需要一个解决方案,用于在 .NET 2.0 Web 应用程序和 SquishIt 以及我发现的其他工具不兼容 .NET 2.0 上组合/缩小 CSS/JS,我创建了自己的解决方案,使用类似于 SquishIt 的语法但与 .NET 2.0 兼容。因为我认为其他人可能会觉得它有用,所以我把它放在了 Github 上。你可以在这里找到它:https://github.com/AlliterativeAlice/simpleyui

【讨论】:

【参考方案2】:

Microsoft’s Ajax minifier 作为缩小工具出奇的好。我写了一篇关于在 javascript 和样式表处理程序中组合文件和使用它们的缩小器的博客文章:

http://www.markistaylor.com/javascript-concatenating-and-minifying/

【讨论】:

【参考方案3】:

RequestReduce 为在运行时组合和缩小 javascript 和 css 提供了一个非常好的解决方案。它还将尝试精灵您的背景图像。它缓存已处理的文件并使用自定义 ETag 和远期标头为它们提供服务。 RequestReduce 使用响应过滤器来转换内容,因此基本功能不需要代码或配置。它可以配置为在网络农场环境中工作并在多个服务器之间同步内容,并且可以配置为指向 CDN。它可以在http://www.RequestReduce.com 或通过 Nuget 从 Visual Studio 下载。来源地址为https://github.com/mwrock/RequestReduce。

【讨论】:

我在您的其他一些问题中再次看到了这个答案。您必须在磁盘上准备好它才能在此处复制粘贴:D 不错的库。赞成..【参考方案4】:

几年前我对此做了一个非常好的解决方案,但我没有留下来源。该解决方案适用于网络表单,但将其移植到 MVC 应该可以正常工作。我将尝试通过一些简单的步骤来解释我所做的事情。首先,我们需要注册脚本,然后我们编写了一个特殊的控制器来做这件事。当控制器被渲染时,它做了三件事:

    最小化所有文件,我想我们使用了 YUI 压缩 合并所有文件并存储为字符串 计算组合文件字符串的哈希值并将其用作虚拟文件名。您将组合文件的字符串存储在服务器上的缓存字典中,以哈希值作为键,呈现的 html 需要指向“脚本”所在的特殊文件夹。

下一步是实现一个特殊的 HttpHandler 来处理对特殊文件夹中文件的请求。当对该特殊文件夹发出请求时,您会在缓存的字典中进行查找并基本返回字符串。

其中一个非常好的功能是返回的脚本始终有效,因此用户永远不必要求您更新脚本。原因是当您对任何脚本文件进行更改时,哈希值会发生变化,并且客户端会要求新的脚本。

您也可以毫无问题地将其用于 css 文件。我记得它是可配置的,因此您可以关闭合并文件、最小化文件,或者如果您想进行一些调试,只需从进程中排除一个文件。

我可能遗漏了一些细节,但实施起来并不难,结果非常好。

更新:我已经为 MVC 实现了一个解决方案,并在 nuget 上发布了它,并在 github 上发布了源代码。

【讨论】:

【参考方案5】:

您听说过 Combres 吗? 转至:http://combres.codeplex.com 并查看

它会在运行时缩小您的 CSS 和 JS 文件,这意味着您可以更改任何文件并上传它,并且客户端执行的每个请求都会缩小它。 您所要做的就是将您要压缩的文件添加到 Combres XML 文件中的列表中,然后从您的页面/母版页中调用该列表。

如果您使用的是 VS2010,您可以使用 NuGet 轻松地将其安装到您的项目中 这是 Combres NuGet 链接:http://combres.codeplex.com/wikipage?title=5-Minute%20Quick%20Start

【讨论】:

我用过的最好的实现之一,很棒的库。 +1 不错。非常容易使用。在我的项目中设置大约需要 15 分钟。比许多其他选项更简单、更灵活。【参考方案6】:

我们对几个 ASP.NET Web 应用程序做了类似的事情。具体来说,我们使用 Yahoo Yui compressor,它有一个 .NET 库版本,您可以在应用程序中引用它。

我们采用的方法是在运行时生成必要的合并/缩小文件。我们将所有这些逻辑封装到一个 ASP.NET 控件中,但这不是必需的,具体取决于您的项目。

第一次对页面发出请求时,我们会处理包含的 JS 和 CSS 文件列表。在一个单独的线程中(因此原始请求会立即返回),然后我们将包含的文件合并在一起(1 个用于 JS,1 个用于 CSS),然后应用 Yui 压缩器。 然后将结果写入磁盘以供将来快速参考 在后续请求中,页面首先查找缩小版本。如果找到,它只会提供这些服务。如果没有,它会再次执行该过程。

锦上添花:

出于调试目的,如果查询字符串 ?debug=true 存在,则合并/缩小的资源将被忽​​略,而是提供原始的单个文件(因为很难调试优化的 JS)

我们发现这个过程运行得非常好。我们将它构建到一个库中,因此我们所有的 ASP.NET 站点都可以利用它。如果每个页面都有不同的依赖项,构建后的脚本可能会变得复杂,但运行时可以很容易地确定这一点。而且,如果有人需要快速修复 CSS 文件,他们可以这样做,删除文件的合并版本,该过程将自动重新开始,无需使用 MSBuild 或 NAnt 进行构建后处理。

【讨论】:

我在哪里可以获得你所说的这个奇妙的魔法机器/dll aka unicorn?我为冷融合写了完全相同的东西,并且完全同意它的效果很好。我假设 .Net 会存在这样的事情,但显然不是......【参考方案7】:

值得在运行时合并文件以避免同步新版本。但是,一旦以编程方式组合它们,就将它们缓存到磁盘。然后每次获取文件时运行的代码只需要在提供缓存版本之前检查文件是否没有更改。

如果它们已更改,则压缩代码可以一次性运行。 虽然会有轻微的性能成本,但您也会从更少的文件请求中获得性能优势。

这是Minify 工具用来压缩 JS/CSS 的方法,对我来说效果很好。它仅适用于 Linux/php,但您也可能会从中获得更多想法。

【讨论】:

以上是关于在 .net 中缩小和合并文件的主要内容,如果未能解决你的问题,请参考以下文章

合并和缩小多个 CSS / JS 文件

System.Web.Optimization 合并压缩技术的使用

asp.net core bundleconfig.json合并压缩资源文件

asp.net core2.1 bundleconfig.json合并压缩资源文件

asp.net core2.1 bundleconfig.json合并压缩资源文件

PDF的电子发票,怎么缩小打印?