【问题标题】:Best practice to send javascript code (e.g. a function, not a complete file) to the browser?向浏览器发送 javascript 代码(例如函数,而不是完整文件)的最佳实践?
【发布时间】:2012-04-08 16:38:05
【问题描述】:

假设服务器在初始请求时返回一个基于 JavaScript 的单页应用程序。除了一些对每个应用程序都通用的初始化代码外,服务器在初始请求时仅返回显示请求页面(例如索引页面)所需的应用程序部分(然后缓存并呈现)。

当用户点击应用程序时,应用程序的其他部分应该从服务器异步加载(“获取”、“请求”或您想调用它)。 “部分”是指呈现页面所需的 javascript 代码、图像、css 等。让我们关注本次讨论中的 javascript 代码部分。

请务必注意,要返回到浏览器的 javascript 代码不包含在单独的(静态)文件中(这在当时很容易,并且由于性能原因将来可能会出现这种情况),而是包含在一个文件,所以它不是 1:1 关联(请求:文件)。

例如我们可以像这样定义一个应用程序:

var LayoutPresenter = App.Presenter.extend('LayoutPresenter', {
  __view: '<div>{{link "Author" "/author"}} - {{link "Book" "/book"}}</div>'
});

var AuthorPresenter = App.Presenter.extend('AuthorPresenter', {
  __view: '<div><h1>{{name}}</h1></div>',
  __parent: LayoutPresenter,
  __context: { name: "Steve" }
});

var BookPresenter = App.Presenter.extend('BookPresenter', {
  __view: '<div><h1>{{title}}</h1></div>',
  __parent: LayoutPresenter,
  __context: { title: "Advanced JavaScript" }
});

App.Presenter 是我正在编写的库的一部分,可在浏览器(或任何其他客户端)中使用。

所以假设用户正在浏览之前没有加载的 Book 页面(最初也没有缓存在浏览器中),BookPresenter 代码是一个函数,应该由服务器返回(假设 LayoutPresenter 代码已经在浏览器中可用,并且 App.Presenter 仍然可用,因为它是库的一部分)。我在服务器端运行 node.js。

您建议如何解决这个问题?

eval 函数,因此可以将 javascript 作为字符串发送并使用 eval() 将其恢复,但这种方法似乎是不好的做法。

【问题讨论】:

  • 顺便问一下,您找到适合您的问题的答案了吗?

标签: javascript node.js


【解决方案1】:

永远不要使用eval - 这是邪恶的。更好的选择是使用 jQuery ajax 并将 dataType 设置为 script。这将评估您的 js,并在脚本加载后为您提供回调。

请参阅Ajax dataTypesjQuery getScript shorthand。这当然是假设您可以将代码分成逻辑模块

您可能还认为值得花时间检查this question如何在 Node.js 和浏览器之间共享代码?

dNode 是上述问题中描述的一个选项,就可能性而言,它看起来非常令人兴奋。您可以创建 Book 页面所需的功能列表,然后直接从服务器本身调用它们。这将消除为页面的每个部分维护单独的 js 模块的需要。感谢@Caolan 的建议。

尽管它很有趣,但请注意适当地确定您的功能范围;您不希望随机用户在您的服务器上玩耍。

【讨论】:

  • jquery/ajax 内部如何评估?
  • 很遗憾,我没有答案。
  • 除了在浏览器中处理返回的javascript(例如使用jquery/ajax等),我还需要一种在服务器端处理javascript的方法,我还不清楚该怎么做在 node.js 中正确。无法将 javascript 函数转发到响应,例如: res.writeHead(200, {'content-type': 'text/javascript'}); res.end(function alertMe() { alert('来自服务器'); });
  • jQuery 只是使用具有异步属性的普通脚本标签将脚本嵌入到文档的头部。在code.jquery.com/jquery-1.7.2.js 中搜索“Bind script tag hack transport”。
  • 刚刚检查了提到的文章... dNode(如 now.js)可用于调用远程函数(RPC 样式),不幸的是我正在寻找不同的东西(但它有无论如何用例)。但是,这种方法在每个远程函数调用上都暴露于网络的高延迟。我正在寻找一种通过线路实际发送函数声明的方法,以便能够在本地执行它(例如在浏览器中)。作为函数执行结果的数据状态变化可能会异步发送到服务器,因此不会影响用户交互。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2011-03-18
  • 2010-12-26
  • 1970-01-01
  • 2016-04-21
  • 1970-01-01
  • 2020-05-09
相关资源
最近更新 更多