如何在 expressjs 4.0 中设置 marko 模板引擎

Posted

技术标签:

【中文标题】如何在 expressjs 4.0 中设置 marko 模板引擎【英文标题】:How to set marko template engine in expressjs 4.0 【发布时间】:2015-06-26 06:00:03 【问题描述】:

我想将 marko 模板引擎与 expressjs 4.0 一起使用 当我删除默认快速模板引擎时,我收到以下错误

错误:未指定默认引擎且未提供扩展名。 在新视图 (E:\nodeleap\node_modules\express\lib\view.js:48:42) 在 EventEmitter.app.render (E:\nodeleap\node_modules\express\lib\application.js:545:12) 在 ServerResponse.res.render (E:\nodeleap\node_modules\express\lib\response.js:938:7) 在 E:\nodeleap\config\express.js:106:19 在 Layer.handle [as handle_request] (E:\nodeleap\node_modules\express\lib\router\layer.js:82:5) 在 trim_prefix (E:\nodeleap\node_modules\express\lib\router\index.js:302:13) 在 E:\nodeleap\node_modules\express\lib\router\index.js:270:7 在 Function.proto.process_params (E:\nodeleap\node_modules\express\lib\router\index.js:321:12) 在下一个 (E:\nodeleap\node_modules\express\lib\router\index.js:261:10) 在 Layer.handle [as handle_request] (E:\nodeleap\node_modules\express\lib\router\layer.js:78:12)

【问题讨论】:

项目的 README mentions this in the FAQ -- "Marko 如何与 Express 一起使用?" "Marko 与 Express 一起使用的推荐方法是绕过 Express查看引擎,而是让 Marko 直接渲染到响应流 [...]" 【参考方案1】:

express view 引擎似乎还不支持 marko(请参阅此处:https://github.com/tj/consolidate.js)

编辑: 但 Marko 常见问题解答建议不要使用快速视图引擎。下面的选项 1 应该可以工作。

所以我看到了一些选项,1. 直接在您的每条路线中使用 marko 直接渲染您的模板,或者 2. 设置您自己的 express view 引擎,甚至可能 3. 为 consolidate.js 创建一个 PR 以添加 marko支持,让其他人可以享受:)

选项 1 和 2 如下所示:

var express = require('express');
var app = express();
var fs = require('fs');
var marko = require('marko');

// Option 2
app.engine('marko', function(filePath, options, callback) 
    marko.load(filePath).render(options, function(err, output) 
        callback(null, output);
    );
);

app.set('views', './views');
app.set('view engine', 'marko');

app.get('/viewengine', function(req, res) 
    res.render('hello', 
        name: 'Frank'
    );
);

// Option 1
var template = marko.load(require.resolve('./views/hello.marko'));
app.get('/marko', function(req, res) 
    template.stream(
        name: 'Frank'
    )
        .pipe(res);
);

var server = app.listen(3000, function() 
    var host = server.address().address;
    var port = server.address().port;
    console.log('Example app listening at http://%s:%s', host, port);
);

【讨论】:

嗯,我好像没有RTFM,你一定要听乔纳森的建议(选项1) 关于选项 2 的注意事项 -- callback 可以传递给 .render() 以代替 function(err, output),从而使 Express 能够知道发生的任何 errs。您可能还想检查options.cache 并通过paths 存储.load 的视图,如果那是true,以避免每次使用时总是重新编译。【参考方案2】:

更新:

当我回答您时是 2019-9-13,并且我正在使用 node v10 LTS,所以我的回答与docs 的最后一个回答会有些不同,但此时它工作正常。 ..

实际上我们不需要为marko设置模板引擎,因为他们添加了一些模块供我们连接表达。这是documention 建议的最佳方式。

npm install express --save
npm install marko --save

然后创建您的 app.js 文件并执行以下操作:

"use strict";

require("marko/node-require"); // Allow Node.js to require and load `.marko` files

let express = require("express");
let path = require("path");
let markoExpress = require("marko/express");
let template = require("./views/index.marko");

let app = express();

app.set("views", path.join(__dirname, "views"));
app.use(markoExpress()); //enable response.marko(template, data)

app.get("/", (request, response) => 
  response.marko(template);
);
app.listen(5000);

在此之后在您的视图目录中创建您的模板文件,在本例中为./views/index.marko 并写:

$ const name = "world";
<h1>Hello $name!</h1>

它是一个简单的 hello world 应用程序,包含 node、express 和 marko

【讨论】:

以上是关于如何在 expressjs 4.0 中设置 marko 模板引擎的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 4.0 如何轻松在 iOS 16 中设置 TextEditor 背景色

SwiftUI 4.0 如何轻松在 iOS 16 中设置 TextEditor 背景色

SwiftUI 4.0 如何轻松在 iOS 16 中设置 TextEditor 背景色

在 linux 机器中设置时的 Sonarqube-4.0 问题 (linux-x86-32)

在 Android Studio 1.5 中设置 NDK 开发

我如何在 unity 2018.1 中设置和使用 proGrids?