加快Node.js Web应用速度的10条技巧

由于其事件驱动和异步特性,Node.js已经迅速发展起来。 但是,在现代网络中,仅仅保持速度还不够。 如果您打算使用Node.js开发下一个Web应用程序,则必须采取一切可能的步骤来确保您的应用程序比平时更快。 本文介绍了10个技巧,这些技巧可极大地提高您基于Node的Web应用的速度。 因此,让我们一一看一下。

1.并行运行

在构建Web应用程序时,有时您将需要进行多个内部API调用以获取各种数据。 例如,考虑一个用户仪表板。 渲染仪表板时,您可以执行以下假设调用:

  • 用户配置文件– getUserProfile()
  • 最近的活动– getRecentActivity()
  • 订阅– getSubscriptions()
  • 通知– getNotifications()

为了检索这些详细信息,您可以为每个功能创建一个单独的中间件,并将其附加到仪表板路线。 但是这种方法的问题在于,一个功能必须等待上一个功能完成。 另一种选择是并行执行这些调用。

众所周知,Node.js由于具有异步特性,因此在并行运行多个功能方面非常高效。 我们应该利用这一点。 由于我上面提到的功能不相互依赖,因此我们可以并行运行它们。 这将减少中间件的数量并大大提高速度。

为了并行化事物,我们可以使用async.js,这是一个Node模块,可以帮助处理异步JavaScript。 这是一个显示如何使用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 });
  });
});

如果您不经常发布博客文章,则可以缓存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缓存中。 如果是这样,我们从缓存中传递posts数组。 否则,我们将从数据库中检索内容,然后对其进行缓存。 同样,在一定间隔后,我们可以清除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等)的出现,创建单页应用程序变得非常容易。 基本上,而不是在服务器端进行渲染,您将仅公开将JSON响应发送到客户端的API。 在客户端,您可以使用框架来使用JSON并在UI上显示。 从服务器发送JSON可以节省带宽,从而提高速度,因为您不必随每个请求发送布局标记。 而是只发送普通的JSON,然后在客户端呈现。

看一下我的本教程该教程描述了如何使用Express 4公开RESTful API。我还写了另一篇教程 ,展示了如何使用AngularJS与这些API进行交互。

6.不要在会话中存储太多

在典型的Express Web应用程序中,默认情况下,会话数据存储在内存中。 当您在会话中存储太多数据时,它将为服务器增加大量开销。 因此,您可以切换到其他类型的存储来保留会话数据,或者尝试最小化会话中存储的数据量。

例如,当用户登录到您的应用程序时,您可以仅将其id存储在会话中,而不必存储整个对象。 随后,根据每个请求,您可以从id检索对象。 您可能还想使用MongoDB或Redis存储会话数据。

7.优化查询

假设您有一个博客应用程序,可在主页上显示最新帖子。 您可能会编写如下内容以使用Mongoose获取数据:

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

但是问题在于,Mongoose中的find()函数会获取对象的所有字段,并且Post对象中可能有几个字段在首页上不是必需的。 例如, comments就是这样一个字段,其中包含针对特定帖子的一组评论。 由于我们未显示评论,因此在获取时可能会排除它。 这肯定会提高速度。 我们可以使用以下内容优化上面的查询:

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

8.使用标准V8功能

并非所有浏览器都支持对集合的不同操作,例如mapreduceforEach 。 为了克服浏览器兼容性问题,我们在前端使用了一些客户端库。 但是使用Node.js,您可以确切知道Google的V8 JavaScript引擎支持哪些操作。 因此,您可以直接使用这些内置函数在服务器端操作集合。

9.在节点前面使用nginx

Nginx是一个纤巧轻巧的Web服务器,可用于减少Node.js服务器的负载。 您可以配置nginx来提供静态内容,而不是通过Node提供静态文件。 您也可以设置nginx来使用gzip压缩响应,以使整体响应较小。 因此,如果您正在运行生产应用程序,则可能需要使用nginx来提高速度。

10.缩小并连接JavaScript

最后,通过将多个JS文件缩小并串联在一起,可以极大地提高您的Web应用程序速度。 当浏览器遇到<script>元素时,页面呈现将被阻止,直到获取并执行脚本为止(除非设置了async属性)。 例如,如果您的页面包含五个JavaScript文件,则浏览器将发出五个单独的HTTP请求以提取这些请求。 通过将这五个文件缩小并串联在一起,可以极大地提高整体性能。 CSS文件也是如此。 您可以使用Grunt / Gulp之类的构建工具来最小化和连接资产文件。

结论

这10个技巧必定可以提高您的Web应用速度。 但是,我知道还有更多改进和优化的空间。 如果您有任何这样的性能改进技巧,请在评论中告诉我们。

谢谢阅读!

From: https://www.sitepoint.com/10-tips-make-node-js-web-app-faster/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值