Node.js让您的 Node.js 应用跑得更快的 10 个技术

Node.js
收益于它的事件驱动和异步的特性,已经连忙了。可是,在现代网络中只是快是老大的。假如您打算用
Node.js 开发你的下一个Web
应用的话,那么你就应有无所不用其极,让您的运用更快,非凡的快。本文将介绍
10 条,经过查实得知可大大提升 Node
应用的技术。废话不多说,让我们一一来看望。

1. 并行

始建 Web 应用的时候,你或许要反复调用内部 API
来得到各个数码。比如说,假诺在 Dashboard
页面上,你要推行下边这些调用:
  用户信息 -getUserProfile().
  当前活动 -getRecentActivity().
  订阅内容 -getSubscriptions().
  布告内容 -getNotifications().
  为了拿到这么些音讯,你应当会为各样方法创制独立的中间件,然后将它们链接到
Dashboard
路由上。可是问题是,这些点子的执行是线性的,上一个没竣工往日下一个不会初始。可行解决案是互相调用它们。
  如你所知由于异步性,Node.js
卓殊擅长并行调用两个模式。我们不可能暴殄天物。我下边提到的这么些方法没有借助,所以我们得以并行执行它们。这样咱们可以减小中间件数量,大幅提升速度。
  我们可以用 async.js 来处理相互,它是一个专程用来调教 JavaScript
异步的 Node 模块。上边代码演示如何用 async.js 并行调用四个方法的:

function runInParallel() {
  async.parallel([
    getUserProfile,
    getRecentActivity,
    getSubscriptions,
    getNotifications
  ], function(err, results) {
    //This callback runs when all the functions complete
  });
}

假设您想更透彻摸底 async.js ,请移步它的 GitHub 页面。

2. 异步

按照计划 Node.js
是单线程的。基于那点,同步代码会杜绝一切应用。比如说,多数的文件系统 API
都有它们的同台版本。下边代码演示了文件读取的共同和异步两种操作:

// Asynchronous
fs.readFile('file.txt', function(err, buffer) {
  var content = buffer.toString();
});
// Synchronous
var content = fs.readFileSync('file.txt').toString();

不过只要你执行这种长日子的围堵操作,主线程就会被堵塞到这一个操作完成收尾。这大大降低你利用的性质。所以,最好保证您的代码里用的都是异步版本
API,最起码你应该在性质节点异步。而且,你在选拔第三方模块的时候也要很小心。因为当你想法把同步操作从你代码中删除之后,一个表面库的协同调用会让你前功尽弃,降低你的使用性能。

3. 缓存

若果你用到部分不日常转移的数目,你应该把它们缓存起来,改革性能。比如说,下面的代码是收获最新帖子并出示的例证:

var router = express.Router();
router.route('/latestPosts').get(function(req, res) {
  Post.getLatest(function(err, posts) {
    if (err) {
      throw err;
    }
    res.render('posts', { posts: posts });
  });
});

假诺您不平时发贴的话,你可以把帖子列表缓存起来,然后一段时间之后再把它们清理掉。比如,大家可以用
Redis 模块来达到这一个目标。当然,你不可能不在你的服务器上装
Redis。然后你可以用叫做 node_redis
的客户端来保存键/值对。下面的事例演示大家怎么缓存帖子:

var redis = require('redis'),
    client = redis.createClient(null, null, { detect_buffers: true }),
    router = express.Router();
router.route('/latestPosts').get(function(req,res){
  client.get('posts', function (err, posts) {
    if (posts) {
      return res.render('posts', { posts: JSON.parse(posts) });
    }
    Post.getLatest(function(err, posts) {
      if (err) {
        throw err;
      }
      client.set('posts', JSON.stringify(posts));    
      res.render('posts', { posts: posts });
    });
  });
});

见状了呢,我们率先检查 Redis
缓存,看看是不是有帖子。假诺有,大家从缓存中拿那个帖子列表。否则大家就摸索数据库内容,然后把结果缓存。其它,一定时间将来,我们得以清理
Redis 缓存,这样就可以改进内容了。

4. gzip 压缩

打开 gzip 压缩对您的 Web 应用会发出巨大影响。当一个 gzip
压缩浏览器请求某些资源的时候,服务器会在响应重返给浏览器往日举行削减。尽管您绝不
gzip 压缩你的静态资源,浏览器得到它们或者会花费更长日子。
  在 Express 应用中,我们得以用内建 express.static()中间件来处理静态内容。其余,仍可以用 compression
中间件压缩和处理静态内容。下面是应用例:

var compression = require('compression');
app.use(compression()); //use compression 
app.use(express.static(path.join(__dirname, 'public')));

5. 倘使得以,在用客户端渲染

今昔有超多效率强大的客户端 MVC/MVVM 框架,比如说 AngularJS, Ember,
Meteor, 等等,构建一个单页面应用变得非常简单。基本上,你一旦公开一个
API,再次回到 JSON
响应给客户端就可以了,而不需要在服务端渲染页面。在客户端,你能够用框架来社团JSON 然后把它们显示在 UI 上。服务端只发送 JSON
响应得以节约带宽,改进性能,因为你不需要在每个响应里面都回来布局标记了,对吧,你只需要再次回到纯
JSON,然后在客户端渲染它们。
  看下我的这么些课程,它是关于什么用 Express 4 公开一个 RESTful
APIs的。我还写了另一篇教程,演示了怎么样把那些 APIs 和 AngularJS
结合起来。

6. 绝不在 Sessions 存储太多多少

出色的 Express 页面应用, Session
数据默认是保存在内存中的。当你把太多数据保存在 Session
的时候,会促成服务器开销显然增大。所以,要么你切换来其余储存方法来保存
Session 数据,要么尽量减弱存储在 Session 中的数据量。
  比如说,当用户登录到你的利用的时候,你可以只在 Session 中保存他们的
ID 而不是漫天用户数量对象。还有,对于这几个你可知从 id
得到目的的询问,你应当会喜欢用 MongoDB 或者 Redis 来囤积 session 数据。

7. 优化查询

Node.js,若果你有个博客,你要在主页上出示最新帖子。你恐怕会通过 Mongoose
这样取多少:

Post.find().limit(10).exec(function(err, posts) {
  //send posts to client
});

然而问题是 Mongoose 的 find()方法会把指标的有着字段都询问出来,而许多字段在主页上并不要求。比如说,commentsis
保存的是特定帖子的过来。我们不需要出示小说回复,所以我们可以在查询的时候把它给删除掉。这毋庸置疑会增高速度。可以像这样优化方面那条查询:

Post.find().limit(10).exclude('comments').exec(function(err, posts) {
  //send posts to client
});

8. 用规范的 V8 方法

聚拢上的一对操作,比如 map,reduce,和 forEach
不肯定协理具备浏览器。我们可以通过前台的库解决部分浏览器兼容性问题。但对此
Node.js,你要得当知道 Google 的 V8 JavaScript
引擎辅助什么操作。这样,你就足以在服务端直接用这些内建办法来操作集合了。

9. 在 Node 前面用 Nginx

Nginx 是个微小型轻量 Web 服务器,用它可以下降您的 Node.js
服务器的载荷。你可以把静态资源配置到 nginx 上,而不是在 Node
上。你可以在 nginx 上用 gzip
压缩响应,让具备的响应都变得更小。所以,假设您有个正在营运的制品,我认为你应当会想用
nginx 来立异运行速度的。

10. 打包 JavaScript

最终,你还足以大大提升页面使用速度,通过把五个 JS
文件打包。当浏览器在页面渲染中境遇 <script>
元素的时候会被堵塞,直到拿到那些本子才继续运行(除非设置了异步属性)。比如,假使你的页面有多少个JavaScript 文件,浏览器会发出四个单身的 HTTP
请求来获取他们。假如把这四个公文收缩打包成一个,全部性能将得以大幅升级。CSS
文件也是同样。你可以用诸如 Grunt/Gulp 这样的编译工具来打包你的资源文件。

结论

地点 10 条技巧自然可以增进你的 Web
应用的速度的。但是,我了然还有改革和优化的空中。假使您有任何立异性能的技艺的话,在苏醒里告诉自己。