Node.js已经很快了,这要归功于它的事件驱动和异步特性。但在现代网络中,仅仅速度是不够的。如果您打算使用Node.js开发您的下一个Web应用程序,那么您应该尽一切努力使您的应用程序更快,快得令人难以置信。本文将介绍10个经过测试的技巧,它们可以极大地改进Node应用程序。话不多说,下面我们一一来看。1.并行创建Web应用时,可能需要多次调用内部API获取各种数据。例如,假设在Dashboard页面,你想执行如下调用:用户信息-getUserProfile()。当前活动-getRecentActivity()。订阅内容-getSubscriptions()。通知内容-getNotifications()。信息,您应该为每个方法创建单独的中间件,然后将它们链接到Dashboard路由。但问题是这些方法的执行是线性的,直到上一个结束才会开始下一个。一个可行的解决方案是并行调用它们。如您所知,由于异步特性,Node.js非常擅长并行调用多个方法。我们不能鲁莽。我上面提到的那些方法没有依赖关系,所以我们可以并行执行它们。这样我们就可以减少中间件的数量,大大提高速度。我们可以使用async.js处理并行性,async.js是一个旨在异步调整JavaScript的Node模块。以下代码演示了如何使用async.js并行调用多个方法:如果您想了解更多关于async.js的信息,请访问其GitHub页面。2.异步Node.js在设计上是单线程的。此时,同步代码可以阻塞整个应用程序。例如,大多数文件系统API都有它们的同步对应物。下面的代码演示了文件读取的同步和异步操作//Asynchronousfs.readFile('file.txt',function(err,buffer){varcontent=buffer.toString();});//同步varcontent=fs.readFileSync('file.txt').toString();但是如果你执行那种长时间阻塞的操作,主线程就会被阻塞,直到这些操作完成。这大大降低了应用程序的性能。因此,最好确保在代码中使用异步版本的API,至少在性能节点中应该是异步的。另外,在选择第三方模块时必须小心。因为当您尝试从您的代码中删除同步操作时,来自外部库的同步调用将浪费您之前的所有努力并降低您的应用程序性能。3.缓存如果你使用一些不经常变化的数据,你应该缓存它们以提高性能。例如,以下代码是获取最新帖子并显示它的示例:varrouter=express.Router();router.route('/latestPosts').get(function(req,res){Post.getLatest(function(err,posts){if(err){throwerr;}res.render('posts',{posts:posts});});});如果不经常发帖,可以缓存发帖列表,过段时间再清理。例如,我们可以为此目的使用Redis模块。当然,你的服务器上必须安装了Redis。然后您可以使用名为node_redis的客户端存储键/值对。以下示例演示了我们如何缓存帖子:varredis=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){returnres.render('posts',{posts:JSON.parse(posts)});}Post.getLatest(function(err,posts){if(err){throwerr;}client.set('posts',JSON.stringify(posts));res.render('posts',{posts:posts});});});});看,我们先查看Redis缓存,看看有没有帖子。如果是这样,我们从缓存中获取帖子列表。否则我们检索数据库内容并缓存结果。另外,在一定时间后,我们可以清除Redis缓存,以便更新内容。4.gzip压缩启用gzip压缩会对您的Web应用程序产生巨大的影响。当gzip浏览器请求某些资源时,服务器会在将响应返回给浏览器之前对其进行压缩。如果您不对静态资源进行gzip压缩,浏览器获取它们的时间可能会更长。在Express应用中,我们可以使用内置的express.static()中间件来处理静态内容。此外,可以使用压缩中间件压缩和处理静态内容。以下是一个用法示例:varcompression=require('compression');app.use(compression());//使用压缩app.use(express.static(path.join(__dirname,'public')));5.IfYes,有了客户端渲染,现在已经有了功能超强的客户端MVC/MVVM框架,比如AngularJS、Ember、Meteor等,构建单页应用非常容易。基本上,您只需公开一个API并向客户端返回一个JSON响应,而无需在服务器上呈现页面。在客户端,您可以使用框架来组织JSON并将它们显示在UI上。仅从服务器发送JSON响应可以节省带宽并提高性能,因为您不需要在每个响应中返回布局标记,对,您只需返回纯JSON并在客户端呈现它们。查看我的这篇教程,了解如何使用Express4公开RESTfulAPI。我还写了另一篇教程,展示如何将这些API与AngularJS结合。6、不要在Session中存放过多数据在典型的Express页面应用中,Session数据默认存放在内存中。当你在Session中保存过多的数据时,会造成服务器开销的显着增加。所以,要么换一种存储方式来保存Session数据,要么尽量减少Session中存储的数据量。例如,当用户登录到您的应用程序时,您可以在Session中只存储他们的ID而不是整个用户数据对象。此外,对于可以通过ID获取对象的查询,您可能喜欢使用MongoDB或Redis来存储会话数据。7.优化查询假设你有一个博客,你想在主页上显示最新的帖子。您可以像这样通过Mongoose获取数据:Post.find().limit(10).exec(function(err,posts){//sendpoststoclient});但是问题是Mongoose的find()方法会把对象的所有字段都查询出来,而很多字段在首页是不需要的。例如,commentsis包含对特定帖子的回复。我们不需要显示文章回复,因此我们可以将它们从查询中排除。这无疑会提高速度。上面的查询可以这样优化:Post.find().limit(10).exclude('comments').exec(function(err,posts){//sendpoststoclient});8.使用标准的V8方法集合一些操作,例如map、reduce和forEach可能不支持所有浏览器。我们可以通过前端库来解决一些浏览器的兼容性问题。但是对于Node.js,您需要确切地知道Google的V8JavaScript引擎支持哪些操作。这样就可以直接使用这些内置的方法在服务器端操作集合。9.在Node之前使用NginxNginx是一个小巧轻便的Web服务器,可以减少Node.js服务器的负载。你可以在nginx而不是Node上配置静态资源。您可以在nginx上gzip响应以使所有响应更小。所以,如果你有一个正在运行的产品,我想你会想要使用nginx来提高速度。10、捆绑JavaScript最后,你还可以通过捆绑多个JS文件来大大提高页面应用速度。当浏览器在页面渲染过程中遇到
