将JavaScript代码(例如一个函数,而不是一个完整的文件)发送到浏览器的最佳做法?

假设服务器在初始请求中返回基于JavaScript的单页面应用程序。 除了一些初始化代码(这对每个应用程序都是常见的)之外,服务器在初始请求(caching和渲染)时只返回需要显示请求页面的部分(例如索引页面)。

当用户单击应用程序时,应用程序的其他部分应该从服务器asynchronous加载(“获取”,“请求”或者您想调用它)。 用“部分”表示呈现页面所需的平均javascript代码,图像,css等等。 让我们把重点放在这个讨论中的javascript代码部分。

重要的是要注意,要返回到浏览器的JavaScript代码不包含在单独的(静态)文件中(由于例如性能原因,这很容易,将来可能会是这种情况),而是在一个文件中,所以这不是1:1 assiociation(请求:文件)。

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

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页面(既不是最初也不是caching在浏览器中), BookPresenter代码是一个函数,应由服务器返回(假设LayoutPresenter代码已经可用在浏览器和App.Presenter是可用的,因为它是图书馆的一部分)。 我在服务器端运行node.js。

你会如何build议解决这个问题?

有一个eval函数,所以可以将javascript作为一个string发送,然后使用eval()来生活,但这种做法似乎是不好的做法。

永远不要使用eval – 这是邪恶的。 更好的select是使用jQuery ajax并将dataType设置为script 。 这将评估你的js,并且在脚本加载之后还给你提供一个callback。

请参阅Ajax数据types和jQuery getScript的简写 。 这当然假设您可以将您的代码分成逻辑模块

你也可能认为值得你花时间来检查这个问题 ( 我如何在Node.js和浏览器之间共享代码?

dNode是一个在上面的问题中描述的选项,在可能性方面看起来相当令人兴奋。 您可以创buildBook页面所需的function列表,然后直接从服务器本身调用它们。 这将消除需要为您的页面的每个部分维护单独的js模块。 荣誉@Colanbuild议。

尽pipe很有趣,但要注意正确地规定你的function。 你不希望随机用户在你的服务器上玩耍。