在发布之前使用未经优化的javascript文件进行开发



这个问题非常简单和常见,但我仍然无法找到一个好的解决方案。所以我想也许Stackoverflow的一些专家可以指导我了解最佳实践。

假设我有几个Javascript模块,并将它们分别放在一个单独的文件中:

a.js
b.js
c.js
d.js

当发布软件时,我将它们连接在一起并缩小它们:

//pseudo command:
cat a.js b.js c.js d.js | minify > all.js

然后我在我的html文件中包括对all.js的引用,如下所示:

<script src="all.js"></script>

到目前为止还不错。问题是,在开发软件时,我希望看到这些文件是未合并和未合并的。一种解决方案是从过程中消除缩小,并像一样操作

//pseudo command:
cat a.js b.js c.js d.js > all.js

并将其与CCD_ 1标签一起包括。这是可行的,但我更希望单独包含这些文件。所以我必须在我的html文件中这样做:

<script src="a.js"></script>
<script src="b.js"></script>
<script src="c.js"></script>
<script src="d.js"></script>

这一个按我的意图工作,但在发布代码时,我必须遍历所有的html文件,并用<script src="all.js"></script>替换这4个<script>标记,这对我的项目来说太多了,因为有很多html文件,而且我们有定期的调试/发布周期。

一种解决方案是为所有文件设置脚本标签:

<script src="a.js"></script>
<script src="b.js"></script>
<script src="c.js"></script>
<script src="d.js"></script>
<script src="all.js"></script>

但这会导致运行时出现4个错误请求。(因为在发布时只有all.js可用)。

你将如何解决这个问题?

为什么不使用像headjs这样的javascript加载程序并动态提供文件?

然后,当你进入生产时,你只需要修改headJs调用,只包括缩小的js文件。

由于我使用的是ASP.NET,所以我会通过以下方式解决问题:

Default.aspx:

<%
if (ConfigurationManager.AppSettings["IsDebug"] == "true")
{
%>
<script src="Scripts/Application/Core/Constants.js" type="text/javascript"></script>
...
<script src="Scripts/Application/Core/Application.js" type="text/javascript"></script>
<%
} else {
%>
<script src="Scripts/compressed.js" type="text/javascript"></script>
<%
}
%>

Web.config:

<configuration>
<appSettings>
<add key="IsDebug" value="true"/>
</appSettings>
</configuration>

我正在使用谷歌闭包编译器将我所有的JS合并到一个文件中。


因此,如果您的客户出现错误,您可以要求他将IsDebug更改为true,并检查控制台输出(如果您正在使用它)以获得错误来源。

我们所做的是用类似<% Require("xxx.js"); %>的服务器端函数替换<script src="xxx.js">

此函数被配置为呈现此文件的常规脚本引用,或者在缩小模式下,确定文件属于哪个聚合组(您只有一个组,称为"all",但此方法支持多个聚合组),并在其他Require()调用还不需要时为该聚合文件添加脚本引用。

这允许我们在开发过程中随意在聚合(+minimied)和非聚合模式之间切换。发布版本默认配置为使用聚合模式,而开发版本使用原始模式。

伪代码:

string RequireScript(string filename) 
{
if (!IsAggregated)
{
return "<script src='$(filename)'>";
}
else 
{
var group = FindAggregationGroupFor(filename); 
if (group in _requiredGroups) return "";
_requiredGroups.Add(group);
return "<script src='/aggregated/$(group).js'>";
}
}

您还可以只编写一个头文件,然后将其作为基本模板系统,日常地包含在网站的每个页面上。

因此,您只需修改一个文件即可编辑所有页面。

以下是一个示例:http://www.davidjrush.com/blog/2009/08/php-header-and-footer-templates/

最新更新