模板的引用和包含

前端开发页面中经常会遇到公用HTML片段的情况,例如:整站页面都是用统一的头尾,这个要求一个我们的服务器至少应该提供一个基本的代码片段引用模式。

  • 文本结果获取:
    因为需要模板操作的是字符串文本,首先获取文本,使用读取流操作时候,需要进行data和end事件监听。
var rs = fs.createReadStream(pathname), str = "";
rs.on("error", function(err){  
    resp.writeHead(500, {"Content-Type": 'text/html'});
    resp.end( JSON.stringify(err) );  //出错时 服务端给出500的HTTP-code
}).on("data", function(d){  //data事件中拼接结果
    str += d;
}).on("end", function(){
    //TODO 这里获取str就是结果字符串
});
  • 文本识别:
    其次,要让服务器识别出来只有文本类型的请求才能进行这种操作,因为本质上我们是使用字符串替换实现该功能的。f2e-server中在mime对象上面进行了方法扩展isTXT(path)
mime.isTXT = function(path){
    return /\b(text|xml|javascript|json)\b/.test( this.lookup(path) );
};

可以看出来,我们判断MIME类型字符串是否含有text|xml|javascript|json。我们只需要在end事件注册之前判断一下,只有是文本类型的时候才处理,否则仍然使用原来的管道转接。

if( mime.isTXT(pathname) ){
    rs.on("end",function(){ 
        str = require("./lib/handle.js").execute(str, root);  //将处理过程用一个新的模块实现
        resp.end( str );
    });
}else{
    rs.pipe(resp);
}
  • 处理结果字符串
    这里核心处理模板引用的功能。handle.js
"use strict";
var fs = require("fs");
module.exports = {
    execute: function(str,root){
        var belong = "$[placeholder]";
        var h = /\$belong\[["\s]*([^"\s]+)["\s]*\]/.exec(str); 
        try{
            if(h){  //如果有belong关键字, 先处理: 所有路径关键字均使用从root起的绝对路径。
                belong = fs.readFileSync( root + "/" + h[1],'utf-8');   //读取belong文本
                str = str.replace(h[0], "" );           //替换关键字
                str = belong.replace("$[placeholder]",str);
            }
            return str.replace(/\$include\[["\s]*([^"\s]+)["\s]*\]/g, function(match, key){
                return fs.readFileSync( root + "/" + key,'utf-8');   //读取include文本
            });
            
        }catch(e){
            console.error(e);
            return str;
        }
    }
};
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h2 style="text-align:center">我是header</h2>
    
<ul>
    <li>列表1</li>
    <li>列表2</li>
    <li>列表3</li>
    <li>列表4</li>
    <li>列表5</li>
    <li>列表6</li>
</ul>
</body>
</html>

PS:

相关完整代码已经发布到了npm仓库中, 可以使用 $npm install http-f2e-server@0.0.4 进行安装或者更新。进入目录后使用 $nodehttp-f2e-server.js` 启动服务,并查看Demo。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,367评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,244评论 6 342
  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,614评论 1 37
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,248评论 18 399
  • 这两天对markdown的形式多了许多理解,因为一直在调试mindmanager2016 xml文件直接转换为ma...
    科幻经典阅读 1,763评论 0 0

友情链接更多精彩内容