我正在尝试传递一个对象到路由中,例如:
res.render('index', {myObj: myObj});
但是如果我想在首页运行JS脚本,该如何在脚本中访问这个对象呢?我查了一下发现可以使用ejs将其放入脚本中,例如:
var obj = "<%= myObj %>"
但是我不能把脚本放在一个独立的文件中,因为它依赖于ejs。
有什么正确的方法可以将这个参数传递给我的JS,以便我也可以把我的脚本放在一个独立的脚本文件中吗?
谢谢。
我正在尝试传递一个对象到路由中,例如:
res.render('index', {myObj: myObj});
但是如果我想在首页运行JS脚本,该如何在脚本中访问这个对象呢?我查了一下发现可以使用ejs将其放入脚本中,例如:
var obj = "<%= myObj %>"
myObj
是一个对象,假设它是的话,使用JSON.stringify()
。<script>
var myObj = <%- JSON.stringify(myObj) %>;
</script>
我曾经使用过 require.js
来实现类似的功能。 require.js
会加载包含你想要运行脚本的 .js 文件,同时把 myObj
传递给它。
res.render('index', {myObj: myObj});
// index.js is your separate .js file which is declared as entry point
<script data-main="index.js" src="<PATH_TO_REQUIRE_JS>"></script>
<script>
requirejs.config({
config: {
// By default load any modules from this folder
baseUrl: './js',
// index must be used as name here in order to pass myObj into ./js/index.js
"index": {
"myObj": "<%= myObj %>"
}
}
});
</script>
var myObj = module.config().myObj;
<script data-main="../js/index.js"
将你的独立 .js 文件定义为一个模块。
requirejs.config()
将指定的键传递给已声明的模块。
module.config().<SOME_KEY>;
将为每个模块提供每个指定键的值。
requirejs.config({...});
时也使用了baseUrl
选项。定义此选项非常重要,因为config
选项仅使用文件名称而不是相对路径。我使用baseUrl
更新了我的答案。 - Bee正如我在评论中所述,我总是在HTML文档的顶部定义要传递给客户端JS的值,就像这样,然后在定义之后加载使用这些变量的脚本:
<!doctype html>
<html>
<head>
<script>
/** constants from Express **/
let myObj = <%- JSON.stringify(myObj) %>;
//'-' must be used here not '=' after <% for it to work)
let someString = "<%= someString %>";
</script>
</head>
<body>
...
<script src="scripts/someJS.js"></script>
</body>
</html>
现在,scripts/someJS.js可以使用这些变量了。