我正在使用jQuery模板来标记我的JSON。我想知道是否有人有一个优雅的解决方案,可以将它们预编译到服务器上的javascript中,以防止浏览器每次都这样做。
我知道以下帖子:
pre-compile JavaScript templates to functions on project build
我知道我可以使用
https://github.com/wookiehangover/jquery-tmpl-jst
但我希望有更优雅的东西。例如,如何将HttpModule设置为处理* .jst文件的请求,然后编译它并返回生成的JS。
我不确定这是否存在,但假设如果可以让jquery-tmpl-jst项目运行服务器端,那么构建HttpModule似乎相当容易。
感谢任何帮助。如果该模块不存在,我会考虑编写它,如果我可以理清如何使实际的编译工作。
更新
我刚发现这个库。它不是HttpModule,但看起来它实现了编译服务器端的jQuery模板。只是不确定它是否已完全实施。
https://github.com/awhatley/jquery-tmpl.net
更新
看起来上面的库实际上是在.Net中的服务器上执行jQuery模板,因此它永远不会将javascript转换为jQuery编译格式。有什么想法吗?
答案 0 :(得分:3)
第一个选项是使用Cassette.Web(See documentation,get it with NuGet)。考虑到它还会为您的项目添加大约6个依赖包。我们不需要所有这些额外的东西,所以我们决定提取所需的部分,这是一个非常简单的任务:
所以第二个选项是
示例:
using Jurassic;
...
private static string CompileTemplates(string sourceDirectory)
{
var resultBuilder = new StringBuilder();
var scriptEngine = new ScriptEngine();
scriptEngine.Execute(Properties.Resources.jqueryTmplCompiler);
var templates = Directory.GetFiles(sourceDirectory, "*.htm?");
if(templates.Count() > 0)
{
foreach (var filePath in templates)
{
Console.WriteLine("Compiling " + Path.GetFileName(filePath));
string templateText = File.ReadAllText(filePath);
string templateName = Path.GetFileNameWithoutExtension(filePath);
string precompiledTemplate = scriptEngine.CallGlobalFunction<string>("buildTmplFn", templateText);
resultBuilder.AppendFormat("$.template('{0}', {1});\n", templateName, precompiledTemplate);
}
Console.WriteLine("Templates successfully precompiled.");
}
else
{
ErrorExit("No templates found in Source Directory " + sourceDirectory);
}
return resultBuilder.ToString();
}
此示例假定在第二步下载的JS文件存储在当前项目的资源中。
干杯