由于其事件驱动和异步特性,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功能
并非所有浏览器都支持对集合的不同操作,例如map
, reduce
和forEach
。 为了克服浏览器兼容性问题,我们在前端使用了一些客户端库。 但是使用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/