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

Embed server tags inside client side HTML\JS scripts without template engines

我想在客户端 java 脚本中使用节点和 express

托管的文件执行以下操作
var rootURL = <%= "someurlfromserverconfig" %>;

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

简单的事情用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 returns 一个 Buffer 你可以 运行 toString() 然后允许你 运行 replace().

如果您不想在每次请求时都处理模板,并且如果您要包含的数据不会即时更改,您可以考虑 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 也必须在后台执行此操作。