在Express中使用HTML而不是Jade

San*_*pta 97 html node.js express pug

如何在使用带有Node.JS的Express时摆脱Jade?我想只使用普通的HTML.在其他文章中我看到人们推荐的app.register()现在已在最新版本中弃用.

Biw*_*wek 73

你可以这样做:

  1. 安装ejs:

    npm install ejs
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将app.js中的模板引擎设置为ejs

    // app.js
    app.engine('html', require('ejs').renderFile);
    app.set('view engine', 'html');
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在在路径文件中,您可以分配模板变量

    // ./routes/index.js
    exports.index = function(req, res){
    res.render('index', { title: 'ejs' });};
    
    Run Code Online (Sandbox Code Playgroud)
  4. 然后,您可以在/ views目录中创建html视图.

  • 如何在html文件中打印变量`title`? (3认同)
  • 我刚开始使用node.js. 解决方案对我来说并不清楚.我有一个小的html网站.我需要node.js来使用nodemailer通过我的网站发送电子邮件.我已经安装了所需的一切.但是,必须知道应该在app.js文件中进行什么才能使我的网站使用快递运行 (2认同)
  • 如果还有人想知道如何打印变量,就像@MasterYoda问的那样,你可以在html上打印出来:<%= title%> (2认同)

小智 61

Jade也接受html输入.
只需在行尾添加一个点即可开始提交纯HTML.
如果这样做对你有用,那么试试:

doctype html              
html. // THAT DOT
    <body>     
        <div>Hello, yes this is dog</div>
    </body>
Run Code Online (Sandbox Code Playgroud)

PS - 无需关闭HTML - 这是由Jade自动完成的.

  • Doctype 5现已弃用.使用"doctype html"作为第一行. (7认同)

lac*_*ass 17

从快递3开始,您可以简单地使用 response.sendFile

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});)
Run Code Online (Sandbox Code Playgroud)

官方快递api参考:

res.sendfile(path, [options], [fn]])

在给定路径传输文件.

根据文件名的扩展名自动默认Content-Type响应头字段.fn(err)传输完成或发生错误时调用回调.

警告

res.sendFile通过http缓存头提供客户端缓存,但它不会在服务器端缓存文件内容.上面的代码将在每个请求上点击磁盘.

  • 我相信OP仍然希望使用某种模板,只需使用常规的HTML语法.`sendfile`不允许你做任何模板,因为它只是从文件发送字节.此外,我建议不要像这样使用`sendfile`,因为这意味着每次请求进入时你都会遇到磁盘 - 这是一个巨大的瓶颈.对于高流量页面,您应该真正进行内存缓存. (2认同)

kev*_*oat 16

在我看来,使用像ejs一样大的东西只是为了阅读HTML文件有点笨拙.我刚刚为html文件编写了自己的模板引擎,非常简单.该文件如下所示:

var fs = require('fs');
module.exports = function(path, options, fn){
    var cacheLocation = path + ':html';
    if(typeof module.exports.cache[cacheLocation] === "string"){
        return fn(null, module.exports.cache[cacheLocation]);
    }
    fs.readFile(path, 'utf8', function(err, data){
        if(err) { return fn(err); }
        return fn(null, module.exports.cache[cacheLocation] = data);
    });
}
module.exports.cache = {};
Run Code Online (Sandbox Code Playgroud)

我打电话给我的htmlEngine,你使用它的方式只是说:

app.engine('html', require('./htmlEngine'));
app.set('view engine', 'html');
Run Code Online (Sandbox Code Playgroud)

  • 干得好凯文 (2认同)

jos*_*736 10

app.register()app.engine()由于Express 3 改变了模板引擎的处理方式,因此它刚刚被重命名.

Express 2.x模板引擎兼容性需要以下模块导出:

exports.compile = function(templateString, options) {
    return a Function;
};
Run Code Online (Sandbox Code Playgroud)

Express 3.x模板引擎应导出以下内容:

exports.__express = function(filename, options, callback) {
  callback(err, string);
};
Run Code Online (Sandbox Code Playgroud)

如果模板引擎没有公开此方法,那么您运气并不好,该app.engine()方法允许您将任何函数映射到扩展.假设您有一个markdown库并且想要渲染.md文件,但是这个库不支持Express,您的app.engine()调用可能如下所示:

var markdown = require('some-markdown-library');
var fs = require('fs');

app.engine('md', function(path, options, fn){
  fs.readFile(path, 'utf8', function(err, str){
    if (err) return fn(err);
    str = markdown.parse(str).toString();
    fn(null, str);
  });
});
Run Code Online (Sandbox Code Playgroud)

如果你正在寻找一个允许你使用"普通"HTML的模板引擎,我推荐使用doT,因为它非常快.

当然,请记住,Express 3视图模型会将视图缓存留给您(或您的模板引擎).在生产环境中,您可能希望将视图缓存在内存中,这样您就不会在每个请求上执行磁盘I/O.


小智 -10

如果你想在nodeJS中使用纯html,而不使用jade..或其他什么:

var html = '<div>'
    + 'hello'
  + '</div>';
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我对此做得很好。

优点是控制时简单。你可以使用一些技巧,比如'<p>' + (name || '') + '</p>',三元..等

如果你想在浏览器中使用缩进代码,你可以这样做:

+ 'ok \
  my friend \
  sldkfjlsdkjf';
Run Code Online (Sandbox Code Playgroud)

并随意使用\t或\n。但我更喜欢没有,而且速度更快。