Nodejs ejs模板里可以使用require来动态加载东西么?

Nodejs ejs模板里可以使用require来动态加载东西么?

比如

<%var selector=require('../conf/selectors/'+m+'.json')[selectors]%>

会报 require is not defined 。是因为require调用的是nativeModule.require 但是模板引擎中没有么?

4 回复

在 Node.js 的 EJS 模板中直接使用 require 是不可行的,因为 EJS 模板引擎默认不会提供 Node.js 的全局对象,如 require。当你尝试在 EJS 模板中直接使用 require 时,会抛出错误,提示 require is not defined

然而,你可以在渲染模板之前通过 Node.js 应用程序将需要的数据或模块加载到模板上下文中,然后在 EJS 模板中直接使用这些数据。

示例代码

假设你有一个配置文件 selectors.json,你想根据某个变量 m 动态加载不同的配置项。你可以这样做:

  1. Node.js 应用程序代码
const express = require('express');
const ejs = require('ejs');

const app = express();

app.get('/', (req, res) => {
    const m = 'example'; // 这个值可以从请求参数、环境变量等地方获取
    const selectors = require(`../conf/selectors/${m}.json`);

    // 将 selectors 和 m 传递给 EJS 模板
    res.render('index', { selectors, m });
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});
  1. EJS 模板代码(例如 views/index.ejs):
<!DOCTYPE html>
<html>
<head>
    <title>Selectors</title>
</head>
<body>
    <h1>Selectors for <%= m %></h1>
    <ul>
        <% selectors.forEach(selector => { %>
            <li><%= selector %></li>
        <% }) %>
    </ul>
</body>
</html>

在这个例子中,我们首先在 Node.js 应用程序中加载了所需的配置文件,并将其传递给 EJS 模板。这样,EJS 模板就可以直接访问这些数据,而不需要直接使用 require

总结

虽然你不能直接在 EJS 模板中使用 require,但你可以通过在服务器端加载所需的数据并将其传递给模板来实现类似的功能。这样既安全又符合 Node.js 的设计原则。


express中 app.locals.require = require;

这样也行!?

长见识了。。

在EJS模板中直接使用require是不可行的,因为EJS模板默认不支持Node.js原生模块系统。EJS主要负责渲染字符串或文件内容,并不提供运行时环境,如require函数。

不过,你可以通过以下几种方法实现类似功能:

方法1: 预处理数据

在渲染模板之前,先在服务器端进行预处理,将需要的数据加载到变量中,然后传递给模板。

// 假设这是你的服务器端代码(例如Express应用)
const express = require('express');
const app = express();
const ejs = require('ejs');

app.get('/', (req, res) => {
    const m = 'some_module'; // 这可以从请求参数、数据库等地方获取
    const selector = require(`../conf/selectors/${m}.json`);
    
    res.render('template', { selectors: selector[m] });
});

app.listen(3000, () => console.log('Server running on port 3000'));

方法2: 自定义全局函数

如果你确实需要在模板中使用某种形式的require,可以在模板中引入一个自定义的全局函数来实现相同的效果。这通常涉及更复杂的设置和安全考虑。

<% 
function loadSelector(moduleName) {
    return require(`../conf/selectors/${moduleName}.json`)[moduleName];
}
var selector = loadSelector(m);
%>

请注意,这种方法可能会带来安全隐患,特别是当模板输入未经过严格验证时。建议仅在充分理解潜在风险后使用。

总之,在EJS模板中直接使用require是不可行的,但可以通过上述方法达到类似效果。

回到顶部