`
faylai
  • 浏览: 78968 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

让nodejs 快如风的十个小技巧

阅读更多

英文原文连接

 

1、避免使用同步的方法

 

nodejs 是基于单线程。为了让单线程能够处理高并发的请求,我们尽量要避免让线程等待,阻塞,同步,和长时间运行某项操作。nodejs 一个显著的特点就是彻头彻尾的异步。这个特性在基于事件驱动的应用上表现的非常的出色。

 

不幸的是在nodejs 中仍然存在可以同步或者阻塞调用方法。例如,许多的文件系统操作既有异步的方法也有同步的方法,像 fs.writeFile 和 fs.writeFileSync。尽管你避免在代码中使用同步的方法,但你引用的外部库中可能包含致使阻塞的方法调用。一旦这种情况出现,将会对性能产生显著的影响。

 

// 正确写法: 异步的写文件
fs.writeFile('message.txt', 'Hello Node', function (err) {
console.log("It's saved and the server remains responsive!");
});
// 音响性能的写法: 同步的写文件
fs.writeFileSync('message.txt', 'Hello Node');
console.log("It's saved, but you just blocked ALL requests!");
2、关闭 socket 连接池

nodejs http client 自动使用socket 连接池,默认情况下每个主机将socket per 限制到五个。当socket 被回收重用后资源的增长将会无法控制,特别是你要处理从同一主机发送大量并发请求数据时候将会导致严重的性能瓶颈。这种情况下,最好的解决办法是增加 maxSockets 或者禁用 socket 连接池:

 

var http = require('http');
var options = {.....};
options.agent = false;
var req = http.request(options)
3、不要用nodejs 来管理静态资源
静态资源像css文化和图片文件,可以使用其他的web服务器来管理,比如 nginx ,或者你把你的文件上传到CDNs.
这样做有两个好处:(1)减少nodejs 的负载(2)CDNs可选择最近的服务器然投递静态内容减少了传输延迟。
4、渲染放到客户端
让我们快速比较下页面在服务端渲染和客户端渲染区别。如果我们用nodejs 渲染,每次请求我们返回的html如下:
<html>
<head>
<title>LinkedIn Mobile</title>
</head>
<body>
<div class="header">
<img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>
</div>
<div class="body">
Hello John!
</div>
</body>
</html>
显然的除了用户的名字是动态,其他都是静态。也就是说相同东西每次都要加载一遍。更有效的方法就是直接让
nodejs 返回动态的json数据:
{"name": "John"}
剩下的静态标签可以使用javascript 模版引擎
<html>
<head>
<title>LinkedIn Mobile</title>
</head>
<body>
<div class="header">
<img src="http://mobile-cdn.linkedin.com/images/linkedin.png" alt="LinkedIn"/>
</div>
<div class="body">
Hello <%= name %>!
</div>
</body>
</html>
静态javascript 模版可以用nginx 代理,其实如果放到CDN就更好了。
另外你可以在模版第一次时保存到浏览器缓存中或者存放到 本地存储中。之后页面初始化完毕,
就剩下动态的json数据 的交互。大大减小了cpu 时间和io 负载。

5、开启gzip
越来越多的web服务器和客户端支持gzip 压缩。
这个好处真的不要放过哦,不管是响应客户端或者请求服务都可以采用。
6、使用并行
试着把请求远程服务,数据库调用,文件系统访问这些操作并行起来运行。如果按照线性的步骤来运行这些费时
的操作延迟总量等于每个操作延时总和。推荐使用Step 来管理你的callback 流程。
7、尽量不要使用session
Express framework 管理request/response 的生命周期,许多 express 的例子包含下面的配置:
app.use(express.session({ secret: "keyboard cat" }));
默认情况下,seesion 是存储在内存中的,这个会增加服务器的额外开销,特别用户量增加时候。
你可以把session 存储到数据库,例如MongoDB 或者Redis ,
但是每个请求的都会从数据库查询session 信息这样也增加了额外的性能开销。
如果可以,最好的选择不要在服务端存储状态信息。express 中没这样的配置,但是性能提升是显然。
8、使用二进制模块
如果可以,使二进制模块来取代javascript 的模块,
例如当我们从用javascript 写SHA 的模块切换到编译成二进制模块时,我们发现很大性能提升空间。
// 使用本地内置的二进制模块
var crypto = require('crypto');
var hash = crypto.createHmac("sha1",key).update(signatureBase).digest("base64");
9、使用标准v8 javascript 而不是客户端库
许多的javacript 库专门用于web浏览器,
这些浏览器的javascript 引擎不一致:有些浏览器支持某些方法像 forEach,map 和reduce,
但是其他的浏览器没有这些方法。
结果导致,客户端库含有许多有损性能的代码来保证方法的兼容。
话说回来,你要准确的知道nodejs 哪些方法是可以用的:nodejs 使用v8 引擎 ,v8 实现了 ECMA-262, 5th edition. 直接使用v8标准函数将会获得大的性能提升。

10、 保持代码简洁

保持的你的代码的清洁不管是客户端或者服务端。不断的审视自己:"我们真需要这个模块吗?","为什么需要这个框架","性能的消耗值得吗?","是否有更简单的方法?"。简洁的代码往往更加的高效。

分享到:
评论

相关推荐

    基于nodejs的西餐外卖系统和微信小程序源码

    基于nodejs的西餐外卖系统和微信小程序源码基于nodejs的西餐外卖系统和微信小程序源码基于nodejs的西餐外卖系统和微信小程序源码基于nodejs的西餐外卖系统和微信小程序源码基于nodejs的西餐外卖系统和微信小程序源码...

    基于Nodejs为后端的微信小程序授权登录的探究与实现.zip

    基于Nodejs为后端的微信小程序授权登录的探究与实现

    nodejs10latest版本

    nodejs10第一个长期支持版10.13版

    nodejs 小代码,实现图片上传

    nodejs的一个小代码,使用nodejs代码实现图片的上传

    NodeJS 安装包

    NodeJS 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程,极大地推动了全栈开发的流行。NodeJS 的设计思想是事件驱动、非阻塞 I/O 模型,这使得它在处理高并发...

    nodejs.pdf nodejs初级教程 nodejs初级教程

    nodejs初级教程

    微信小程序+Nodejs项目实战合集

    微信小程序+Nodejs项目实战合集 内含两套完整实战教你全为了解一个小程序的开发流程及步骤

    NodeJS中文文档精编.pdf 全文免费

    NodeJS 实际上是对 ES 标准的一个实现,同时 Node 也是一个 JS 引擎。 Node 只对 ES 标准进行了实现,所以在 NodeJS 中不包含 DOM 和 BOM,当然也不能操作 DOM 和 BOM。 NodeJS 的特点是单线程的,传统的服务器都...

    一个用NodeJS实现的FtpServce

    一个用NodeJS实现的Ftp Servce

    NodeJS学习笔记和代码

    这个"NodeJS学习笔记和代码"的压缩包显然包含了帮助初学者掌握NodeJS基础知识和实践技能的所有必要资料。 首先,`NodeJS第1天笔记.docx`很可能是对NodeJS基础概念的介绍,包括但不限于以下几点: 1. **事件驱动...

    nodejs14.9.0

    nodejs14.9.0

    进阶之初探nodeJS

    今儿,再次看了该篇随笔,发现该随笔理论知识稍多,适合初级入门node,固萌生一个想法–想在该篇随笔中,通过一步步编写一个稍大一点的node示例,让我们在整体上更加全面地了解node。 so,该篇随笔是建立在”初探...

    NodeJS开发指南_nodejs开发指南_

    2. 第一个NodeJS程序:通常,NodeJS程序始于一个`.js`文件,通过`console.log()`输出信息。例如: ```javascript console.log('Hello, World!'); ``` 二、模块系统 NodeJS采用CommonJS规范,支持模块化开发。`...

    NodeJS示例

    NodeJS 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者在服务器端使用 JavaScript 进行编程,极大地提升了开发效率。在 Windows 环境下配置和使用 NodeJS,主要涉及以下几个步骤: 一、安装 ...

    nodejs:NodeJS示例项目

    节点js NodeJS示例项目

    nodejs视频教程百度网盘

    nodejs视频教程,可以快速帮助你入门nodejs开发中,nodejs不错哦

    NodeJS整理手册文档

    本"NodeJS整理手册文档"旨在为对NodeJS感兴趣的朋友们提供一个全面、详尽的学习资源,涵盖了NodeJS的基础知识、核心特性以及实践案例。 一、NodeJS基础 NodeJS的基础知识包括安装与环境配置、模块系统、事件驱动...

    Nodejs基础知识

    在Nodejs中写一个模块的流程:1 创建模块,也就是一个入口的js文件,里面加入一些特定的功能,teacher.js.2 导出模块,把这个功能和这个文件也就是这个模块名建立关系 exports.add = function() {}3 加载模块,在...

    NodeJS API文档

    NodeJS API文档。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、...

    一个NodeJS和redis做的基于http协议的队列

    一个NodeJS和redis做的基于http协议使用的队列 做了点小修改 支持多个队列和post提交 原github地址:https: github com lnmp nodemq 使用方法: 在安装好redis和nodejs后 配置config js 执行: $ node index js ...

Global site tag (gtag.js) - Google Analytics