减lessnodejs服务器上的CPU利用率

我正在研究有趣的方法来减lessNodeJS服务器上的CPU利用率。

在我的研究中,我发现了以下文章: http : //engineering.linkedin.com/nodejs/blazing-fast-nodejs-10-performance-tips-linkedin-mobile

这些都是优秀的技巧,但我有一个关于提示#4的问题。

这是否意味着用户请求“JavaScriptTemplate.html”,然后请求所有的JSON(这里没有实现)?

假设所有的dynamic内容都应该在没有用户交互的情况下可用(例如,在button点击事件中请求JSON),实现这一点的最好方法是什么? 我可以想到加载额外的JS依赖项(requirejs),其中执行函数来请求JSON的东西。

由于我从来没有看到大网站调用静态html文件,而是请求路由到他们的应用程序服务器上面的链接build议的解决scheme有多普遍? 他们真的使用服务器端模板来浪费大部分静态文本内容的CPU利用率吗?

对于Node(expressJS)来说,这必定是一个次优的方法,特别是如果要生成的HTML相当复杂……理想情况下,Node应该只是作为提供JSON数据的API服务器来运行。

你有什么想法可以分享吗?

感谢分享这篇文章 – 这是一个伟大的(对我来说非常及时)。

实际上,您提出了两个问题:1)如何在没有客户端交互的情况下加载数据以呈现HTML客户端; 2)当用户实际请求路由时如何将静态文件发送到浏览器。

在没有用户交互的情况下呈现页面,在客户端MVC上呈现我的¢2

1)你需要运行所有的初始化/数据加载/渲染代码来渲染页面加载后的页面。 如果您在客户端使用jQuery(如大多数Web应用程序所做的那样):

$(document).ready(function(){ // Your code here }); 

它只是从jQuery文档复制而来。

大多数人使用主干/下划线在客户端build立MVC层。 虽然有很多更有魅力的(看似更强大的)客户端框架可以这样做,但这对夫妻却给了你足够的能力,而不会限制你的select,或者降低你在某些时候肯定会需要的灵活性。 Underscore(无论如何也是骨干依赖),除了许多非常有用的function(如果花费一个小时的时间阅读整个页面手册,你会惊讶JavaScript有什么可能)有自己的模板,这些模板看起来很简单,时间非常强大,因为他们只是运行模板内的所有JavaScript。

尽pipe在模板中使用应用程序逻辑通常是一件坏事(因为下划线允许,而且更有趣,“function更强大”的模板引擎也不这样做),所以在模板中添加一些逻辑通常非常方便和好得多当你发现自己在一个狭窄的angular落(正如你经常会这样),而不是重新devise大量的应用程序逻辑或添加额外的模板。

另外,我的意见是避免使用require.js或任何其他模块加载器(直到你真的必须使用它们),正如我在这里写的。

为任何路由提供静态html,为node-as-api提供nginxconfiguration

2)你需要重写请求到所有的路由来响应相同的静态HTML文件(或几个路由相关的HTML文件)。 根据您的偏好或应用程序的要求,它可以是一个空的文件(在这种情况下,用户将看到一个空白页面,直到您的数据加载和页面呈现/插入正文),一些欢迎页面,甚至一些模板页面而不是显示纺车的数据。

您重写请求的方式取决于您用来提供静态内容和代理请求的Web服务器。 如果你使用Apache(对于Node来说是不太可能的select,因为它是同步的),你需要使用.htaccess文件。 如果使用Nginx作为使用node do的大多数人,则需要在config文件的服务器块内部使用rewrite指令,如下所示:

 server { listen 80; server_name example.com; root html/example; access_log logs/example.log; # location block below sends specific static assets from inside your app's # public directory when routes /img, /js, /css, /views are requested location ~ /(img|js|css|views)/ { rewrite ^(.*)$ /public/$1 break; } # location block below proxies all data requests (/api route) to your node app location /api { proxy_pass http://localhost:3000/; proxy_redirect http://localhost:3000/ http://example.com; proxy_connect_timeout 30s; proxy_read_timeout 30s; proxy_cookie_domain localhost example.com; #proxy_http_version 1.1; } # location block below rewrites all other routes to a specific html file # that is sent to the client and that is supposed to load all JS and # static assets to render a page location / { rewrite ^(.*)$ /public/app.html; } } 

您在客户端渲染页面的方式(以及您从服务器请求的数据)将取决于用户请求的路线(您可以在JavaScript中访问/更改以及您可以设置/访问/更改Cookie )。 所有的应用程序内导航(当用户点击任何button或内部链接 – 你需要捕捉所有的点击事件)发生没有额外的请求页面或静态资产已经加载,只有数据请求被发送到服务器。

我希望它有帮助。

SEO更新

nginx的build议configuration只适用于你不需要机器人索引的任何页面,并且需要你的静态htmls的其他web应用程序可见的页面,比如facebook。例如,对于你想被索引的页面,你需要添加条件以不同的方式从机器人发送请求(基于$ http_user_agent),并为这些路由提供一些静态htmls。 但它可以是一个不同的纯语义的HTML(较小,没有devise图像,布局div /类,UI元素和JavaScript来减less爬行机器人和Web应用程序的请求)。

这不是最常用的方法,但现在还是很常见的。 有很多web框架(谷歌angularjs , 淘汰赛 , 小胡子等),这与客户端模板的想法很好地工作。

该模型被请求到服务器(即JSON),并映射到一个静态视图(模板)。

当你有一个提供JSON数据的API服务器时,我认为它非常适合。 这样你可以开发另一个API客户端,在这种情况下是一个Web客户端(RIA)。 但我不认为这种方法背后的主要原因是保存CPU。