你如何在.Net中预编译jQuery模板?

时间:2011-08-15 02:04:19

标签: jquery asp.net httpmodule jquery-templates

我正在使用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编译格式。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

第一个选项是使用Cassette.Web(See documentationget it with NuGet)。考虑到它还会为您的项目添加大约6个依赖包。我们不需要所有这些额外的东西,所以我们决定提取所需的部分,这是一个非常简单的任务:

所以第二个选项

  1. 获取.NET的一些JS引擎(我们使用Jurassic作为Cassette.Web)
  2. Download JS extract from jQuery-tmpl plugin在Cassette.Web中使用。
  3. 在JS引擎中执行下载的JS文件。
  4. 在JS引擎中执行“buildTmplFn”JS函数,将模板作为参数传递给它
  5. 哇哇哇,将编译的模板作为返回值。
  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文件存储在当前项目的资源中。

    干杯