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

sal*_*iza 24 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢,

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

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

Eam*_*nne 20

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

老答案:

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

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

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

  1. 我指定两个目录只包含可压缩的css和js.在appdomain实例化或之后不久通过静态构造函数,类会找到这些目录的内容并创建一个FileSystemWatcher监视更改的内容.
  2. 所有文件都按文件名的顺序读取(使用诸如此类的前缀00_jquery.js 10_init.js等帮助控制命令).存储文件名列表以进行调试.
  3. 所有文件通过字符串连接组合,然后由YUI缩小,然后通过压缩GZipStream.特定于版本的标记由最新的最后修改日期或结果的散列计算.
  4. 压缩的结果(字节数组,文件名和特定于版本的标记)存储在静态类变量中(由a保护lock).如果文件系统观察程序检测到更新,则步骤2再次启动并在后台运行,直到压缩完成 - 因此锁定.
  5. 任何希望包含组合javascript(和/或css)的页面都会调用共享静态变量.如果我们在调试模式下,会为每个文件名的脚本(或链接)标签存储在两个步骤,否则,这将产生一个脚本(或链接)标签,用一个自定义处理一个URI IHttpHandler.所有Uri都在查询字符串中包含特定于版本的标记 - IIS静态文件处理程序和组合缩小版本的自定义http处理程序都会忽略它,但使缓存变得容易.
  6. 在自定义IHttpHandler中,当收到组合javascript(或css)的请求时,将设置Content-Encoding:gzip标头,以及远期的Expiry日期.然后将预压缩的字节数组直接写入http流context.Response.OutputStream.

使用该方法,无论何时添加或删除脚本文件,都不需要使用web.config选项; 你可以同时应用程序正在运行和客户端将这些要求在第二天页面视图更新脚本 - 但是你仍然会得到最佳的高速缓存行为,因为浏览器甚至不会发送如果-未修改的请求因期满头.一般,压缩脚本应该采取一秒钟左右,压缩结果应该是如此之小,静态变量的内存开销是可以忽略的(至多几个100 KB为一个真正大量的脚本/ CSS的).

  • 为什么你想在建设时这样做 - 有什么好处?几乎可以肯定,更多的工作,更麻烦,更不灵活的启动. (2认同)
  • 这个答案是无稽之谈.您在构建时缩小,原因与预编译代码的原因相同.通过适当的日志记录可以在生产中辅助调试,并且可以在测试/暂存环境中使用原始源.争论修补与接受破坏的持续交付周期同义."更简单的实施"是完全主观的.认为构建复杂性是昂贵的,这背叛了对自动化点的完全误解.并争辩说它会产生锁定?我们谈论的是代码堆栈,而不是数据.锁定程度是生产力不可避免的权衡. (2认同)

Dan*_*Lee 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.

PS Bundler更名为SquishIt.

  • 请记住,将脚本组合到一个javascript文件中几乎与缩小它们一样重要.如果您可以减少HTTP请求的数量,它会加快速度. (2认同)