diff --git a/README.md b/README.md index 16da401..489f64d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ # 【知乎Live】狼叔:如何正确的学习Node.js + +《狼书(卷1):更了不起的Node.js》Node.js》 已出版,和本文内容类似,但更深入。 + +![](media/book.png) + +- [京东购买地址](https://item.jd.com/12623248.html) +- [当当购买地址](http://product.dangdang.com/27880000.html) + +《狼书(卷2):Node.js Web应用开发》 《狼书(卷3):Node.js高级技术》,预计10月之前出版。 + ![](media/preview.png) 预览地址 https://i5ting.github.io/How-to-learn-node-correctly/ @@ -34,7 +44,7 @@ Part 4实践:从招聘角度来看, Node.js 开发需要具备哪些技能 Part 5答疑:回答大家的问题 -本次Live主要是科普,适用新用户和比较迷茫的Node朋友,希望大家多多理解和支持。 +本次Live主要是科普,适用于新用户和对Node比较迷茫的朋友,希望大家多多理解和支持。 ## Part 0 :Node.js简介 @@ -44,7 +54,7 @@ c)基本原理 ### a)Node.js简介 -Node.js 诞生于 2009 年,由 Joyent 的员工 [Ryan Dahl](https://github.com/ry) 开发而成,之后 Joyent 公司一直扮演着 Node.js 孵化者的角色。由于诸多原因,Ryan 在2012年离开社区,随后在2015年由于 Node 贡献者对 es6 新特性集成问题的分歧,导致分裂出iojs,并由 iojs 发布1.0、2.0和3.0版本。由于 iojs 的分裂最终促成了2015年Node基金会的成立,并顺利发布了4.0版本。Node.js基金会的创始成员包括 Google、Joyent、IBM、Paypal、微软、Fidelity 和 Linux基金会,创始成员将共同掌管过去由 Joyent 一家企业掌控的 Node.js 开源项目。此后,Node.js基金会发展非常好,稳定的发布5、6、7、8等版本,截止发稿最新版本已经是8.6,长期支持版本是6.11。 +Node.js 诞生于 2009 年,由 Joyent 的员工 [Ryan Dahl](https://github.com/ry) 开发而成,之后 Joyent 公司一直扮演着 Node.js 孵化者的角色。由于诸多原因,Ryan 在2012年离开社区,随后在2015年由于 Node 贡献者对 es6 新特性集成问题的分歧,导致分裂出iojs,并由 iojs 发布1.0、2.0和3.0版本。由于 iojs 的分裂最终促成了2015年Node基金会的成立,并顺利发布了4.0版本。Node.js基金会的创始成员包括 Google、Joyent、IBM、Paypal、微软、Fidelity 和 Linux基金会,创始成员将共同掌管过去由 Joyent 一家企业掌控的 Node.js 开源项目。此后,Node.js基金会发展非常好,稳定地发布5、6、7、8等版本,截止发稿最新版本已经是8.6,长期支持版本是6.11。 Node.js 不是一门语言也不是框架,它只是基于 Google V8 引擎的 JavaScript 运行时环境,同时结合 Libuv 扩展了 JavaScript 功能,使之支持 io、fs 等只有语言才有的特性,使得 JavaScript 能够同时具有 DOM 操作(浏览器)和 I/O、文件读写、操作数据库(服务器端)等能力,是目前最简单的全栈式语言。 @@ -56,9 +66,9 @@ Node.js 不是一门语言也不是框架,它只是基于 Google V8 引擎的 Node.js通常被用来开发低延迟的网络应用,也就是那些需要在服务器端环境和前端实时收集和交换数据的应用(API、即时聊天、微服务)。阿里巴巴、腾讯、Qunar、百度、PayPal、道琼斯、沃尔玛和 LinkedIn 都采用了 Node.js 框架搭建应用。 -另外, Node.js 编写的包管理器 npm 已成为开源包管理了领域最好的生态,直接到2017年10月份,有模块超过47万,每周下载量超过32亿次,每个月有超过700万开发者使用npm。 +另外, Node.js 编写的包管理器 npm 已成为开源包管理领域最好的生态,截止到2017年10月份,有超过47万模块,每周下载量超过32亿次,每个月有超过700万开发者使用npm。 -当然了,Node.js 也有一些缺点。Node.js 经常被人们吐槽的一点就是:回调太多难于控制(俗称回调地狱)和 CPU 密集任务处理的不是很好。但是,目前异步流程技术已经取得了非常不错的进步,从Callback、Promise 到 Async函数,可以轻松的满足所有开发需求。至于 CPU 密集任务处理并非不可解,方案有很多,比如通过系统底层语言 Rust 来扩展 Node.js,但这样会比较麻烦。笔者坚信在合适的场景使用合适的东西,尤其是在微服务架构下,一切都是服务,可以做到语言无关。如果大家想使 JavaScript 做 CPU 密集任务,推荐 Node.js 的兄弟项目 [fibjs](http://fibjs.org/),基于纤程(fiber,可以简单理解为更轻量级的线程),效率非常高,兼容npm,同时没有异步回调烦恼。 +当然了,Node.js 也有一些缺点。Node.js 经常被人们吐槽的一点就是:回调太多难于控制(俗称回调地狱)和 CPU 密集任务处理地不是很好。但是,目前异步流程技术已经取得了非常不错的进步,从Callback、Promise 到 Async函数,可以轻松地满足所有开发需求。至于 CPU 密集任务处理并非不可解,方案有很多,比如通过系统底层语言 Rust 来扩展 Node.js,但这样会比较麻烦。笔者坚信在合适的场景使用合适的东西,尤其是在微服务架构下,一切都是服务,可以做到语言无关。如果大家想使用 JavaScript 做 CPU 密集任务,推荐 Node.js 的兄弟项目 [fibjs](http://fibjs.org/),基于纤程(fiber,可以简单理解为更轻量级的线程),效率非常高,兼容npm,同时没有异步回调烦恼。 ### b)什么是Node.js? @@ -119,7 +129,7 @@ Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.j Node.js 其实就是帮我们构建类似的机制。我们在写代码的时候,实际上就是取号的过程,由 Event Loop 来接受处理,而真正执行操作的是具体的线程池里的 I/O 任务。之所以说 Node.js 是单线程,就是因为在接受任务的时候是单线程的,它无需进程/线程切换上下文的成本,非常高效,但它在执行具体任务的时候是多线程的。 -Node.js 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”,毫无疑问,它确实做到了。这种做法将并发编程模型简化了,Event Loop和具体线程池等细节被 Node.js 封装了,继而将异步调用 Api 写法暴露给开发者。真是福祸相依,一方面简化了并发编程,另一方面在写法上埋下了祸根,这种做法的好处是能让更多人轻而易举的写出高性能的程序! +Node.js 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”,毫无疑问,它确实做到了。这种做法将并发编程模型简化了,Event Loop和具体线程池等细节被 Node.js 封装了,继而将异步调用 Api 写法暴露给开发者。真是福祸相依,一方面简化了并发编程,另一方面在写法上埋下了祸根,这种做法的好处是能让更多人轻而易举地写出高性能的程序! 在Node.js Bindings层做的事儿就是将 Chrome V8 等暴露的 `C/C++` 接口转成JavaScript Api,并且结合这些 Api 编写了 Node.js 标准库,所有这些 Api 统称为 Node.js SDK,后面模块章节会有更详细的讨论。 @@ -153,7 +163,7 @@ Node不是语言,不是框架,只是基于V8运行时环境。结合libuv能 2. 常见用法,比如正则,比如数据结构,尤其是数组的几种用法。比如bind/call/apply等等 3. 面向对象写法。js是基于对象的,所以它的oo写起来非常诡异。参见红皮书JavaScript高级编程,很多框架都是自己实现oo基础框架,比如ext-core等。 -犀牛书,《JavaScript权威指南》,没事就多翻翻,看少多少遍都不为过。 +犀牛书,《JavaScript权威指南》,没事就多翻翻,看多少遍都不为过。 2)个人学习和技术选型都要循序渐进 @@ -239,11 +249,13 @@ npm基本命令 | 名称 | 描述 | 简写 | | --- | --- | --- | -| npm install xxx | 安装xxx模块,但不记录到package.json里 | npm i xxx | -| npm install --save xxx | 安装xxx模块,并且记录到package.json里,字段对应的dependency,是产品环境必须依赖的模块 | npm i -s xxx | +| npm install xxx | 安装xxx模块,并且记录到package.json里,字段对应的dependency,是产品环境必须依赖的模块 | npm i xxx | +| npm install --no-save xxx | 安装xxx模块,但不记录到package.json里 | npm i --no-save xxx | | npm install --save-dev xxx | 安装xxx模块,并且记录到package.json里,字段对应的dev-dependency,是开发环境必须依赖的模块,比如测试类的(mocha、chai、sinon、zombie、supertest等)都在 | npm i -D xxx | | npm install --global xxx | 全局安装xxx模块,但不记录到package.json里,如果模块里package.json有bin配置,会自动链接,作为cli命令 | npm i -g xxx | +**注意:** npm 5 之前采用默认 --no-save 策略,需要加 --save 或 -S 参数将其记录到 package.json 里。 + ### 常用软件 - 1)oh my zsh是我最习惯的shell,终端下非常好用 @@ -343,14 +355,14 @@ Node.js 应用场景非常丰富,比如 Node.js 可以开发操作系统,但 ### Node核心:异步流程控制 -Node.js是为异步而生的,它自己把复杂的事儿做了(高并发,低延时),交给用户的只是有点难用的Callback写法。也正是坦诚的将异步回调暴露出来,才有更好的流程控制方面的演进。也正是这些演进,让Node.js从DIRT(数据敏感实时应用)扩展到更多的应用场景,今天的Node.js已经不只是能写后端的JavaScript,已经涵盖了所有涉及到开发的各个方面,而Node全栈更是热门种的热门。 +Node.js是为异步而生的,它自己把复杂的事儿做了(高并发,低延时),交给用户的只是有点难用的Callback写法。也正是坦诚的将异步回调暴露出来,才有更好的流程控制方面的演进。也正是这些演进,让Node.js从DIRT(数据密集实时应用)扩展到更多的应用场景,今天的Node.js已经不只是能写后端的JavaScript,已经涵盖了所有涉及到开发的各个方面,而Node全栈更是热门种的热门。 直面问题才能有更好的解决方式,Node.js的异步是整个学习Node.js过程中重中之重。 - 1) 异步流程控制学习重点 -- 2)Api写法:Error-first Callback 和 EventEmitter -- 3)中流砥柱:Promise -- 4)终极解决方案:Async/Await +- 2)Api写法:Error-first Callback 和 EventEmitter +- 3)中流砥柱:Promise +- 4)终极解决方案:Async/Await #### 1) 异步流程控制学习重点 @@ -374,7 +386,7 @@ Node.js是为异步而生的,它自己把复杂的事儿做了(高并发, 1. Node.js SDK里callback写法必须会的。 2. Node.js学习重点: Async函数与Promise - 1. 中流砥柱:Promise + 1. 中流砥柱:Promise 2. 终极解决方案:Async/Await 所以下面我们会分个小部分进行讲解。 @@ -408,7 +420,7 @@ var EventEmitter = require('events') var util = require('util') var MyEmitter = function () { - + } util.inherits(MyEmitter, EventEmitter) @@ -436,7 +448,7 @@ Node.js的API都是异步的,同步的函数是奢求,要查API文档,在 ![](media/14913280187332/api.png) -#### 3)中流砥柱:Promise +#### 3)中流砥柱:Promise 回调地狱 @@ -512,19 +524,19 @@ Bluebird是 Node.js 世界里性能最好的Promise/a+规范的实现模块,Ap - Node.js最新技术栈之Promise篇 https://cnodejs.org/topic/560dbc826a1ed28204a1e7de - 理解 Promise 的工作原理 https://cnodejs.org/topic/569c8226adf526da2aeb23fd -- Promise 迷你书 http://liubin.github.io/promises-book/ +- Promise 迷你书 http://liubin.github.io/promises-book/ #### 4)终极解决方案:Async/Await Async/Await是异步操作的终极解决方案,Koa 2在node 7.6发布之后,立马发布了正式版本,并且推荐使用async函数来编写Koa中间件。 -这里给出一段Koa 2应用里的一段代码 +这里给出一段Koa 2应用里的一段代码 ```js exports.list = async (ctx, next) => { try { let students = await Student.getAllAsync(); - + await ctx.render('students/index', { students : students }) @@ -607,7 +619,7 @@ main(); - co的返回值是promise,所以await可以直接接co。 - co的参数是genrator -- 在generator里可以使用yield,而yield后面接的有5种可能,故而把这些可以yield接的方式成为yieldable,即可以yield接的。 +- 在generator里可以使用yield,而yield后面接的有5种可能,故而把这些可以yield接的方式称为yieldable,即可以yield接的。 - Promises - Thunks (functions) - array (parallel execution) @@ -635,7 +647,7 @@ main(); - 1) 异步流程控制学习重点 - 2)Api写法:Error-first Callback 和 EventEmitter -- 3)中流砥柱:Promise +- 3)中流砥柱:Promise - 4)终极解决方案:Async/Await 这里再提一下关于Node.js源码阅读问题,很多人api都还没玩儿熟练就去阅读源码,这是非常不赞成的,不带着问题去读源码是比较容易迷失在大量代码中的。效果并不好。 @@ -830,7 +842,7 @@ Web开发对移动端的冲击非常大。当然现在Web技术也开发PC clien 每次演讲我会都问大家是不是前端,回答“是”的人非常多,我会开玩笑的恭喜大家:“现在的前端就是钱端”,确实,现在前端发展异常的快,而且没有趋向于类比java里ssh框架的那种稳定,所以未来很长一段时间,还会增长,持续混乱,这对前端来说是把双刃剑,一方面有很强的压迫感,不学习就跟不上时代,另一方它也是机遇,能够带给更多机会,包括money。 -大家都疑惑的一个问题是如何在这样巨变的时代能够通过学习来应变,我可以很负责的告诉大家,没有捷径,但通过掌握 Node.js 能够让你降低这个学习曲线而已,毕竟Node.js是大前端的基础设施。大家可以看一下,前端的开发过程,模块化,构建,辅助工具,调优,架构调整,可以说Node.js是无处不在的。 +大家都疑惑的一个问题是如何在这样剧变的时代能够通过学习来应变,我可以很负责地告诉大家,没有捷径,但通过掌握 Node.js 能够帮你降低这个学习曲线而已,毕竟Node.js是大前端的基础设施。大家可以看一下,前端的开发过程,模块化,构建,辅助工具,调优,架构调整,可以说Node.js是无处不在的。 其实,辅助大前端开发只是Node.js的一个非常无心插柳的衍生功能,通过掌握Node.js能够让你能做的更多、获得的更多,甚至可以说有更多自我实现的快乐,这也是我那本书书名字里“更了不起的”要去阐述的内容。 @@ -870,7 +882,7 @@ Web开发对移动端的冲击非常大。当然现在Web技术也开发PC clien 也曾懵懂,也曾迷茫,但我这人比较傻,一直信奉:“一次只做1件事儿,尽力做到极致”,短时间看这是比较傻的,但一旦你坚持下去,你就会发现技术其实是门手艺,厚积薄发。 -我没办法说自己最擅长什么,但在什么场景下用什么技术是我擅长的。或者说,应变是我最大的本事。很多框架,新技术我都没见过,用过,但花一点点过一下,就能拿已有的知识快速的理解它,这其实是长期学习的好处。 +我没办法说自己最擅长什么,但在什么场景下用什么技术是我擅长的。或者说,应变是我最大的本事。很多框架,新技术我都没见过,用过,但花一点点时间过一下,就能拿已有的知识快速的理解它,这其实是长期学习的好处。 现在越来越忙,写代码的时间越来越少,技术又越发展越快,我能做好的就是每日精进,仗着这点已有的知识储备跟年轻人比赛。我不觉得累,相反我很享受这种感觉,没有被时代淘汰,是一件多么幸福的事儿。 @@ -911,7 +923,7 @@ Web开发对移动端的冲击非常大。当然现在Web技术也开发PC clien 以上皆是痛点,所以比较好的办法应该是这样的。 - 玩转 npm、gulp 这样的前端工具类(此时还是前端) -- 使用 node 做前后端分离(此时还是前端) +- 使用 Node 做前后端分离(此时还是前端) - express、koa 这类框架 - jade、ejs 等模板引擎 - nginx @@ -955,7 +967,7 @@ Web开发对移动端的冲击非常大。当然现在Web技术也开发PC clien - 然后可以玩点框架,比如 jquery mobile,sencha touch - 然后可以玩点高级货,ionicframework(基于 angularjs、cordova) - 然后前端4阶段,依次打怪升级 -- 然后 node +- 然后 Node 这个基本上是我走的路,从2010年写iOS、做phonegap(当时是0.9.3)、一路走到现在的总结吧! @@ -994,14 +1006,14 @@ Web开发对移动端的冲击非常大。当然现在Web技术也开发PC clien p6的要求(语音) 主动执行,辅助团队 -掌握一门后端语言;熟悉用户体验相关知识;了解软件工程。 -精通浏览器工作原理,熟悉HTTP协议,熟悉设计模式。 +掌握一门后端语言;熟悉用户体验相关知识;了解软件工程。 +精通浏览器工作原理,熟悉HTTP协议,熟悉设计模式。 掌握改善无障碍访问的方法;掌握数据采集分析能力;熟悉可维护性问题。 -通过开发、使用、推广效率工具让自己与团队的效率得到提高; -提炼可复用组件,为类库贡献高质量代码. -积极完善知识库; +通过开发、使用、推广效率工具让自己与团队的效率得到提高; +提炼可复用组件,为类库贡献高质量代码. +积极完善知识库; 跨团队分享技术和专业相关知识。 -辅导新人技能成长; +辅导新人技能成长; 协助主管做招聘和团队管理工作。 ### 大家是选大公司还是小公司? @@ -1080,12 +1092,12 @@ p6的要求(语音) PixelLab是与淘宝GM Lab联合成立的专注于视频算法方向的研发部门,主要涉及视频的空间感知、轨迹跟踪、图像分割、遮挡检测以及照片级渲染等相关技术。用于实现视频内的内容植入与后期特效的研发,属于视频MR的场景,主要应用于广告植入平台的研发,方向靠谱老板人好,欢迎推荐。主要需要的岗位包括了图像算法、3D视觉算法,渲染算法,WebGL以及并行计算等几大方向,因为算法类招聘实在难,所以将JD的链接帖出来希望同事们有适合的人可以内推一下。 岗位要求: -1) 本科及以上学历,5年以上工作开发经验; -2) 扎实的计算几何基础,熟悉常见数学工具; -3) 熟练WebGL、Canvas渲染开发,熟练Shader编写,熟悉Three.js、OSG.js者优先; -4) 熟练运用JavaScript语言与HTML5、CSS3等技术; -5) 熟悉主流移动浏览器的技术特点,有移动端H5项目经验者优先; -6) 有移动端WebGL开发经验者优先; +1) 本科及以上学历,5年以上工作开发经验; +2) 扎实的计算几何基础,熟悉常见数学工具; +3) 熟练WebGL、Canvas渲染开发,熟练Shader编写,熟悉Three.js、OSG.js者优先; +4) 熟练运用JavaScript语言与HTML5、CSS3等技术; +5) 熟悉主流移动浏览器的技术特点,有移动端H5项目经验者优先; +6) 有移动端WebGL开发经验者优先; 7) 学习能力强、应变能力强,优秀的沟通能力和协调能力,执行能力强,具备较强的团队合作精神。 ### 蚂蚁金服 @@ -1108,19 +1120,19 @@ PixelLab是与淘宝GM Lab联合成立的专注于视频算法方向的研发部 - 基于Webpack的前端工程化体系建设 - 基于eggjs的react同构框架 - 基于G2的业务数据可视化组件库 -- 大规模图形识别/图像处理/AR/VR/语音交互等研究性领域探索 - +- 大规模图形识别/图像处理/AR/VR/语音交互等研究性领域探索 + ### 联系方式 - + 目前北京,杭州,广州,上海,深圳,成都都在招聘,如果你也想跟我一起共事,请将简历邮件给我 langshu.ssl@alibaba-inc.com,团队大量招人,也可以帮忙推荐给集团其他部门。 有机会和winter,勾股,玉伯,苏千,朴灵、死马、偏右,徐飞,阮一峰,天猪,裕波等大神一起工作哦。 悄悄地说,其实其他公司我也可以帮推荐。 - + ## 结束语 - -年轻时死磕,年长点让小弟死磕,现在抓个专家一起吃饭,没有什么是一顿饭解决不了的,不行就二顿 + +年轻时死磕,年长点让小弟死磕,现在抓个专家一起吃饭,没有什么是一顿饭解决不了的,不行就二顿 工程师的能力不是编码和死磕,而是解决问题 @@ -1148,5 +1160,3 @@ https://www.zhihu.com/lives/928687583372926976 ![](media/15165422813679.jpg) - - diff --git a/media/book.png b/media/book.png new file mode 100644 index 0000000..c361ae1 Binary files /dev/null and b/media/book.png differ