前端进阶:服务端渲染SSR之asp.net模板引擎移植到nodejs环境

前言

在CMS内容管理系统中,模板引擎一定是一个绕不过的话题,那么有没有好用的库呢?

mustache.js、ejs等可以为我们处理数据问题,那么页面模板、模块模板、模板复用呢?

咋以前不是做过asp.net开发吗?asp.net的模板引擎真是精妙绝伦,能不能移植过来?

说动就动,让我们撸起袖子加油干……


asp.net 代码示例

母版页

带控件的内容页


需求疑问

1、模板引用方式,能不能尽量不要创造语法,或者与其它模板引擎冲突?

2、asp:ContentPlaceHolder与asp:Content语法太长了,能优化吗?

3、先解决上面两个问题、然后再做扩展吧……。


语法创作

1、模板引用

模板路径:自拟路径磁盘、变量、数据库、网络地址只要您能读取到,都可以。

<自拟:标签名>:您想写啥就写啥,无限制。

<!-- @Register "模板路径" to <自拟:标签名> -->

2、使用模板

<自拟:标签名></自拟:标签名>

3、母版页模板及插槽

<template:自拟插槽名></template:自拟插槽名>

4、使用母版页模板、普通模板

<!-- @Register "模板路径" to <自拟:标签名> -->
<自拟:标签名>
  
    <标签名:自拟插槽名1>
        <!-- 其它html代码 -->
    </标签名:自拟插槽名1>
      
    <标签名:自拟插槽名2>
        <!-- 其它html代码 -->
    </标签名:自拟插槽名2>
      
</自拟:标签名>

5、如果模板是单个双标签,可省略插槽标签。

// 模板1
<div class="form"></div>

// 使用模板1
<!-- @Register "模板1" to <模板:模板1> -->
<模板:模板1>
    <!-- 其它html代码 -->
</模板:模板1>

代码示例

模板

//master.html
<html>
  <head>
     <!-- header -->
    <template:header></template:header>
    <!-- header -->
  </head>
  <body>
    <!-- bodyer -->
    <template:bodyer></template:bodyer>
    <!-- bodyer -->
  </body>
</html>

使用模板

// index.html
<!-- @Register "template/default/master/master" to <view:master> -->
<!-- @Register "template/default/control/header/header" to <uc:header> -->
<!-- @Register "template/default/control/footer/footer" to <uc:footer> -->
<view:master>
    <master:header>
        <link rel="stylesheet" href="/static/css/index.css" />
    </master:header>
    <master:bodyer>
        <uc:header></uc:header>
        <div>您好,世界!</div>
        <uc:footer></uc:footer>
    </master:bodyer>
    <master:footer>
        <script type="text/javascript" src="/statics/js/index.js">
    </master:footer>
</view:master>

渲染模板

import SHtmx from "shtmx";
// 解析模板
SHtmx.templateAnalysis({
  	// 最顶层那个模板路径(比如:首页)
    templatePath: 'index',
   // 获取模板 
   // 目前,templateType的默认值为:( templateType = 'html' )
    template: function (path, templateType) {
       // 模板内容
        let viewContent: string = `未找到“${path}”!`;
       // 查找模板 并获取模板内容
        templates.some(item => {
            item.path == path && (viewContent = (item as any)[templateType]);
            return item.path == path;
        });
      
        return viewContent;
    },
    // 获取解析结果
    result: function (viewContent: string): void {
        console.log(viewContent);
    }
});

好的,到这里就结束了,赶快试试吧。


人人为我,我为人人,一起加油吧。

原文链接:,转发请注明来源!