前言早期的Nodejs开发者使用了几种“工具”来实现程序同步,比如callbacks、promises、co或者generators。我记得写了一个递归删除目录中文件和文件夹的请求。用上面的方法就是各种不爽(关键是干脆写个递归)。就在几天前,Nodejs发布了v7.6.0版本。Nodejs开发人员终于可以在不需要异步的地方使用async和await,而无需使用第三方模块来保持他们的程序同步。Nodejsv7.6.0发布后不久,koa的作者也正式发布了koa2。一句话总结:使用async和await极大的解放了生产力,减少了脑细胞的消耗。因为之前用koa做一个小项目,想着升级一下,优化一下网络请求。1、升级koa2.x和相关的koa依赖,因为koa1.x和koa2.x的区别比较大。大多数中间件目前都与koa2.x兼容。没有兼容的中间件,koa2.x本身也提供了兼容的方法(后面会讲到用法)。升级方法也很简单,就是对每个中间件执行:yarnaddkoa-xxxxx@next升级到最新版本;以下是项目依赖的所有中间件,都已经升级支持koa2。"koa-bodyparser":"^3.2.0","koa-compress":"^2.0.0","koa-convert":"^1.2.0","koa-router":"^7.0.1","koa-static":"^3.0.0","koa-static-cache":"^4.0.0","koa-views":"^5.2.1",2。forkoa2.xFeaturesRefactortheprojectkoa1.x的特点是使用genetator来控制项目的同步,而koa2.x最大的特点是使用async和awaitgenerator:myRouter.get('/',function*(){letbody;letpeopleList=configParams.onDutyPeople();body=yieldrender('index',{'peopleList':peopleList});this.body=body;this.type='text/html;字符集=utf-8';});awaitrouter.get('/',async(ctx,next)=>{letpeopleList=configParams.onDutyPeople();awaitctx.render('index.jade',{'peopleList':peopleList});ctx.type='text/html;charset=utf-8';})3.不兼容koa2.x的中间件怎么办在做网络优化的时候,一个中间件koa-static-使用缓存。这个中间件目前不兼容koa2.x,那么在koa2.x中如何使用呢?运行时报错如下:通过网络查询原因如下:解决方法如下,使用koa-convert中间件对生成器进行转换,使用方法如下:constconvert=require('koa-转变');conststaticCache=require('koa-static-cache');//静态文件服务app.use(convert(staticCache(path.join(__dirname,'public'),{maxAge:365*24*60*60})));for代码重构是这样的。在需要使用promises来控制异步的地方,可以用async和await代替,降低代码的复杂度。二是对不支持koa2.x的中间件使用koa-convert来兼容。4、网络请求的优化从下图可以看出,页面在加载过程中请求了多个静态文件。这无疑会影响页面的加载速度。从打开页面到页面加载完成一共耗时2.59s,那么如何优化呢?其实就是借用了please的fis来压缩合并静态文件。让页面在加载过程中需要多个静态文件,并且只请求两个静态文件。最终优化的结果是页面加载只用了1.76s,比之前快了将近1s。效果还是很明显的。当我观察这些网络请求时,我发现了一个问题。我每次刷新页面或者关闭浏览器重新打开页面,浏览器都不会使用本地缓存文件,而是重新向服务器发送请求,下载需要的静态文件。看下面截图:5、让浏览器使用本地缓存文件也很简单,就是使用koa中间件koa-static-cache来控制服务器的静态文件缓存在客户列表中。//静态文件服务app.use(convert(staticCache(path.join(__dirname,'public'),{maxAge:365*24*60*60})));看看有没有效果?看下面的截图(我多刷了几下页面):和之前的截图相比,可以明显的发现静态文件的下载时间缩短了。页面加载时间变为1.44s。它仍然比以前短。在大小列中,您将看到诸如来自内存缓存和来自磁盘缓存的字段。而不是显示具体的文件大小。这里的区别请看文末参考文章。6、压缩“文件”资源在大多数情况下,我们的网站不仅存储文本,还包含一些其他类型的文件,如图片、mp3等。我们知道浏览器支持加载gzip压缩的网页,所以静态文件服务器以nginx为代表,默认会开启gzip压缩。那么我们的Nodejs服务可以压缩资源文件吗?答案是肯定的。Koa的作者写了一个中间件compress,支持压缩请求的响应。具体用法如下:varcompress=require('koa-compress')varKoa=require('koa')varapp=newKoa()app.use(compress({filter:function(content_type){//配置要过滤的压缩文件类型return/text/i.test(content_type)},threshold:2048,//要压缩的最小响应字节数flush:require('zlib').Z_SYNC_FLUSH//同步刷新缓冲数据;}))因为当前项目中没有涨价幅度较大的文件,所以项目中没有使用这个中间件。这里只介绍koa有中间件提供这样的能力供开发者使用。7、如何维护一个稳定的nodejs服务像nodeapp.js这样维护在线服务肯定是不行的。因为端口可能在不知情的情况下被linuxkill掉了。目前业界广泛使用pm2来维护nodejs服务。提供强大的日志、端口kill后自动重启、性能监控等功能。7.1收集系统日志使用pm2启动Nodejs进程后,默认会将代码中运行异常的错误和标准输出日志(如console.log)发送到以下目录。7.2进程信息提供运行时相关信息;7.3性能监控提供了内存监控和cpu监控的命令。总结:在大部分后端工程师眼里,FE一直扮演着切分页面,用js写“特效”的角色。这就是为什么他们被称为“pageboy”的原因。这就是为什么FE是一个容易出现职业瓶颈的行业。由于基于Nodejs的前后端开发模式在业界得到越来越多的实践,前端工程师在其中扮演着重要的角色。从以上内容可以看出,使用Nodejs后,前端技术栈虽然获得了机房,但个人对FE的素质要求也会有所提升。性能优化,网络请求优化,都是前端工程师需要面对的问题。因为我们会在服务器端成为用户发起的网络请求的第一层接受者,所以我们也会面临网络安全问题。参考资料:KoaDocumentationKoa2EntryMisconfigurationGap:200OK(FROMCACHE)and304NOTMODIFIEDHTTP缓存技术,304(NotModified)和200(fromcache)有什么区别?
