降低 Nodejs 服务器上的 CPU 利用率

2024-05-25

我正在研究降低 CPU 利用率的有趣方法 在 NodeJS 服务器上。

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

这些都是很好的提示,但我有一个问题 提示#4。

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

假设所有动态内容都应该在没有用户的情况下可用 交互(例如,在按钮单击事件上请求 JSON)什么是 实现这一目标的最佳方法是什么?我可以考虑加载额外的 JS 依赖项 (requirejs) 执行函数来请求 JSON 内容。

因为我从来没有见过大网站调用静态html文件但是 相反,请求到其应用程序服务器的路由有多常见 上面的链接建议的是解决方案吗?他们真的吗 使用服务器端模板来浪费 CPU 利用率 主要是静态文本内容???

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

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


感谢您分享这篇文章 - 这是一篇很棒的文章(对我来说非常及时)。

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

没有用户交互的渲染页面和客户端 MVC 上的我的 2

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

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

它只是复制自jQuery 文档 http://docs.jquery.com/How_jQuery_Works#Launching_Code_on_Document_Ready.

大多数人使用主干/下划线在客户端构建 MVC 层。尽管有很多更奇特(并且看起来更强大)的客户端框架可以做到这一点,但这两个框架为您提供了足够的功能,而不会限制您的选择或降低您在某些时候肯定需要的灵活性。 Underscore(无论如何都是骨干依赖)除了许多非常有用的功能(如果你花一个小时阅读整页手册,你会惊讶于 JavaScript 的可能性)还有它自己的模板,这些模板看似简单,但同时time 非常强大,因为它们只在模板内运行所有 javascript。

尽管在模板中包含应用程序逻辑通常是一件坏事(因为下划线允许,而大多数更高级和“更强大”的模板引擎则不允许),但能够在模板中添加一些逻辑通常非常方便且更好当您发现自己陷入困境时(您经常会这样做),而不是重新设计大量应用程序逻辑或添加其他模板。

另外,我的观点是避免使用 require.js 或任何其他模块加载器(直到你真的必须使用它们),正如我所写的here https://stackoverflow.com/questions/14037727/best-backbone-js-and-require-js-boilerplate-for-huge-apps/14041967#14041967.

为任何路由提供静态 html 并为 node-as-api 提供 nginx 配置

2)您需要重写对所有路由的请求,以使用同一个静态html文件(或多个依赖于路由的html文件)进行响应。根据您的偏好或应用程序要求,它可以是带有空正文的文件(在这种情况下,用户将看到一个空白页面,直到您的数据加载并且页面呈现/插入到正文中)、一些欢迎页面甚至一些模板页面,其中显示的不是数据而是旋转轮。

重写请求的方式取决于您用于提供静态内容和代理请求的 Web 服务器。如果您使用 Apache(不太可能选择 Node,因为它是同步的),您需要使用 .htaccess 文件。如果您像大多数使用 Node 的人一样使用 Nginx,则需要在配置文件的服务器块内使用重写指令,如下例所示:

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 )。应用程序内部的所有导航(当用户单击任何按钮或内部链接时 - 您需要捕获所有单击事件)都会发生,而无需对已加载的页面或静态资源发出额外请求,仅将数据请求发送到服务器。

我希望它有帮助。

搜索引擎优化更新

仅当您不需要由机器人索引的任何页面并且对需要静态 html 的其他 Web 应用程序(例如 facebook)可见时,建议的 nginx 配置才适用。对于要编入索引的页面,您需要添加条件以不同方式路由来自机器人的请求(基于 $http_user_agent),并为这些路由呈现一些静态 html。但它可以是不同的纯语义 html(更小,没有设计图像、布局 div/类、UI 元素和 javascript,以减少来自爬行机器人和 Web 应用程序的请求)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

降低 Nodejs 服务器上的 CPU 利用率 的相关文章

  • 如何修改每个JSON对象javascript

    我想修改里面的每个 JSON 值cooldown object cooldown user 1 This user2 0 This 在 Javascript 中使用 for 语句 我研究了好几个小时 只找到了内部的 blocks Edit
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • 如何在react-bootstrap中禁用表单提交的

    在下面的代码片段中 我有许多文本类型的输入表单 如果用户点击 我似乎会得到相同的合成事件 就像他们按下提交按钮一样 我想忽略作为表单提交 只允许一个人按下 提交 按钮 我删除了一些表单组以减少示例 在所有情况下 按钮或 ENTER 键 e
  • 如何更改 Google Maps v3 API for Directions 中的开始和结束标记图像

    我使用 DirectionsRender 绘制了一条路线 但我不知道如何用我自己的标记替换通用的 Google 标记 我知道并在正常的谷歌地图情况下使用它 但发现很难用开始和结束的方向标记来做到这一点 如果这是一个愚蠢的问题 感谢您的任何建
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • Bootstrap按钮加载+Ajax

    我正在使用 Twitter Bootstrap 的按钮加载状态 http twitter github com bootstrap javascript html buttons http twitter github com bootst
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 使用 postgres 和 node js 在单个语句中执行多个查询

    我需要在像这样的单个语句中执行插入和删除查询 INSERT INTO COMPANY ID NAME VALUES 1 Paul DELETE FROM COMPANY WHERE ID 12 这是我用于执行查询的 node js 代码 p
  • 如何用另一个响应替换窗口的 URL 哈希?

    我正在尝试使用替换方法更改哈希 URL document location hash 但它不起作用 function var anchor document location hash this returns me a string va
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev

随机推荐

  • GetClientCertificate 使用什么主题?

    我正在尝试发送请求 ActiveXObject WinHttp WinHttpRequest 5 1 但是 这需要客户端证书才能执行此操作 我们已提供该证书 在 PHP cURL 中进行测试后 我可以这样做 curl setopt SOAP
  • 将 url 重定向到带有尾随点的主页

    Google 网站管理员显示一些重复的网址 他们是 www abc com index php option com toys view detail n id 148 ite www abc com index php option co
  • 用于从链接中选择文本的 xpath 表达式

    我有这样的html文件内容 a class bf title Link to book href book 229920 book name a 帮我构造 xpath 表达式来获取链接文本 书名 我尝试使用 a 但表达式计算时没有结果 如果
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • 在不同的活动上显示 OnItemClickListener 的结果

    我使用 OnItemClickListener 从列表视图中选择一个项目 如下所示 listView setTextFilterEnabled true final TextView disp TextView findViewById R
  • 如何从 Bootstrap CSS 的下拉列表中删除箭头?

    我正在尝试删除 Twitter Bootstrap 框架中下拉菜单中出现的箭头 有没有人想出去除箭头的方法 从链接中删除插入符类会从导航栏中删除箭头 dropdown menu before dropdown menu after bord
  • 氧图。如何将轴旁边的值格式从 1000 更改为 1k

    我正在尝试更改轴旁边的值的格式 例如从 1000 更改为 1k 或 1000000 更改为 1M 这在 LinearAxis 中可能吗 这是我的代码 m Axes Add new LinearAxis Position AxisPositi
  • 使用强制转换的可变访问器安全吗?

    我试图理解重复代码的问题 and mut在 getter 类型的函数中 我试图了解这个问题的特定解决方案是否使用内部的强制转换unsafe块将是安全的 以下是该问题的示例 它取自非常好的教程 使用太多的链表学习 Rust https rus
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • 覆盖 Bootstrap 表格边框折叠样式

    引导程序有一个table border collapse collapse border spacing 0 风格 我想覆盖它 所以我创建了一个类并将其应用到有问题的表 table FormGroupContainer border col
  • Puppeteer 错误 错误:等待选择器超时

    目前我有一个网站 其 HTML 中有此内容 我通过检查chrome开发者工具中的元素确认了这一点 div class hdp photo carousel div class photo tile photo tile large 我直观地
  • 支持 IE 中的“border-radius”

    有谁知道 Internet Explorer 是否 何时支持 border radius CSS 属性 是的 2011 年 1 月 IE9 发布时 假设您希望所有四个边均为 15px myclass border style solid b
  • 使用 rpy2 将 NULL 从 Python 转换为 R

    在 R 中经常NULL值用作默认值 使用 Python 和 RPy2 如何显式提供NULL争论 None不可兑换 NotImplementedError 字符串 NULL 只会被转换为字符串 并在执行过程中导致错误 采取以下示例 使用tsi
  • Matplotlib - 使用 plt.imshow() 时序列关闭

    我在 Jupyter 笔记本中编写了一个狗分类器 每次在图像中检测到狗时 它都应该显示该图像并打印一些描述该图像的文本 不知何故 无论我按什么顺序放置 图像总是在打印所有文本后显示plt imshow and print 有谁知道为什么会这
  • 使用 CodeIgniter 中的模板自定义错误页面

    我正在使用 CodeIgniter 的模板库 http williamsconcepts com ci codeigniter libraries template reference html http williamsconcepts
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • 将数据类型 varchar 转换为 int 时出错

    我试图使用基于 varchar 类型的 Name 列的输入值的存储过程返回 item 表的 ItemId 列值 但是每当我将任何值传递给存储过程时 它都会返回一个错误 将数据类型 varchar 转换为 int 时出错 create pro
  • Firebase 分析和 GTM 跟踪

    这个问题是关于为什么 Google Analytics Firebase 需要 GTM 关于这个问题有一个类似的帖子 但它与HOW https stackoverflow com questions 39636030 how does th
  • 使用正确的时区将 ICS 导入 Google 日历

    我正在尝试将一个简单的 ics 文件导入 Google 日历 但是 即使我指定了时区 Google 日历仍然会导入错误的事件时间 尽管它确实说错误的时间位于正确的时区 这是我的 ics 文件的示例 BEGIN VCALENDAR BEGIN
  • 降低 Nodejs 服务器上的 CPU 利用率

    我正在研究降低 CPU 利用率的有趣方法 在 NodeJS 服务器上 在我的研究过程中 我发现了以下文章 http engineering linkedin com nodejs blazing fast nodejs 10 perform