在没有模板引擎的客户端HTML \ JS脚本中嵌入服务器标签

时间:2016-02-13 08:38:29

标签: javascript node.js express client-server mean

我想在使用node和express

托管的文件的客户端java脚本中执行以下操作
var rootURL = <%= "someurlfromserverconfig" %>;

我只是从我的节点应用程序托管一个Web目录。我不需要模板引擎。我只想访问一些简单的服务器属性,例如API URL。 ASP和PHP有类似的功能。

2 个答案:

答案 0 :(得分:1)

使用toStringreplace

轻松处理的简单事情
var url = 'example.com'
app.get('/', function(req, res, next) {
  fs.readFile('index.html', function(err, data) {
    if (err) return res.sendStatus(500)
    res.set('Content-Type', 'text/html')
    res.send(data.toString().replace('<%= "someurlfromserverconfig" %>', '"' + url + '"'))
  })
})

这会产生:var rootUrl = "example.com";

出于缓存目的,您可能希望将文件读入内存并预先运行replace而不是每次请求,但这是您的选择。

详细说明工作流程; fs.readFile会返回Buffer您可以toString()运行的replace(),然后您就可以{{1}}运行。{/ p>

答案 1 :(得分:1)

如果您打算不必在每个请求上处理模板,并且您想要包含的数据不会随时更改,您可以考虑ES6 template strings。您可以将代码托管在如下文件中:

'use strict';

const config = require('./server-config');

module.exports = `
var rootURL = "${config.rootURL}";

// ...
`;

然后你需要处理路由的任何文件中的文件。模板只会被处理一次,即使多个文件需要它。

或者,您可以使用轻量级模板引擎,渲染一次,然后在请求时提供它。如果您想要使用这种格式,我建议使用EJS

'use strict';

const ejs = require('ejs');
const config = require('./server-config');

let template = fs.readFileSync('./some-template.js', 'utf8');
let rendered = ejs.render(template, config);

app.get('/', (req, res) => {
  res.send(rendered);
});

如果您要发送的数据不断变化,则必须每次都渲染模板。甚至ASP和PHP都必须在幕后做这件事。