• RazorEngine


    目标

    使用razorengine编译cshtml页面生静态html

    制作一个vs2017的插件,实现右击cshtml文件时,编译该文件.

    环境

    razorengine4.5 / netframework4.6 / vs2017插件项目

    razorengine参考文档  https://antaris.github.io/RazorEngine/index.html

    测试实现

    思路很简单,右击cshtml文件后,调用razorengine引擎,执行run方法得到编译后的html.

    首先在控制台程序中测试了主要方法,发现没有问题.很快就编译出html了.编写cshtml页的语法部分支持razor,可以使用layout 程序语句 加载分部页等等.但在移到插件项目后,发现各种问题.

    最大的问题在于速度很慢.简直无法使用.

    以下是测试cshtml页面 使用了母板页,分部页,程序代码,raw函数,ViewBag.xxx,等常用的razor能力

    // 主cshtml页

    @{
        layout="/layout.cshtml";
       ViewBag.Title="test-razorengine";
    }
    <div>@Raw("<h1>test razorengine</h1>")</div>
    <table>
        @for(int i=0;i<5;i++){
            <tr><td>@i</td><td>@i</td></tr>
        }
    </table>
    @Include("part1.cshtml")

    // razorengine编译使用

    var config = new TemplateServiceConfiguration();
    config.CachingProvider = new DefaultCachingProvider(t => { });
    config.Language = Language.CSharp;
    config.AllowMissingPropertiesOnDynamic = true;
    config.DisableTempFileLocking = true;
    using (Engine.Razor = RazorEngineService.Create(config))
    {
        // 添加这个cshtml页面以及它引用的母版页和片段页
        foreach (string item in alltemps.Keys)
        {
            service.AddTemplate(item, alltemps[item]);
        }
        // 编译并运行得到编译后的静态html
        string html =Engine.Razor.RunCompile("index.cshtml"); 
    File.WriteAllText(
    "index.html", html);
    }

    问题

    1.页面缓存

    测试时发现compile方法会编译cshtml然后缓存起来,即使修改了这个cshtml文件,重新添加到模板,依然不行,还是会使用之前编译过的缓存

    此时需要重新添加模板,并且再编译之.在添加cshtml模板页到引擎时,每个页面的key是固定的,所以,需要先删除这个key再添加.否则会报key重复

    // 删除KEY

    ((DelegateTemplateManager)config.TemplateManager).RemoveDynamic(k);

    // 重新添加,依然是这个KEY,可以使用文件路径做KEY. 

    Engine.Razor.AddTemplate(k, alltemps[key]);

    // 一定要编译,否则会使用缓存,即使重新添加了模板也不行

    Engine.Razor.Compile(k); 

    2.编译卡死问题

    在控制台中测试时并没有速度问题,即使每次重新编译都会很快,using()的作用是每次使用完引擎后,就释放资源,故每次都是重新初始化引擎,重新编译模板.

    即使如此,依然很快.但是将代码移入到插件后,发现编译过程挂掉了.VS一直在运行,razorengine.compile这个方法卡住了,过了十分钟才结束运行...原因不知

    这个问题的解决方法是使用roslyn这个新的编译器来编译.

    config.CompilerServiceFactory = new RazorEngine.Roslyn.RoslynCompilerServiceFactory();
    config.CompilerServiceFactory.CreateCompilerService(Language.CSharp);

    3.编译过慢

    Engine.Razor.Compile(k); 这个过程最慢,需要几百毫秒,但如果这个Key的页面是编译过的(缓存了),那么很快.

    编译一个cshtml页面的相关页面比如母板页或者片段页,可能并不会一起修改.所以可以在每次重新加载模板前,判断文件是否修改过.

    修改过的文件才重新添加编译,否则不用编译.如此,只耗废时间在那个修改过的文件上.

    通过比较文件的MD5值来决定是否重新编译

    优缺点

    razor是个不错的工具,不仅可以用于写html,像代码生成器之类的都可以用它.确实是C#程序员的利器.比起T4模板来,更加友好一些,嵌套模板时也很容易理解.

    razorengine这个编译工具有点慢,对于不会修改的模板存只存在首次慢的问题,但对于频繁修改模板那就麻烦了,每次都要重新编译,速度不行.另外,引擎缓存问题如果处置不当容易造成巨大内存占用.

  • 相关阅读:
    智能指针的简单实现
    原型模式
    Linux——模拟实现一个简单的shell(带重定向)
    软件开发的一个案例:学生信息管理系统
    关于正则的一点总结
    STL——模拟实现空间配置器
    LeetCode全文解锁 √
    话说extern和static
    C++有关 const & 内敛 & 友元&静态成员那些事
    C语——宏小结
  • 原文地址:https://www.cnblogs.com/mirrortom/p/9507606.html
Copyright © 2020-2023  润新知