106

在 Node.JS 中使用 Express 时如何摆脱 Jade?我只想使用纯 html。在其他文章中,我看到人们推荐了 app.register(),它现在在最新版本中已被弃用。

4

13 回答 13

81

你可以这样做:

  1. 安装ejs:

    npm install ejs
    
  2. 将 app.js 中的模板引擎设置为 ejs

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

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

于 2014-03-01T15:11:24.487 回答
62

Jade 也接受 html 输入。
只需在行尾添加一个点即可开始提交纯 html。
如果这对您有用,请尝试:

doctype html              
html. // THAT DOT
    <body>     
        <div>Hello, yes this is dog</div>
    </body>

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

于 2013-10-14T19:43:22.767 回答
19

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

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});)

来自官方快递 api 参考

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

在给定路径传输文件。

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

警告

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

于 2013-12-14T05:35:44.400 回答
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 = {};

我调用了我的 htmlEngine,你使用它的方式很简单:

app.engine('html', require('./htmlEngine'));
app.set('view engine', 'html');
于 2014-05-23T16:27:55.627 回答
10

app.register()没有贬值,它刚刚被重命名为,app.engine()因为 Express 3改变了模板引擎的处理方式

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

exports.compile = function(templateString, options) {
    return a Function;
};

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

exports.__express = function(filename, options, callback) {
  callback(err, string);
};

如果模板引擎没有公开此方法,您也不会不走运,该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);
  });
});

如果您正在寻找一个可以让您使用“纯”HTML 的模板引擎,我推荐使用doT,因为它非常快

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

于 2012-07-15T21:56:04.660 回答
4

您可以将 EJS 与 express 一起使用,哪些模板是 HTML 但支持变量。这是一个关于如何在 express 中使用 EJS 的好教程。

http://robdodson.me/blog/2012/05/31/how-to-use-ejs-in-express/

于 2013-03-30T16:41:43.920 回答
4

要使渲染引擎接受 html 而不是jade,您可以按照以下步骤操作;

  1. consolidateswig安装到您的目录中。

     npm install consolidate
     npm install swig
    
  2. 将以下行添加到您的 app.js 文件中

    var cons = require('consolidate');
    
    // view engine setup
    app.engine('html', cons.swig)
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', ‘html');
    
  3. 在“views”文件夹中添加您的视图模板作为 .html。重新启动节点服务器并在浏览器中启动应用程序。

虽然这将毫无问题地呈现 html,但我建议您通过学习来使用 JADE。Jade 是一个了不起的模板引擎,学习这将帮助您实现更好的设计和可扩展性。

于 2016-02-14T20:20:41.950 回答
4

首先使用以下行检查模板引擎的兼容性版本

express -h

那么您必须使用列表中的无视图。选择无视图

express --no-view myapp

现在您可以使用公共文件夹中的所有 html、css、js 和图像。

于 2018-11-18T02:20:39.127 回答
3

好吧,听起来您想提供静态文件。并且有一个页面 http://expressjs.com/en/starter/static-files.html

奇怪的是没有人链接到文档。

于 2016-10-11T18:45:09.237 回答
1

由于 Jade 支持 HTML,如果你只想拥有 .html ext,你可以这样做

// app.js
app.engine('html', require('jade').renderFile);
app.set('view engine', 'html');

然后你只需将视图中的文件从玉更改为 html。

于 2016-02-03T19:37:53.840 回答
1

您也可以直接将您的html文件包含到您的jade文件中

include ../../public/index.html

原答案:无玉快递发电机

于 2017-06-07T12:37:56.450 回答
1

考虑到您已经定义了路线或确实知道该怎么做。

app.get('*', function(req, res){
    res.sendfile('path/to/your/html/file.html');
});

注意:这条路线必须放在所有其他路线之后,因为 * 接受所有内容。

于 2015-12-26T01:06:36.930 回答
-10

If you want to use plain html in nodeJS, without using jade.. or whatever:

var html = '<div>'
    + 'hello'
  + '</div>';

Personnaly i'm doing fine with that.

The advantage is simplicity when control. You can use some tricks, like '<p>' + (name || '') + '</p>', ternary .. etc

If you want an indented code in the browser, you can do:

+ 'ok \
  my friend \
  sldkfjlsdkjf';

and use \t or \n at will. But i prefer without, plus it is faster.

于 2012-07-15T21:25:29.920 回答