美文网首页f2e-server
模板的引用和包含

模板的引用和包含

作者: 云香水识 | 来源:发表于2014-12-25 22:18 被阅读139次

前端开发页面中经常会遇到公用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。

相关文章

  • 模板的引用和包含

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

  • thymeleaf中的模板布局

    一.包括模板片段: 1:定义和引用片段,我们经常会想要包含在模板片段来自其他模板。常见的用途是页脚、标题、菜单…;...

  • Android kotlin 杂项

    1 字符串可以包含模板表达式 , 模板表达式以美元符( $ )开头。 2 引用相等 引用相等由 ===(以及其否定...

  • 资源

    资源包含样式和模板 资源的URI 静态资源 元素有资源属性,资源key不能一样,不同元素可以一样,如何引用? 覆盖...

  • Laravel 模板基础语法 流程控制 模板中的URL

    模板的基础语法 和include 引用 流程控制 模板中的url

  • 模板的布局、包含和继承

    当我们的模板在主页的时候,显示的是下面这幅图这样。若切换到其他页面,可能会做一下修改,毕竟其他页面和主页肯定不一样...

  • 2018-05-17

    函数包装器与模板 函数模板的嵌套 模板与引用 //变量 左值引用 右值引用 原则不能冲突//ref 变量 -> ...

  • 03Angular模板在组件类中的引用

    在Angular中,我们可以在当前模板的任何地方使用模板引用变量 引用模板元素 @ViewChild用来在类中引用...

  • Groovy模板引擎

    本文参考自Template engines,大部分代码直接引用了文档的内容。 模板引擎介绍 Groovy语言包含了...

  • 24.Templates的模板继承

    许多网页的header和booter都相同,因此可以单独写一个包含着两部分内容的html文件,在其他模板中引用。但...

网友评论

    本文标题:模板的引用和包含

    本文链接:https://www.haomeiwen.com/subject/capatttx.html