使用C#, Framework 2.0
读取 JS 和 CSS 文件内容的最佳优化方式是什么?
注意内容需要同时写出
编辑:
更清楚地说,在加载页面时,我需要读取所有 JS 文件的内容并在页面上写出内容。最后,这个页面将作为一个单独的 JS 文件和 CSS 文件以同样的方式运行。
因为这里我要求多次读取文件的内容。
我正在寻找在访问文件时优化其性能的最佳方法。
据我所知,这是读取文件内容的最佳方式,
用于File.ReadAllText(filepath)
获取它的内容。
filepath = Server.MapPath(jsFile);
if (File.Exists(filepath))
{
contents = File.ReadAllText(filepath);
Response.Write(contents);
}
已经有一个 ToolkitScriptManager,它将捆绑、缩小和压缩所有 javascript 到一个请求中。你可以试着看看这个。
我理解您将 javascript 和 CSS 捆绑、缩小和压缩到一个文件中的原因,但无法理解为什么必须为每个请求完成它。你也可以,
使用CodeMaster 在他的回答中建议的现有捆绑和缩小工具之一(YUICompressor、Closure Compiler、AJAXminifier)。这只会将脚本和 CSS 捆绑一次,这也是在构建时本身,并使用它来服务所有请求。对我来说,这是捆绑脚本并减少服务器负载的最有效方法,因为它们只是静态文件,捆绑它们不需要处理。此外,脚本可以被视为静态文件并缓存在客户端或从 CDN 加载。
使用 Toolkit Script Manager 方法,自定义处理程序将在其中查找查询字符串,如果存在组合,则在其缓存中查找,如果不存在,则使用Florion 的答案构建输出并将其缓存以供后续调用。通过这种方式,您可以避免频繁的文件读取。
目标是什么?扫描输出?这是一个编码安全的版本(即:尽可能进行编码翻译)
void ConcatenateAllSafe(StreamWriter output, params string[] files)
{
foreach (var f in files)
{
using(StreamReader rd = new StreamReader(f))
{
string line = null;
while (null != (line = rd.ReadLine()))
{
output.WriteLine(line);
}
}
}
}
// This version will assume everything is sharing the same encoding
void ConcatenateAllUnsafe(Stream output, params string[] files)
{
var data = new byte[1024 * 64];//64k should be enough for anyone
foreach (string f in files)
{
using (Stream inStream = new FileStream(f, FileMode.Open, FileAccess.Read, FileShare.Read))
{
for (int offset = 0,
read; 0 != (read = inStream.Read(data, offset, data.Length)); offset += read)
{
output.Write(data, 0, read);
}
}
}
}
取决于项目的类型,但您可以查看Bundling & Minification。这样你就不必重新发明轮子了。