作者:黄丹华,腾讯公司前端高级工程师,爱好Node.js研究开发,并基于自己的学习写一些心得体会,同时喜欢基于自己的一些所见所闻写一些互联网思考的博文。2011年进入腾讯做前端开发,现在主要是基于PHP做一些应用接入层的工作。在2014年出版处女作书籍《Node.js开发实战详解》一书。
责编:陈秋歌,关注前端开发领域,寻求报道或者投稿请发邮件chenqg#csdn.net。
前端技术总是千变万化,前一刻还适应着React的开发,后一步又出现了Vue.js,而在我的脑海里还停留在Bootstrap。在这变化万千的过程中,你是否去探索过这些新技术的未知领域呢?本文主要是介绍,我在探索一门未知领域的技术,是如何从0到1,将未知的技术最终应用到项目中,这其中遇到了哪些阻力,又带给了我多少编程的快乐和惊喜。
初识Node.js
曾经我在校园时期写过一个功能——实时聊天,这个功能是用PHP写的,当我写出来的那一刻,我真的为我自己自豪,自豪的是我完成了一个自己非常喜欢的功能。后来我把这个挂在内网,让学校的很多同学一起进来聊天,带给了我很多乐趣。不过这个过程是痛苦和复杂的,当时使用的是轮询的方式调用服务端,后来偶尔的一天忽然让我了解到了Node.js。根据Node.js的Demo,我很快就实现了一个简易的聊天室。这让我非常惊讶,同时也让我对Node.js产生了比较大的兴趣,从此开始了我的Node.js学习之旅。
兴趣和爱好也许是驱动我学习这么技术的很大动力,我开始寻找Node.js的学习资料,但令我惊讶的是没有任何文章任何教材引导初学者入门,摆在我面前的只有三份资料,一份是Node.js API,一份是Node.js 40多页的初级入门教材以及一个简单的聊天室Demo。当时我有点沮丧,也有点觉得困难较大花费时间较多,有点不想前行的想法。有一天我看到了一句话:“千淘万漉虽辛苦,吹尽黄沙始到金”。既然国内学习资源这么匮乏,为何我不去实践,通过更多的个人实践学习,将这些学习实践的方法和过程进行总结,然后分享给别人。既然认识到这点,我就开始了对Node.js的探索和学习。
Node.js深入实践 从打造框架开始
在实践之前先定一个目标,可以定一个功能,一个游戏或者一个改善现有的解决方案,例如通过React来优化我们的一个项目功能。而我的目标是实现一个框架,希望这个框架能够更好的帮助入门学习者更快地接触Node.js开发,当然也希望这个框架能够被广泛的应用到Node.js项目中去。既然选择了框架,就去了解一个框架应该包含哪些基础的要素,其他技术的框架又是如何去实现的。带着这些问题,我开始学习之路,学习过程当然是曲折而且比较困难的,其中遇到了不少问题,这里就简单说一下,我遇到的几个,就从这几个例子中来介绍一下我个人的一些经验和方法。
面向对象,当时的设计思想就是希望能够使用面向对象的方式开发一个Node.js框架。由于在ES6特性之前,JavaScript的语言是面向函数式编程,基本都没有类的概念,即使有也很弱,因此这其中也遇到了很多问题,包括如何进行继承,如何去申明。当然在JavaScript中还是有类的实现方法的,当时我就使用了组合继承的方法,也简单地实现了相应的功能。当然在JavaScript中强行使用面向对象的方式是比较困难的,但这个难题也解决了,后续ES6也加入了类的概念,从此我的框架就因为这个功能得到了非常大的改善,从这个角度说,当时我的想法确实让很多人不能够理解,但是现在我觉得面向对象的方式来做Node.js的框架确实也不是一种不可能的想法。这个过程是让我欣喜的,因为还没有任何框架是使用面向对象的方式来实现的,虽然我的想法比较蠢,但是从我的角度想,我在走一条比较特殊的路,虽然不知道终点在哪。
回调问题,因为在这之前一直都是同步等待的方式,而Node.js最大的优点就是异步调用。而作为初学者遇到的最大问题就是如何去实现异步调用,又如何解决异步回调深度的问题。在promise出现之前,我通过使用callback的封装方式尽量来解决这种异步回调深度的问题,当然其中也尝试了其他各种第三方库。最终在promise出来以后又进一步的优化了框架中缺陷,同时封装了基本的将callback转化为promise的方法,这也是一种快乐,可以说是突破了自己,将自我的想法通过实践得到了实现和验证。
路由调用,这其中也让我学到了很多路由的设计原则,而这个框架我则选择了自由路由,在这个过程中就遇到了一个比较困难的点,那就是动态调用,在Node.js中是没有涉及到任何动态调用类以及对象的,而这点则需要从JavaScript中去寻找,这也是我经过大量的实践尝试才实现出来的方法。这个过程同样是让我比较开心的,因为实现了这种动态调用的想法,将路由的请求参数转化为了类的对象和方法,也是一种从未有的尝试,通过自身的尝试得到了验证。
上面就解决了我框架的三个主要问题,就让我享受了很多编程的快乐,当然还包含了很多其他的功能。同样他们也让我的实践得到了结果,也让我从中获得了很多的快乐和惊喜,例如:如何在Node.js实现session管理、Node.js中静态文件的处理。当然通过这些总结出主要学习思路就是,先了解再到学习深入认识,最后再到应用,每个过程中都包含了大量的实践。而这些知识都是未知的,都是一种新的尝试,也正是经过这个过程,让我更深刻的了解Node.js的开发理念,也让我认识到开发框架的一些基础认识。当然最终让我开始慢慢的了解了Node.js,也让我总结了很多学习Node.js的宝贵资源,从而通过这些总结我绘制成了《Node.js开发实战详解》一书,虽然内容比较简单也不是很优质的内容,但是的确是我从入门到深入的一本总结沉淀内容。
Node.js技术应用
随着时间的推移,Node.js的版本也开始稳定了,而在学会了应用一门技术以后,就开始寻找一些志同道合的爱好者或者带领自己的团队成员一起来学会应用这门技术到项目中去。技术社区、QQ群或者微信群是一个比较好交流平台,通过这些平台我也学会了更多的知识,并且进一步的加深了我对这门技术的爱好。同时也让这门技术能够更适时宜的应用到了项目中,现在我们的团队也逐渐开始在服务端加强Node.js的应用。
在学习的过程中最重要的一点,那就是总结,学习和实践虽然过程很复杂,但是通过努力是肯定可以达到的,但是总结这点往往是很多学者忽略的问题,会因为无法下笔或者下笔觉得太浅,而不去总结。这个过程很多有比较大价值的知识就此默默的留在你一个人身上,又甚至随着时间而丢失。
从0到1固然比较困难,但是其中奋斗的历程是包含惊喜和快乐的。通过这篇文章,我希望更多的程序员能够去探索一些未知的领域,一些未知的可能,一些自己的思考方向,从中多加实践总结和分析出更多的经验沉淀,并且把这些经验沉淀在CSDN或者在其他的甚至自己的文集中,让更多的人去学习去交流,利用这些去创造更多的可能,让我们的程序员世界变的更加的充实和快乐。