Visual Studio 2010:发布缩小的javascript文件而不是原始文件

时间:2010-03-02 16:13:55

标签: javascript visual-studio-2010

我有一个Scripts文件夹,其中包含项目中使用的所有.js文件。使用Ajax Minifier任务,我为每个任务生成.min.js文件。 根据应用程序是在调试模式还是在发布模式下运行,我包含原始.js文件或缩小文件。

Scripts文件夹如下所示:

Scripts/script1.js
Scripts/script1.min.js   // Outside the project, generated automatically on build
Scripts/script2.js
Scripts/script2.min.js   // Outside the project, generated automatically on build

.min.js文件位于项目之外(尽管与原始文件位于同一文件夹中),并且在我们发布项目时不会将它们复制到目标文件夹中。

我没有任何使用构建任务的经验(除了包括minifier任务之外),所以如果有人能告诉我哪个是正确的方法,我将不胜感激:

  • 从Visual Studio发布应用程序时,将.min.js文件复制到目标文件夹。
  • 删除/不复制原始js文件(这不重要,但我不想复制不会在应用程序中使用的文件)。

谢谢,

编辑:从回复中,我看到我错过了一些细节,也许我正在寻找错误的问题解决方案。我将在问题中添加以下详细信息:

  • 如果可能,我们宁愿不在解决方案的构建过程中创建复制脚本。当然,我们考虑过它,但到目前为止我们一直在使用Web部署项目,而且我们宁愿开始使用VS2010的新发布功能(应该替换这些项目)而不是手动将复制命令添加到构建任务。 / LI>
  • * .min.js文件未包含在项目中,因为它们不能位于Source控制系统中(此时为TFS)。它们是在编译期间生成的文件,它类似于在TFS中包含'bin'文件夹(包括它会导致的问题)。也许我们应该在不同的文件夹中创建min文件并将其视为'bin'? (这甚至可能吗?)

5 个答案:

答案 0 :(得分:20)

编辑(2012年10月): ASP.NET 4.5现在包含Bundling and minification。当前版本不能很好地支持动态javascript生成,但它在其他方面非常有用,例如,如下所述,它会监视文件系统的实时更改;在滚动自己的压缩之前,试试吧!

旧答案:

我建议你在运行时这样做,而不是在构建时实现它。这有许多优点:

  • 您可以包含关闭合并和缩小的调试参数,以便更轻松地识别错误。这也使您可以在开发和生产环境之间减少差异。
  • 你获得了一些灵活性。我已经两次能够通过一个可以直接生效的脚本修复来修复错误。对于简单但关键的错误,这是一个不错的选择。
  • 实现起来相当简单 - 你已经具备了实现http响应的专业知识,这在这里很适用。
  • 您可以跟踪所涉及脚本的上次修改日期,而不仅仅是使用它来设置适当的ETag和whatnot(IIS也可以做),而是设置远期到期日期。然后,您可以将脚本与查询字符串中的一些短标记链接,而不是链接实际的scipt(无论是否缩小) - 这样客户端就不需要检查js是否已更新。如果有,页面将链接到“新”脚本文件,无论如何都需要单独请求。 (这可以在构建脚本中完成,但更棘手)。
  • 复杂的构建过程通常会产生隐藏成本。不仅运行时间更长,而且当您想要更新构建自动化工具时会发生什么?当您切换IIS或Windows版本?迁移到VS 2010时?让新开发人员加快速度有多容易?

这是我遵循的流程的大致轮廓:

  1. 我指定两个目录只包含可压缩的css和js。在appdomain实例化或之后不久通过静态构造函数,类会找到这些目录的内容并创建FileSystemWatcher来监视更改。
  2. 所有文件都按文件名顺序读取(使用00_jquery.js 10_init.js等前缀等帮助控制订单。存储文件名列表以进行调试。
  3. 所有文件通过字符串连接组合,然后由YUI缩小,然后通过GZipStream压缩。特定于版本的标记由最新的最后修改日期或结果的散列计算。
  4. 压缩的结果(字节数组,文件名和特定于版本的标记)存储在静态类变量中(受lock保护)。如果文件系统观察程序检测到更新,则步骤2再次启动并在后台运行,直到压缩完成 - 因此锁定。
  5. 任何希望包含组合javascript(和/或css)的页面都会调用共享静态变量。如果我们处于调试模式,则会为步骤2中存储的每个文件名生成一个脚本(或链接)标记,否则,这会生成一个由自定义{{1}处理的Uri的单个脚本(或链接)标记。 }。所有Uri都在查询字符串中包含特定于版本的令牌 - IIS静态文件处理程序和组合缩小版本的自定义http处理程序都会忽略它,但会使缓存变得容易。
  6. 在自定义IHttpHandler中,当收到组合javascript(或css)的请求时,将设置Content-Encoding:gzip标头,以及远期的Expiry日期。然后,预压缩的字节数组通过IHttpHandler直接写入http流。
  7. 使用这种方法,无论何时添加或删除脚本文件,都不需要使用web.config选项;您可以在应用程序运行时更新脚本,客户端将在下一页面视图中请求这些脚本 - 但您仍然会获得最佳缓存行为,因为浏览器甚至不会因为过期标头而发送If-Not-Modified请求。通常,压缩脚本应该花费一秒左右的时间,压缩结果应该很小,以至于静态变量的内存开销可以忽略不计(对于真正大量的脚本/ css,最多只需要几百KB)。

答案 1 :(得分:7)

如果您想通过Visual Studio进行Javascript缩小,这将帮助您入门:http://encosia.com/2009/05/20/automatically-minify-and-combine-javascript-in-visual-studio/

否则,我建议使用一种可以自动组合和缩小Javascript的工具。我查看过的两个工具是Justin EtheredgeBundlerCombres。我在我当前的项目中使用Bundler,我的一位同事正在使用Combres。 Bundler使用起来有点简单,但它比Combres要少。使用Bundler,如果在web.config中关闭了调试,那么它不会缩小和组合,这意味着您可以在开发环境中调试javascript。

P.S。 Bundler更名为SquishIt。

答案 2 :(得分:3)

您可能希望查看Build Events,您可以使用它来指定命令行来执行构建后。此外,您的问题与these questions类似。

对于实际复制,您可以很容易地使用COPY命令。

答案 3 :(得分:2)

我不太确定这种方法在这种情况下是否有用,但我可以想象...... 您可以将csproj文件修改为例如影响应该包含在某种类型的构建中的文件。

对于某种类型,我指的是配置管理器。

调试和发布是默认的,但没有什么能阻止你制作新的。根据所选配置,您可以将不同的文件作为配置的一部分,我想您可以通过这种方式发布不同的文件。我在我的博客上描述了这个策略:http://realfiction.net/go/130

答案 4 :(得分:1)

这篇关于“在ASP.NET项目中自动缩小,组合,压缩和缓存* .js和* .css文件”的文章可以帮助您

http://www.codeproject.com/KB/aspnet/CssAndJavaScriptOptimizer.aspx?display=Print