如何在ASP.NET MVC应用程序中自动压缩和最小化JavaScript文件?

wgp*_*ubs 36 javascript compression asp.net-mvc extjs minimize

所以我有一个ASP.NET MVC应用程序,它引用了不同地方的许多javascript文件(在站点主文件中以及在几个视图中的其他引用).

我想知道是否有一种自动方式可以压缩并尽可能地将这些引用最小化到单个.js文件中.这样......

<script src="<%= ResolveUrl("~") %>Content/ExtJS/Ext.ux.grid.GridSummary/Ext.ux.grid.GridSummary.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ExtJS/ext.ux.rating/ext.ux.ratingplugin.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ExtJS/ext-starslider/ext-starslider.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ExtJS/ext.ux.dollarfield.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ExtJS/ext.ux.combobox.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ExtJS/ext.ux.datepickerplus/ext.ux.datepickerplus-min.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ExtJS/SessionProvider.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ExtJS/TabCloseMenu.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ActivityViewer/ActivityForm.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ActivityViewer/UserForm.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ActivityViewer/SwappedGrid.js" type="text/javascript"></script>
<script src="<%= ResolveUrl("~") %>Content/ActivityViewer/Tree.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

......可以减少到这样的......

<script src="<%= ResolveUrl("~") %>Content/MyViewPage-min.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

谢谢

Min*_*Min 24

我个人认为在开发过程中保持文件分离是非常宝贵的,并且在生产过程中就是这样的事情.所以我修改了我的部署脚本以便执行上述操作.

我的部分内容如下:

<Target Name="BeforeDeploy">

        <ReadLinesFromFile File="%(JsFile.Identity)">
            <Output TaskParameter="Lines" ItemName="JsLines"/>
        </ReadLinesFromFile>

        <WriteLinesToFile File="Scripts\all.js" Lines="@(JsLines)" Overwrite="true"/>

        <Exec Command="java -jar tools\yuicompressor-2.4.2.jar Scripts\all.js -o Scripts\all-min.js"></Exec>

    </Target>
Run Code Online (Sandbox Code Playgroud)

在我的母版页文件中,我使用:

if (HttpContext.Current.IsDebuggingEnabled)
   {%>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/jquery-1.3.2.js")%>"></script>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/jquery-ui-1.7.2.min.js")%>"></script>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/jquery.form.js")%>"></script>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/jquery.metadata.js")%>"></script>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/jquery.validate.js")%>"></script>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/additional-methods.js")%>"></script>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/form-interaction.js")%>"></script>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/morevalidation.js")%>"></script>
    <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/showdown.js") %>"></script>
<%
   }  else  {%> 
  <script type="text/javascript" src="<%=Url.UrlLoadScript("~/Scripts/all-min.js")%>"></script>
<% } %>
Run Code Online (Sandbox Code Playgroud)

构建脚本获取该部分中的所有文件并将它们组合在一起.然后我使用YUI的minifier来获得javascript的缩小版本.因为这是由IIS提供的,所以我宁愿在IIS中启用压缩来获得gzip压缩.****添加****我的部署脚本是MSBuild脚本.我还使用优秀的MSBuild社区任务(http://msbuildtasks.tigris.org/)来帮助部署应用程序.

我不会在这里发布我的整个脚本文件,但是这里有一些相关的行应该展示它的大部分功能.

以下部分将运行asp.net编译器中的构建,以将应用程序复制到目标驱动器.(在上一步中,我只运行exec net use命令并映射网络共享驱动器).

<Target Name="Precompile" DependsOnTargets="build;remoteconnect;GetTime">

        <MakeDir Directories="%(WebApplication.SharePath)\$(buildDate)" />

        <Message Text="Precompiling Website to %(WebApplication.SharePath)\$(buildDate)" />

        <AspNetCompiler
            VirtualPath="/%(WebApplication.VirtualDirectoryPath)"
            PhysicalPath="%(WebApplication.PhysicalPath)"
            TargetPath="%(WebApplication.SharePath)\$(buildDate)"
            Force="true"
            Updateable="true"
            Debug="$(Debug)"
            />
        <Message Text="copying the correct configuration files over" />

        <Exec Command="xcopy $(ConfigurationPath) %(WebApplication.SharePath)\$(buildDate) /S /E /Y" />

     </Target>
Run Code Online (Sandbox Code Playgroud)

复制完所有解决方案项目后,我运行:

    <Target Name="_deploy">
        <Message Text="Removing Old Virtual Directory" />
        <WebDirectoryDelete
            VirtualDirectoryName="%(WebApplication.VirtualDirectoryPath)"
            ServerName="$(IISServer)"
            ContinueOnError="true"
            Username="$(username)"  
            HostHeaderName="$(HostHeader)"
            />

        <Message Text="Creating New Virtual Directory" />

        <WebDirectoryCreate 
            VirtualDirectoryName="%(WebApplication.VirtualDirectoryPath)" 
            VirtualDirectoryPhysicalPath="%(WebApplication.IISPath)\$(buildDate)"
            ServerName="$(IISServer)"
            EnableDefaultDoc="true"
            DefaultDoc="%(WebApplication.DefaultDocument)"
            Username="$(username)"
            HostHeaderName="$(HostHeader)"
            />
</Target>
Run Code Online (Sandbox Code Playgroud)

这应该足以让您开始自动部署.我将所有这些东西放在一个名为Aspnetdeploy.msbuild的单独文件中.每当我需要部署到环境时,我只是msbuild/t:Target.


Say*_*imi 8

实际上,使用Web部署项目(WDP)有一种更简单的方法.WDP将管理aspnet__compileraspnet__merge工具的复杂性.您可以通过Visual Studio内的UI自定义该过程.

至于压缩js文件,您可以将所有js文件保留在原位,并在构建过程中压缩这些文件.所以在WDP中你会声明这样的东西:

<Project>
   REMOVE CONTENT HERE FOR WEB

<Import 
  Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<!-- Extend the build process -->
<PropertyGroup>
  <BuildDependsOn>
    $(BuildDependsOn);
    CompressJavascript
  </BuildDependsOn>
</PropertyGroup>

<Target Name="CompressJavascript">
  <ItemGroup>
    <_JSFilesToCompress Include="$(OutputPath)Scripts\**\*.js" />
  </ItemGroup>
  <Message Text="Compresing Javascript files" Importance="high" />
  <JSCompress Files="@(_JSFilesToCompress)" />
</Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

这使用了我认为基于JSMin 的MSBuild社区任务中的JSCompress MSBuild任务.

这个想法是,保留所有js文件(即可调试/人类可读).构建WDP时,它将首先将js文件复制到OutputPath,然后调用CompressJavascript目标以最小化js文件.这不会修改原始源文件,只会修改WDP项目的输出文件夹中的源文件.然后在WDPs输出路径中部署文件,其中包括预先编译的站点.我在书中介绍了这个确切的场景(链接在我的名字下面).

您也可以让WDP处理创建虚拟目录,只需选中一个复选框并填写虚拟目录的名称即可.

对于MSBuild上的一些链接:

Sayed Ibrahim Hashimi

我的书:Microsoft Build Engine内部:使用MSBuild和Team Foundation Build