本文技术软文,阅读需谨慎,长约 7000 字,通读需 5 分钟
大家好,我是 Scott,本文通过提供给大家学习的方法,以及我个人录制的一系列视频,帮助你更快更好的学习 Nodejs,了解前后端的 HTTP 知识,以及配置和使用阿里云 ECS 来部署你的 Nodejs 项目,成为那个具有争议的全栈开发工程师。
没有耐心阅读的同学,可以直接前往学习 全栈最后一公里。
先回答下被很多新入行同学经常问的问题,我从业 7 年,前 4 年在阿里巴巴做前端开发工程师,开发全网的通用创意模板,最近 3 年在创业公司担任技术负责人,也就是听上去高大上的 CTO,我职业的前 6 年月工资不到 1 万 5,最近一年才调薪过 2 万,我选择了一条荆棘的跨专业自学入行之路,之后又创业,弯路多多踩坑无数,希望从我的亲身经历中,大家可以对自己有更准确的定位和投资,掌握更好的技术/职业上升的方法,自此我走过的弯路不再是束缚你的套路。
要不要学习 Nodejs
如果你是前端开发工程师,你本地电脑上不可避免的要安装 Nodejs,作为工具也好,作为服务器也好,要帮助你做掉很多又脏又累的事情,比如 LESS/Scss 的编译,ES6/7 到 ES5 的转换,Javascript 代码的压缩合并,切页面调试样式的热更新,无论是通过社区迅速更新换代的 Grunt/Gulp/Webpack,还是通过自己集成或者定制到本地的其他模块,Nodejs 的这个运行环境都是你得力的助手。
如果你是后端开发工程师,比如之前是开发 PHP,Java,最近转行做 Nodejs 或者想要增加一个语言技能才来学习 Nodejs,你也不可避免的要去了解 ES5/6/7 或者说 Javascipt 的整个语法概念,去翻阅 Nodejs 的各个 API,最后借助 Nodejs 社区的一些流行框架,比如 Express/Koa,甚至是阿里开源的 Egg,用你既有的后端开发经验,对于 Web 服务层交互的知识,再套上这些框架的 API,来玩票性质的搭建一些子项目运行一些产品业务。
如果你是运营或者产品经理,但是你已具备一些基本的开发技能,比如 HTML/CSS/Javascript,甚至是对 Linux 主机的系统使用,域名解析也有一些经验,你可能也更愿意在不去学习另外一种全新的语言下,来借助 Nodejs 搭建你的 Web 服务,帮你的小点子小创意快速上线测试,获取一些用户的反馈或者价值验证,事实上我认识的不少产品经理对 Express/React/Vue 这些很喜欢,能高效的帮他们实现一些产品原型的测试。
以上举例,其实是为了说明影响你涨薪,也影响你职业发展的其中一个因素,便是某项技能的深度,或者是某些技能的广度,这些技能包含但不限于前端后端或者产品,不要给自己设限,从事某个工种不代表你只可以钻研这个工种,就拿前端举例,既然本地有了 Nodejs 的运行环境,那么适度的往下扩展技能树是顺水推舟的事情,而对 Nodejs 很感兴趣的无论任何职业的人来说,什么时候学习它都不晚,因为整个互联网经过几十年的发展目前的现状就是, Javascript 成为了 Web 层最容易入门使用且最被工业标准和厂商推广的语言,掌握了这个语言,就掌握了 Nodejs 的 1/3,剩下的 2/3 分别是 HTTP 知识和 Nodejs 本身的运行机制和系统能力。
我在 2016 年被杭州芋头哥邀请去大搜车做了个小分享,当时现场氛围特别好,整个杭州甚至苏州的许多做 Nodejs 的同学,其中超过 2/3 都是前端工程师,都跑来一起嗨皮,我之后又模拟录制了一遍,对于 Nodejs 不熟悉的同学依然有参考意义,大家可以听一下:
Nodejs 与 Javascript 先学哪个
掌握 Javascript 和掌握 Nodejs 并不冲突也并没有绝对的先后顺序,因为往往我们开始使用 Nodejs,是从 Web 的层面,而这个层面,我们有很多简易入手的框架使用,比如 Express,即便不了解它的原理,照着 API 和 Best Practice 来模仿,适当翻翻文档来都可以帮助你编写一个简单的网站程序,再基于这种迅速可见可得的体验进一步激发我们学习的兴趣,花更多的时间去从多维度反复敲打自己对于 Nodejs 的知识结构,这样一天两天慢慢就理解它的知识点了,通过实际的手写代码,运行服务器,看预览效果,再去查文档,写更复杂的代码,有些关键字不懂再去查查,这样其实就是一个不断反复不断倒带学习的过程,说是学习,其实并没有刻意的去啃 Javascript 或者 Nodejs 的语法和 API,而是自然的从工具使用走向理论构建的过程。
上面这段是面向非常初级的 Nodejs 学习者,如果已经有了其他语言的编程能力,那么入门 Javascript 也不会有太大障碍,可以先去了解 Javascript 这门语言的特点,再去尝试使用 Nodejs,在我看来,只要你对于 Javascript 和 Nodejs 是陌生的,那么学习这两个就是交替并行来回穿梭的过程,在去熟悉 Nodejs 的过程中,也就逐步的了解到了 Javascript 的语法规则,在研究 Javascript 的过程中,也就更容易领会 Nodejs 暴露出来的框架封装出来的方法函数变量他们的使用姿势和运行特点。
先看书看文档还是先找项目练手
对于学习习惯不同记忆能力不同的人来说,看文档和做项目哪个更优先,应该不会有标准答案,而且这两个在中期以后往往是交叉的,我个人的学习习惯一般是,先做项目,如果项目太难,我就把项目中难的功能都去掉,梳理出一个最简版本,以写代码为为主,以看文档作为补充,比如白天或者核心时间写代码,午间或者公交车上这些零碎时间翻文档,可以有目的的看,也可以随便挑几个感兴趣的看,这样做的缺点是,在项目一开始启动的时候,会因为不熟悉文档,走一些弯路而且比较耗脑力,它的优点是,一开始就写代码有作品雏形出来,容易激发我征服它的斗志,更有欲望把它做出来,所以这样开始的方式,往往我都不会中途放弃,而看文档的方式,我会觉得枯燥,或者不知所云,可能看看就困了放弃了,这种不太适合我,但是它的优点也很明显,如果充分的看了文档,基于原作者或者原始团队的角度理解技术点,更容易一开始就走在正确的道路上,无论是名词还是原理或者 API,心中会很有方寸,做项目的时候也容易推测出来出问题的环节去哪里找答案。
对于新人来说,先把项目做起来会比较实用,走弯路和踩的坑必然会多一些,但是这样更容易产生兴趣把硬骨头啃下来,也会提高解决问题的即时反应能力,所谓临阵不惧,运筹有度。
哪里找练手项目
练手项目从观看类型上分两种,一种是纯文字形式的,比如连载的博客,一种是视频,或者是直播或者是录播的视频,连载的博客好处是都形成了文字,并且有代码示例,看的时候可以用脑力集中消化某一个技术点,容易看懂,这同时也是它的一个缺点,因为博客中不同的技术点都用大脑消化后,就会产生一种已经理解了它的直觉,这种直觉会促使你快速的通读全完直到最后,所有的编程环节却没有动手实施,导致过了三五天后再来回想这些文字和当初所理解的概念,脑海中就会印象模糊甚至一片空白,用行话说就是没有把消化后的知识持久化。
直播的视频对个人的时间要求比较严格,同时直播中不能暂停甚至不能提问,会导致自己被动的 Push 往前走,容易遗留下一些关键的问题点没有及时消化,不过现在有的直播平台会自动存储有备份,所以也可以重播。
我个人倾向于看录播的视频,可以暂停,可以快进,可以重播,跟着屏幕敲代码大概是目前最好的一种跟随实战的方式了,录播的视频这方面有很多的学习平台,我自己平时是泡在慕课网,虽然我也是讲师,但是我也经常听别的讲师讲的课程,收获还是挺大的。
如果你对 Nodejs 已经有一定的掌握了,那么其实可以跳开一些简单的博客啊视频啊,直接上 Github 上搜一些别人开源的 Github 项目,Clone 到本地,跑起来,再去读他们的源码,这是最直接也最有效的学习方式了,但是这个对于初学者往往比较难,因为阅读源代码的前提是要有一定的编程量,上来就一通读不仅会增加理解项目的难度,更会因此失去阅读代码的兴趣。
我下面会罗列一些,我自己录制过的一些项目,或者其他的我觉得可以按照这个路线继续深入学习的项目资源。
Express 实现一个电影网站
在我入行的那个年代,一般编程的第一个练手项目,往往是一个增删改查的博客系统,或者是一个聊天室,这方面资源很多,但是我个人觉得起点略低而且提不起兴趣,于是就录制了一个开发电影网站的免费视频课程,课程地址如下:
这两个课程,是采用 Nodejs+MongoDB 外加一些必要的中间件,比如 Mongoose 建模,body 解析,Jade 模板等等,有前端的页面也有后端的页面,有注册登录也有密码的加盐设计,后端这里也有管理员的角色,请求豆瓣数据写入数据库包括评论的数据结构和评论流程的实现,算是一个五脏俱全的小小麻雀。
课程中用到的 Express 框架,需要理解 req 和 res 两个跟业务密切相关的知识点,一个是数据流进,一个是数据流出,然后就是 Express 的中间件机制基本是基于回调或者是基于事件的,这些都是在跟着把代码全部实现后就能理解的东西,一开始不用太纠结细节,先关注流程就行,同时因为数据存储用到了 MongoDB,项目中也使用了 Mongoose 来配置和链接数据库,来设计每一个数据模型的 Schema,可以理解为表的概念,另外由于课程录制的比较早,大家要特别留意版本,在 2 期课程中有一个补录的升级课程,可以在一期的学习中,跳过去看升级再回过头看。
或者如果不喜欢 Scott 早期课程的声音或者讲解的方式,也可以直接看下面的这个课程,里面有许多小例子,跟着敲代码不累。
Nodejs 的基础概念和 API 讲解
这个是纯面向新手的课程,地址如下:
在这两个课程中,我尝试了新的录制风格,但同时也导致了录制的时候,描述过于逗比不够严谨,还好很多看过的童鞋们还都表示很有收获,看来激起学习兴趣的确是所有市面的博客也好,视频也好都要去提升的一个点。
用 Nodejs 开发微信公众号
在微信公众号推出的那个风口,满大街都在找能开发微信公众号的工程师,而且由于公众号本身与微信打通的链路和易传播性,H5 工程师成了各个类媒体公司和创业公司的标配,但是微信公众号由于它的特殊性,需要前后端协作完成,并且需要通过微信的官方服务器进行消息的分发和中转接收,给很多公司是前端后端同学带去困扰,增加了协作的成本,于是具备 Nodejs 开发能力的前端工程师在市面上备受欢迎,因为 Java/PHP 这种传统后端可以赋予公众号纯数据的接口调用权限,而多变的业务逻辑则可以由前端自己通过 Nodejs 来自由控制,同时微信公众号里面的消息和跳转的页面自己都能完全控制,于是 Nodejs 微信开发工程师往往通过一两个人的配合,就能极高效率的完成公司在微信端的的业务实现,涉及到复杂数据或者大体积数据存储的部分,仍然可以交还给 Java/PHP 工程师来负责,从公司层面,产品做的更轻更快而且人员成本上也更省钱,从个人层面,对于产品研发的流程也更有控制权,同时个人也更有竞争力更值钱。
在现在,公众号依然是很多传统公司走向互联网化所优先考虑的方向,加上小程序的推出和一系列附加能力的扩展,这两个可以很好的协作来拉新和转化,现在具备 Nodejs 在微信的使用层面,依然是有很大的成本优势。
于是响应慕课网的需求,推出了这个收费的视频课程:
在这个课程里面,把上面的电影网站,进行了大刀阔斧的升级改造,基于原来的登录注册后台上传这些功能外
- 把原来的 Express 框架也切换到 Koa 框架
- 利用 yield 来做异步操作的执行
- 从零开始封装微信中间件
- 深入到最底层的请求逻辑
- 微信第三方接口调用过程
- ES2015 新特性使用(Promise, Generator)
- 充分理解 http 请求和实现二跳换 token 请求
- ...
让这个微信公众号,本身可以响应用户的消息,比如上传图片/视频,文字自动回复,电影的检索和数组消息推送,还可以在公众号里面跳到电影网站的手机版本,里面可以调用语音 SDK 进行搜寻,可以基于微信的 openid 进行用户注册和评论等等,这时候原来那个电影网站的小麻雀就变成了一只犀利的老鹰,能对微信用户提供更丰富的功能和体验,而这一切的背后,仅仅是 Nodejs+MongoDB 外加 Koa 框架的支撑。
React Native App 开发
React 问世以来,特别是 React Native 问世以来,整个前端世界再一次陷入了变革狂潮,用声音或者行动宣示要搞事要运动,因循守旧的工程师被动主动的被淘汰,因时制宜的工程师和大量的前端新人,踩在老人的尸体上大步前行,无论承认与否,互联网世界一天天变得更丰富多彩,技术的圈子亦然,变革的速度快慢不重要,基于变革而能及时上车的勇气很重要,无论是 Microsoft,Facebook,Google,Instagram,还是 Alibaba, 腾讯,地球上的一线大公司的一线牛人,在过往的几年中,开源了巨量的框架,尤其在 Nodejs 和 React Native 方面,也都有了许多实践和改造,给许多的中小公司带去更多的信心,有了更多的选择。
开发 App 就是这样,世界不再是过去的非 Object-C(Swift) 即 Java,也不再是牺牲性能追求效率的 Cordova 和 PhoneGap,而是有了介于二者直接的 React Native,更多的养不起两个不同语种工程师的小公司和创业公司,开始眷顾能适应两个平台,且能满足自己业务和展现需求的 React Native,而开发一个 App 并不简单,除了肉眼可见的前台,还有作为纯 API 接口的后台,前后之间依然有种种的门槛,这时候 Nodejs 的轻便就又派上用场,具备 Nodejs 开发能力的 React Native 工程师,到今天为止依然是香饽饽。
还是顺应潮流,结合慕课网推出了这个课程,同时慕课网的官方设计师负责给 App 出插图润色,不过这个课程是收费的:
在这个课程中,先撇开 React Native 这个纯 App 端展现的部分,整个后端是用 Nodejs 开发的,框架依然是 Koa,涉及到了用户 token 生成获取,短信验证码,无后台的 Mock 数据,以及基于 MongoDB 的 Restful API 服务,对于音频视频资源的转码和合并都是在后端完成,里面涉及到大量的异步操作,对于一个初级和中级工程师,有非常好的实战借鉴意义。
上面发了都是我的个人作品,下面提供下其他的我认为学习 Nodejs 需要投入时间研究的知识或者方向;
培养英文读写提问的能力
有句话怎么说,编程三分靠资历,7 分靠 Google,大部分你在业务场景中遇到的技术问题,在网上都有现成的答案,问题是你不知道用什么关键词去搜出来,这个还是比较考察英文的表述能力,这些最前沿的技术,都是老外们实践出来的,我们的脑回路也应该在编程之外,多适应一下英文的思考方式,多逼自己阅读英文技术文档,随着时间慢慢就能习惯,只要解锁了英文的这把枷锁,就打开了新世界的大门,无论是从检索和阅读角度,还是从提问参与的角度。
关注 Github 仓库 Wiki 和产品榜单
我们上 Github 的时候,往往会很关注热门的框架库,那么这些框架库里往往蕴含着更有参考价值的宝藏,那就是 Wiki,比如 Express,在它的 Wiki 里面,除了有 Express 的升级指南,中间件列表之外,还有一个 Frameworks built with Express,什么意思呢,就是很多团队或者个人对 Express 不够满意,或者自己的场景更特殊,Express 不能满足,他们都基于 Express 这个框架基础或者思想来构建了一个新的框架,这些新的框架,都的基于他们的需求或者他们认为合理的方向来实现的,这些框架的源代码包括文档,大家在学习 Nodejs 的时候,可以好好研究一下,能学习到更多他人在设计框架时候考虑的方向,实现的方式,比如这些:
- Feathers -- 一个迷你的数据驱动的框架
- Monorail.js -- 一个极轻量级的 MVC 框架
- Locomotive -- 受 Ruby on Rails 启发而开发的强大的 MVC 框架
- CompoundJS -- 同样是受 Ruby on Rails 启发的高水平 MVC 框架
- Calipso -- 基于 Express/Mongoose 的内容管理系统
- Derby -- 一个实时的协作应用框架
- Bones -- 基于 Express/Backbone 实现的 CS 应用框架
- Matador -- Twitter 工程师开发的 MVC 框架
- Lemmy -- 一个不可描述(爆粗口)的神秘框架
- Mojito -- Yahoo 开发的 MVC 框架
综合比较一下,就能找出更适合自己用的框架,等到对框架足够熟悉的时候,就可以去阅读他们的 issues 甚至是源代码,看的多了想的多了,就越来越上道了。
全栈的最后一公里
全栈这个词很敏感,有人不认同有人无所谓,对我而言,它就像是一个 H5 工程师一样,只是表述了一种印象或者概念,具体严谨与否不重要,因为跟人沟通,心领神会即可不必强究细节。
那么在学习 Nodejs 的过程中,有一道门槛是无论如何也逃不过去的,那就是 服务器的选购配置,域名的解析指向,Nodejs 项目的部署等这些偏运维方向,这些让很多新人甚至是已经工作的工程师困扰,自己去琢磨太花费时间,不去琢磨,始终没有能力凭自己双手,让一个产品上线或者让自己的一个想法实现到互联网上,不论是成为独立站长,还是只是让朋友同学访问,于是我把这些总结了一下,以以上几个项目为例,大概分为如下几个步骤:
- 部署方案规划
- 待部署项目分析
- 选购及备案域名
- 厂商对比与选配阿里云服务器
- 初步 SSH 无密码登录连接和配置
- 搭建 Nodejs/MongoDB/Nginx 环境
- 配置 IPTables/Fail2Ban 防火墙及主动防御
- 域名 DNS 转移及 A 记录/CNAME 解析配置
- MongoDB 角色配置与安全规则设置
- 线上 MongoDB 单表单库导入导出与跨机迁移备份上传
- PM2 发布环境配置
- 服务器与 Git 仓库读写配置
- PM2 一键部署线上 Nodejs 项目
- 电影网站/ReactNative App 后台/微信公众号/微信小程序后台等项目实战部署
- SSL 证书申请及 Nginx 证书集成提供 HTTPS 协议
- 上线方案复盘总结
这个新课程 全栈最后一公里 - Node.js项目的线上服务器部署与发布 已经在 4 月 10 日上线,感兴趣的同学们可以关注一下。
编程路漫漫,与大家共勉!