这个问题非常简单和常见,但我仍然无法找到一个好的解决方案。所以我想也许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/