2017-12-14 我发了一篇文章《没用过Node.js,就别瞎逼逼》是由于有人在知乎上黑Node.js。那篇文章的反响仍是至关不错的,甚至连著名的hax贺老都很认同,下班时读那篇文章,居然坐车的还坐过站了。你们能够很明显的感到Node.js的普及度还不够,还存不少误解。甚至说不少小白用户也得不到很好的学习。大神都功成身退,书也跟不上,大部分都是2013年左右的,Node.js版本都是基于v0.10左右的,如今已经v9了。想一想也是有点惋惜,使用如此普遍的Node.js被你们默认,却没人来科普。css
反思以后,我就想准备一个科普的Live,因而就有了《狼叔:如何正确学习 Node.js?》,相信可以对不少喜欢Node.js的朋友有所帮助。Live已完成目前1200多人,230人评价,平均4.8+,还算是一个比较成功的Live。现整理出来,但愿对更多朋友有用。html
Live 简介前端
如今,愈来愈多的科技公司和开发者开始使用 Node.js 开发各类应用。Node.js除了可以辅助大前端开发外,还能够编写Web应用,封装Api,组装RPC服务等,甚至是开发VSCode编辑器同样的PC客户端。和其它技术相比, Node.js 简单易学,性能好、部署容易,可以轻松处理高并发场景下的大量服务器请求。Node.js 周边的生态也很是强大,NPM(Node包管理)上有超过60万个模块,日下超过载量3亿次。但编写 Node.js 代码对新人和其它语言背景的开发者来讲,不是一件容易的事,在入门以前须要弄懂很多复杂的概念。vue
我身边也有不少人问我:如何学习 Node.js ?做为一名 Node.js 布道者,我作过不少 Node.js 普及和推广的工做,对它的基本概念和核心模块都很熟悉; 此外,我还在撰写一本名为《更了不得的 Node.js 》的书,已经写了 2 年,积累了很丰富的资料,本次 Live 也将为你提供对 Node.js 更全面的解读。java
本次 Live 主要包括如下内容,目录node
Part 0 :Node.js简介python
a)Node.js简介
b)什么是Node.js?
c)基本原理mysql
Part 1前言:学习 Node.js 的三个境界react
Part 2准备:如何学习Node.jsjquery
Part 3延伸:大前端变化那么快,如何才能作到每日精进?
Part 4实践:从招聘角度来看, Node.js 开发须要具有哪些技能?
Part 5答疑:回答你们的问题
本次Live主要是科普,适用新用户和比较迷茫的Node朋友,但愿你们多多理解和支持。
a)Node.js简介
b)什么是Node.js?
c)基本原理
Node.js 诞生于 2009 年,由 Joyent 的员工 Ryan Dahl 开发而成,以后 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基金会发展很是好,稳定的发布五、六、七、8等版本,截止发稿最新版本已是8.6,长期支持版本是6.11。
Node.js 不是一门语言也不是框架,它只是基于 Google V8 引擎的 JavaScript 运行时环境,同时结合 Libuv 扩展了 JavaScript 功能,使之支持 io、fs 等只有语言才有的特性,使得 JavaScript 可以同时具备 DOM 操做(浏览器)和 I/O、文件读写、操做数据库(服务器端)等能力,是目前最简单的全栈式语言。
早在2007年,Jeff Atwood 就提出了著名的 Atwood定律
任何可以用 JavaScript 实现的应用系统,最终都必将用 JavaScript 实现
目前 Node.js 在大部分领域都占有一席之地,尤为是 I/O 密集型的,好比 Web 开发,微服务,前端构建等。很多大型网站都是使用 Node.js 做为后台开发语言的,用的最多的就是使用Node.js作前端渲染和架构优化,好比 淘宝 双11、去哪儿网 的 PC 端核心业务等。另外,有很多知名的前端库也是使用 Node.js 开发的,好比,Webpack 是一个强大的打包器,React/Vue 是成熟的前端组件化框架。
Node.js一般被用来开发低延迟的网络应用,也就是那些须要在服务器端环境和前端实时收集和交换数据的应用(API、即时聊天、微服务)。阿里巴巴、腾讯、Qunar、百度、PayPal、道琼斯、沃尔玛和 LinkedIn 都采用了 Node.js 框架搭建应用。
另外, 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,基于纤程(fiber,能够简单理解为更轻量级的线程),效率很是高,兼容npm,同时没有异步回调烦恼。
按照 Node.js官方网站主页 的说法:
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
从这段介绍来看,解读要点以下
npm
做为包管理器,目前 npm
是开源库里包管理最大的生态,功能强大,截止到2017年12月,模块数量超过 60 万+大多数人都认为 Node.js 只能写网站后台或者前端工具,这实际上是不全面的,Node.js的目标是让并发编程更简单,主要应用在以网络编程为主的 I/O 密集型应用。它是开源的,跨平台,而且高效(尤为是I/O处理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃尔玛及GoDaddy都是 Node.js 的用户。
下面是一张 Node.js 早期的架构图,来自 Node.js 之父 Ryan Dahl 的演讲稿,在今天依然不过期,它简要的介绍了 Node.js 是基于 Chrome V8引擎构建的,由事件循环(Event Loop)分发 I/O 任务,最终工做线程(Work Thread)将任务丢到线程池(Thread Pool)里去执行,而事件循环只要等待执行结果就能够了。
核心概念
Chrome
浏览器中被使用。Chrome V8 引擎能够独立运行,也能够用来嵌入到 C/C++ 应用程序中执行。libuv
提供)libuv
提供)梳理一下
咱们再换一个维度看一下
核心
libuv
由事件循环和线程池组成,负责全部 I/O 任务的分发与执行在解决并发问题上,异步是最好的解决方案,能够拿排队和叫号机来理解
Node.js 其实就是帮咱们构建相似的机制。咱们在写代码的时候,实际上就是取号的过程,由 Event Loop 来接受处理,而真正执行操做的是具体的线程池里的 I/O 任务。之因此说 Node.js 是单线程,就是由于在接受任务的时候是单线程的,它无需进程/线程切换上下文的成本,很是高效,但它在执行具体任务的时候是多线程的。
Node.js 公开宣称的目标是 “旨在提供一种简单的构建可伸缩网络程序的方法”,毫无疑问,它确实作到了。这种作法将并发编程模型简化了,Event Loop和具体线程池等细节被 Node.js 封装了,继而将异步调用 Api 写法暴露给开发者。真是福祸相依,一方面简化了并发编程,另外一方面在写法上埋下了祸根,这种作法的好处是能让更多人垂手可得的写出高性能的程序!
在Node.js Bindings层作的事儿就是将 Chrome V8 等暴露的 C/C++
接口转成JavaScript Api,而且结合这些 Api 编写了 Node.js 标准库,全部这些 Api 统称为 Node.js SDK,后面模块章节会有更详细的讨论。
微软在2016年宣布在MIT许可协议下开放 Chakra 引擎,并以 ChakraCore
为名在 Github 上开放了源代码,ChakraCore
是一个完整的 JavaScript 虚拟机,它拥有着和 Chakra
几乎相同的功能与特性。微软向 Node.js 主分支提交代码合并请求,让 Node.js 用上 ChakraCore
引擎,即 nodejs/node-chakracore 项目。实际上微软是经过建立名为 V8 shim
的库的赋予了 ChakraCore
处理谷歌 Chrome V8 引擎指令的能力,其原理示意图以下
目前,Node.js 同时支持这2种 JavaScript 引擎,两者性能和特性上各有千秋,ChakraCore
在特性上感受更潮一些,曾经是第一个支持 Async函数
的引擎,但目前 Node.js 仍是以 Chrome V8 引擎为主, ChakraCore
版本须要单独安装,你们了解一下就好。
我总结的编程3种境界
你们能够自测一下,本身在哪一个水平?若是是第三个阶段,那么本场Live可能不太适合你。哈哈哈
Node不是语言,不是框架,只是基于V8运行时环境。结合libuv可以经过js语法得到更好的等价于c/c++的性能。
它很简单,异步是解决并发的最佳实践。本节主要讲如何学习Node.js,是本次Live很是核心的内容,你们要注意听。
1)js语法必须会
犀牛书,《JavaScript权威指南》,没事就多翻翻,看少多少遍都不为过。
2)我的学习和技术选型都要按部就班
能够看出个人思路,先能写,而后再追求更好的写法,好比面向对象。等团队水平到必定程度了,而且稳定的时候,能够考虑更加极致的函数式写法。
团队是这样选型的,我的学习也这样,最好是按部就班,步子迈大了很差。
3)各类高级的JavaScript友好语言
JavaScript友好语言指的是可以使用其余语法实现,但最终编译成js的语言。自从Node.js出现后,这种黑科技层出不穷。好比比较有名的coffee、typescript、babel(es)等。
CoffeeScript虽然也是JavaScript友好语言,但其语法借鉴ruby,崇尚极简,对于类型和OO机制上仍是偏弱,并且这么多年也没发展起来,仍然是比较小众的活着。将来比例会愈来愈少的。
显然TypeScript会愈来愈好,TypeScript 的强大之处是要用过才知道的。
当下前端发展速度极快,以指数级的曲线增加。之前可能1年都不必定有一项新技术,如今可能每月都有。大前端,Node全栈,架构演进等等都在快速变化。能够说,前端越复杂,有越多的不肯定性,TypeScript的机会就越大。
4)再论面向对象
面向对象想用好也不容易的,并且js里有各类实现,真是让人眼花缭乱。
对于es6高级特性,我是比较保守的,通常node长期支持版本lts支持的我都让用,一些更新的特性我通常不让使用。根本lts版本保持一致就好。
个人团队如今是采用es6的面向对象写法开发,后面会一点一点转到typescript上的。熟练oo转到ts是很是容易的。
3m安装法
node版本发布很是快,并且多版本共存可能性较大,推荐使用nvm来安装node
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.6/install.sh | bash $ echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc $ echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm' >> ~/.zshrc $ source ~/.zshrc $ nvm install 0.10 $ nvm install 4 $ nvm install 6 $ nvm install 8
https://registry.npmjs.com 是node官方的源(registry),服务器在国外,下载速度较慢,推荐安装nrm来切换源,国内的cnpm和taobao的源都很是快,固然,若是你想自建源也是支持的。
$ npm install --global nrm --registry=https://registry.npm.taobao.org $ nrm use cnpm
nrm切换完源以后,你安装npm模块的速度会更快。
$ npm install --global yarn
npm基本命令
名称 | 描述 | 简写 |
---|---|---|
npm install xxx | 安装xxx模块,但不记录到package.json里 | npm i xxx |
npm install --save xxx | 安装xxx模块,而且记录到package.json里,字段对应的dependency,是产品环境必须依赖的模块 | npm i -s xxx |
npm install --save-de 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 |
配合iterm2分屏 + spectacle全屏,几乎无敌
安装4个必备软件
我虽然不算vim党,但也深爱着。janus是一个很是好用的vim集成开发环境。好比ctrl-p、nerdtree等插件都集成了,对我这种懒人足够了。
关于Node.js的IDE和编辑器有不少选择,对好比下
名称 | 是否收费 | 断点调试 | 功能 |
---|---|---|---|
Webstorm | 收费 | 支持 | 是IDE,在代码提示、重构等方面功能很是强大,支持的各类语言、框架、模板也很是多,支持断点调试,好处是特别智能,缺点也是特别智能 |
Sublime/TextMate | 收费 | 不支持 | 编辑器里很是好用的,textmate主要针对mac用户,sublime是跨平台的,相信不少前端开发都熟悉 |
Vim/Emace | 免费 | 不支持 | 命令行下的编辑器,很是强大,难度也稍大,但更为酷炫,并且对于服务器部署开发来讲是值得一学的 |
VSCode/Atom | 免费 | 支持 | Atom比较早,功能强大,缺点稍卡顿,VSCode是微软出的,速度快,对于Node.js 调试,重构,代码提示等方面支持都很是好 |
Visual Studio Code是一个运行于 Mac、Windows和 Linux 之上的,针对于编写现代 Web 和云应用的跨平台源代码编辑器。它功能强大,便于调试,加上它自己也是基于 Node.js 模块 electron
构建的,尤为要推荐你们使用。
Visual Studio Code(如下简称vsc)
值得一学,我推荐VSCode编辑器!
更多调试方法,参见https://github.com/i5ting/nod...
《Node.js in action》一书里说,Node.js 所针对的应用程序有一个专门的简称:DIRT。它表示数据密集型实时(data-intensive real-time)程序。由于 Node.js 自身在 I/O 上很是轻量,它善于将数据从一个管道混排或代理到另外一个管道上,这能在处理大量请求时持有不少开放的链接,而且只占用一小部份内存。它的设计目标是保证响应能力,跟浏览器同样。
这话不假,但在今天来看,DIRT 仍是范围小了。其实 DIRT 本质上说的 I/O 处理的都算,但随着大前端的发展,Node.js 已经再也不只是 I/O 处理相关,而是更加的“Node”!
Node.js 使用场景主要分为4大类
nw.js/electron
、移动端 cordova
、HTML五、react-native
、weex
,硬件 ruff.io
等Vue
Angular
辅助开发,以及工程化演进过程(使用Gulp
/Webpack 构建 Web 开发工具)npm
上各类工具模块,包括各类前端预编译、构建工具 Grunt
/ Gulp
、脚手架,命令行工具,各类奇技淫巧等下面列出具体的 Node.js 的使用场景,以模块维度划分
分类 | 描述 | 相关模块 |
---|---|---|
网站 | 相似于 cnodejs.org 这样传统的网站 |
Express / Koa |
Api | 同时提供给移动端,PC,H5 等前端使用的 HTTP Api 接口 |
Restify / HApi |
Api代理 | 为前端提供的,主要对后端Api接口进行再处理,以便更多的适应前端开发 | Express / Koa |
IM即时聊天 | 实时应用,不少是基于 WebSocket 协议的 |
Socket.io / sockjs |
反向代理 | 提供相似于 nginx 反向代理功能,但对前端更友好 |
anyproxy / node-http-proxy / hiproxy |
前端构建工具 | 辅助前端开发,尤为是各类预编译,构建相关的工具,可以极大的提升前端开发效率 | Grunt / Gulp / Bower / Webpack / Fis3 / YKit |
命令行工具 | 使用命令行是很是酷的方式,前端开发自定义了不少相关工具,不管是shell命令,node脚本,仍是各类脚手架等,几乎每一个公司小组都会本身的命令行工具集 | Cordova / Shell.js |
操做系统 | 有实现,但估计不太会有人用 | NodeOS |
跨平台打包工具 | 使用 Web 开发技术开发PC客户端是目前最流行的方式,会有更多前端开发工具是采用这种方式的 | PC端的electron、nw.js,好比钉钉PC客户端、微信小程序IDE、微信客户端,移动的Cordova,即老的Phonegap,还有更加有名的一站式开发框架Ionicframework |
P2P | 区块链开发、BT客户端 | webtorrent / ipfs |
编辑器 | Atom 和 VSCode 都是基于 electron 模块的 |
electron |
物联网与硬件 | ruff.io和不少硬件都支持node sdk | ruff |
Node.js 应用场景很是丰富,好比 Node.js 能够开发操做系统,但通常我都不讲的,就算说了也没多大意义,难道你们真的会用吗?通常,我习惯将 Node.js 应用场景氛围7个部分。
1)初衷,server端,不想成了前端开发的基础设施
2)命令行辅助工具,甚至能够是运维
3)移动端:cordova,pc端:nw.js和electron
4)组件化,构建,代理
5)架构,先后端分离、api proxy
6)性能优化、反爬虫与爬虫
7) 全栈最便捷之路
编号 | 场景 | 说明 |
---|---|---|
1 | 反向代理 | Node.js能够做为nginx这样的反向代理,虽然线上咱们不多这样作,但它确确实实能够这样作。好比node-http-proxy和anyproxy等,其实使用Node.js作这种请求转发是很是简单的,在后面的http章节里,有单独的讲解。 |
2 | 爬虫 | 有大量的爬虫模块,好比node-crawler等,写起来比python要简单一些,尤为搭配jsdom(node版本的jQuery)类库的,对前端来讲尤为友好 |
3 | 命令行工具 | 全部辅助开发,运维,提升效率等等能够用cli作的,使用node来开发都很是合适,是编写命令行工具最简单的方式,java8之后也参考了node的命令行实现 |
4 | 微服务与RPC | node里有各类rpc支持,好比node编写的dnode,seneca,也有跨语言支持的grpc,足够应用了 |
5 | 微信公众号开发 | 相关sdk,框架很是多,是快速开发的利器 |
6 | 前端流行SSR && PWA | SSR是服务器端渲染,PWA是渐进式Web应用,都是今年最火的技术。若是你们用过,必定对Node.js不陌生。好比React、Vuejs都是Node.js实现的ssr。至于pwa的service-worker也是Node.js实现的。那么为啥不用其余语言实现呢?不是其余语言不能实现,而是使用Node.js简单、方便、学习成本低,轻松得到高性能,若是用其余语言,我至少还得装环境 |
能够说目前你们可以看到的、用到的软件都有 Node.js 身影,当下最流行的软件写法也大都是基于 Node.js 的,好比 PC 客户端 luin/medis 采用 electron
打包,写法采用 React + Redux。我本身一直的实践的【Node全栈】,也正是基于这种趋势而造成的。在将来,Node.js 的应用场景会更加的普遍,更多参见 sindresorhus/awesome-nodejs。
Node.js是为异步而生的,它本身把复杂的事儿作了(高并发,低延时),交给用户的只是有点难用的Callback写法。也正是坦诚的将异步回调暴露出来,才有更好的流程控制方面的演进。也正是这些演进,让Node.js从DIRT(数据敏感实时应用)扩展到更多的应用场景,今天的Node.js已经不仅是能写后端的JavaScript,已经涵盖了全部涉及到开发的各个方面,而Node全栈更是热门种的热门。
直面问题才能有更好的解决方式,Node.js的异步是整个学习Node.js过程当中重中之重。
我整理了一张图,更直观一些。从09年到如今,8年多的时间里,整个Node.js社区作了大量尝试,其中曲折足足够写一本书的了。你们先简单了解一下。
结论:Promise是必须会的,那你为何不顺势而为呢?
推荐:使用Async函数 + Promise组合,以下图所示。
其实,通常使用是不须要掌握上图中的全部技术的。对于初学者来讲,先够用,再去深究细节。因此,精简一下,只了解3个就足够足够用了。
结论
Node.js学习重点: Async函数与Promise
因此下面咱们会分个小部分进行讲解。
a)Error-first Callback
定义错误优先的回调写法只须要注意2条规则便可:
下面让咱们看一下调用函数示例,Node.js 文档里最常采用下面这样的回调方式:
function(err, res) { // process the error and result }
这里的 callback
指的是带有2个参数的函数:"err"和 "res"。语义上讲,非空的“err”至关于程序异常;而空的“err”至关于能够正常返回结果“res”,无任何异常。
b)EventEmitter
事件模块是 Node.js 内置的对观察者模式“发布/订阅”(publish/subscribe)的实现,经过EventEmitter
属性,提供了一个构造函数。该构造函数的实例具备 on
方法,能够用来监听指定事件,并触发回调函数。任意对象均可以发布指定事件,被 EventEmitter
实例的 on
方法监听到。
在node 6以后,能够直接使用require('events')
类
var EventEmitter = require('events') var util = require('util') var MyEmitter = function () { } util.inherits(MyEmitter, EventEmitter) const myEmitter = new MyEmitter(); myEmitter.on('event', (a, b) => { console.log(a, b, this); // Prints: a b {} }); myEmitter.emit('event', 'a', 'b');
和jquery、vue里的Event是很是相似的。并且前端本身也有EventEmitter。
c)如何更好的查Node.js文档
API是应用程序接口Application Programming Interface的简称。从Node.js异步原理,咱们能够知道,核心在于 Node.js SDK 中API调用,而后交由EventLoop(Libuv)去执行,因此咱们必定要熟悉Node.js的API操做。
Node.js的API都是异步的,同步的函数是奢求,要查API文档,在高并发场景下慎用。
笔者推荐使用 Dash 或 Zeal 查看离线文档,常常查看离线文档,对Api理解会深刻不少,比IDE辅助要好,能够有效避免离开IDE就不会写代码的窘境。
回调地狱
Node.js 由于采用了错误优先的回调风格写法,致使sdk里导出都是回调函数。若是组合调用的话,就会特别痛苦,常常会出现回调里嵌套回调的问题,你们都很是厌烦这种写法,称之为Callback Hell,即回调地狱。一个经典的例子来自著名的Promise模块q文档里。
step1(function (value1) { step2(value1, function(value2) { step3(value2, function(value3) { step4(value3, function(value4) { // Do something with value4 }); }); }); });
这里只是作4步,嵌套了4层回调,若是更多步骤呢?不少新手浅尝辄止,到这儿就望而却步,粉转黑。这明显不够成熟,最起码你要看看它的应对解决方案吧!
Node.js 约定全部Api都采用错误优先的回调方式,这部分场景都是你们直接调用接口,无太多变化。而Promise是对回调地狱的思考,或者说是改良方案。目前使用很是广泛,能够说是在async函数普及以前惟一一个通用性规范,甚至 Node.js 社区都在考虑 Promise 化,可见其影响之大。
Promise最先也是在commonjs社区提出来的,当时提出了不少规范。比较接受的是promise/A规范。后来人们在这个基础上,提出了promise/A+规范,也就是实际上如今的业内推行的规范。ES6 也是采用的这种规范。
Promise意味着[许愿|承诺]一个尚未完成的操做,但在将来会完成的。与Promise最主要的交互方法是经过将函数传入它的then方法从而获取得Promise最终的值或Promise最终最拒绝(reject)的缘由。要点有三个:
1)定义
var promise = new Promise(function(resolve, reject) { // do a thing, possibly async, then… if (/* everything turned out fine */) { resolve("Stuff worked!"); } else { reject(Error("It broke")); } });
每一个Promise定义都是同样的,在构造函数里传入一个匿名函数,参数是resolve和reject,分别表明成功和失败时候的处理。
2)调用
promise.then(function(text){ console.log(text)// Stuff worked! return Promise.reject(new Error('我是故意的')) }).catch(function(err){ console.log(err) })
它的主要交互方式是经过then函数,若是Promise成功执行resolve了,那么它就会将resolve的值传给最近的then函数,做为它的then函数的参数。若是出错reject,那就交给catch来捕获异常就行了。
Promise 的最大优点是标准化,各种异步工具库都按照统一规范实现,即便是async函数也能够无缝集成。因此用 Promise 封装 API 通用性强,用起来简单,学习成本低。在async函数普及以前,绝大部分应用都是采用Promise来作异步流程控制的,因此掌握Promise是Node.js学习过程当中必需要掌握的重中之重。
Bluebird是 Node.js 世界里性能最好的Promise/a+规范的实现模块,Api很是齐全,功能强大,是原生Promise外的不二选择。
好处以下:
限于时间关系,这里就不一一列举了,仍是那句话,在学习Node.js过程当中,对于Promise了解多深刻都不过度。
推荐学习资料
Async/Await是异步操做的终极解决方案,Koa 2在node 7.6发布以后,立马发布了正式版本,而且推荐使用async函数来编写Koa中间件。
这里给出一段Koa 2应用里的一段代码
exports.list = async (ctx, next) => { try { let students = await Student.getAllAsync(); await ctx.render('students/index', { students : students }) } catch (err) { return ctx.api_error(err); } };
它作了3件事儿
是否是很是简单,如今Eggjs里也都是这样同步的代码。
4.1 正常写法
const pkgConf = require('pkg-conf'); async function main(){ const config = await pkgConf('unicorn'); console.log(config.rainbow); //=> true } main();
变态写法
const pkgConf = require('pkg-conf'); (async () => { const config = await pkgConf('unicorn'); console.log(config.rainbow); //=> true })();
4.2 await + Promise
const Promise = require('bluebird'); const fs = Promise.promisifyAll(require("fs")); async function main(){ const contents = await fs.readFileAsync("myfile.js", "utf8") console.log(contents); } main();
4.3 await + co + generator
const co = require('co'); const Promise = require('bluebird'); const fs = Promise.promisifyAll(require("fs")); async function main(){ const contents = co(function* () { var result = yield fs.readFileAsync("myfile.js", "utf8") return result; }) console.log(contents); } main();
要点
在generator里能够使用yield,而yield后面接的有5种可能,故而把这些能够yield接的方式成为yieldable,便可以yield接的。
由上面3中基本用法能够推出Async函数要点以下:
综上所述
小结
这部分共讲了4个小点,都是极其直接的必须掌握的知识点。
这里再提一下关于Node.js源码阅读问题,不少人api都还没完熟练就去阅读源码,这是很是不同意的,不带着问题去读源码是比较容易迷失在大量代码中的。效果并很差。
先用明白,而后再去阅读Node.js源码,而后探寻libuv并发机制。不少人买了朴大的《深刻浅出Node.js》一书,看了以后仍是不太会用,不是书写的很差,而是步骤不对。
我通常给你们的推荐是把Node in action读上5遍10遍,入门干活足够了。剩下的就是反复实践,多写代码和npm模块就好。
目前全部的书籍几乎都有点过期了,大部分都是Node.js v0.10左右的版本的,我得新书是基于Node.js 8版本的,预计2018年3月或4月出版。别催我,真无法更快了。
目录
博文视点的美女编辑在苦逼的整理中,预计出版在3月以后(不要催我,我也无法说),20章,800页+,订价预计在130+。
通常,后端开发指的是 Web 应用开发中和视图渲染无关的部分,主要是和数据库交互为主的重业务型逻辑处理。但如今架构升级后,Node.js 承担了先后端分离重任以后,有了更多玩法。从带视图的传统Web应用和面向Api接口应用,到经过 RPC 调用封装对数据库的操做,到提供前端 Api 代理和网关,服务组装等,统称为后端开发,再也不是以往只有和数据库打交道的部分才算后端。这样,就可让前端工程师对开发过程可控,更好的进行调优和性能优化。
对 Node.js 来讲,一直没有在后端取得其合理的占有率,缘由是多方面的,暂列几条。
尽管如此,Node.js 仍是尽人皆知,卷入各类是非风口,也算是在大前端浪潮中大红大紫。缘由它的定位很是明确,补足以 JavaScript 为核心的全栈体系中服务器部分。开发也是人,可以同时掌握并精通多门语言的人毕竟很少,并且程序员的美德是“懒”,能使用 JavaScript 一门语言完成全部事儿,为何要学更多呢?
对于 Web 应用大体分2种,带视图的传统Web应用和面向Api接口应用,咱们先看一下 Node.js Web 应用开发框架的演进时间线大体以下:
co
这个 Generator 执行器,并开始了Koa 项目。2013 年下半年李成银开始 ThinkJS,参考 ThinkPHPco
和 generator实现同步逻辑,那时候 co
仍是基于 thunkfy
的,在2015年10月30日,ThinkJS发布了首个基于 Es2015+ 特性开发的 v2.0 版本咱们能够根据框架的特性进行分类
框架名称 | 特性 | 点评 |
---|---|---|
Express | 简单、实用,路由中间件等五脏俱全 | 最著名的Web框架 |
Derby.js && Meteor | 同构 | 先后端都放到一块儿,模糊了开发便捷,看上去更简单,实际上上对开发来讲要求更高 |
Sails、Total | 面向其余语言,Ruby、PHP等 | 借鉴业界优秀实现,也是 Node.js 成熟的一个标志 |
MEAN.js | 面向架构 | 相似于脚手架,又指望同构,结果只是蹭了热点 |
Hapi和Restfy | 面向Api && 微服务 | 移动互联网时代Api的做用被放大,故而独立分类。尤为是对于微服务开发更是利器 |
ThinkJS | 面向新特性 | 借鉴ThinkPHP,并慢慢走出本身的一条路,对于Async函数等新特性支持,无出其右,新版v3.0是基于Koa v2.0的做为内核的 |
Koa | 专一于异步流程改进 | 下一代Web框架 |
Egg | 基于Koa,在开发上有极大便利 | 企业级Web开发框架 |
对于框架选型
Tips:我的学习求新,企业架构求稳,无非喜爱与场景而已
Node.js 原本就为了作后端而设计的,这里咱们再看看利益问题。Node.js 向后端延伸,必然会触动后端开发的利益。那么 Proxy 层的事儿,先后端矛盾的交界处,后端不想变,前端又求变,那么久而久之,Api接口会变得愈来愈恶心。后端是愿意把Api的事儿叫前端的,对后端来讲,只要你不动个人数据库和服务就能够。
可是 Node.js 能不能作这部分呢?答案是能的,这个是和 Java、PHP 相似的,通常是和数据库链接到一块儿,处理带有业务逻辑的。目前国内大部分都是以 Java、PHP 等为主,因此要想吃到这部分并不容易。
国内这部分一直没有作的很好,因此 Node.js 在大公司尚未很好的被应用,安全问题、生态问题、历史遗留问题等,还有不少人对 Node.js 的误解。
MongoDB
、MySQL
、Redis
等仍是至关不错,但其余的数据库支持可能没那么好。这些对于提供Api服务来讲已经足够了,本书后面有大量篇幅讲如何使用 Koa 框架来构建Api服务。
Web编程核心
Node.js 编写的包管理器 npm 已成为开源包管理了领域最好的生态,直接到2017年10月份,有模块超过47万,每周下载量超过32亿次,每月有超过700万开发者使用npm。如今早已经超过60万个模块了。
这里就不一一举例了,给出一个迷茫时学习Node.js最好的方法吧!
某天,我在3w咖啡整理书稿,而后小弟梁过来了,聊聊他的现状,一副很很差的样子,在天津我曾带过他大半年,总不能无论,我给他的建议是:“天天看10个npm模块”
对于学习Node.js迷茫的人来讲,这是最好的方式,当你不知道如何作的时候,就要向前(钱)看,你要知道积累哪些技能对之后有好处。对于学习Node.js必经之路,必定是要掌握不少模块用法,并从中汲取技巧、思路、设计思想的。与其不知道学什么,为何不天天积累几个技巧呢?
推荐一个repo即 https://github.com/parro-it/a... 小型库集合,一天看十个不是梦!
更多讨论 https://zhuanlan.zhihu.com/p/...
有朋友提问
狼叔,关注你和cnode好久了,最近有点迷茫,想请你指点下。 个人状况是这样的,非科班出身,从事前端工做4年,公司使用的技术栈是vue二、vue-router、vuex、webpack,目前的能力处理工做仍是比较轻松,可是也很明确本身有不少不足,只是对于如何提高比较迷茫。 不足: 一、非科班出身,计算机基础薄弱 二、对当前使用的技术了解不够深刻,不少东西只停留在会用的层面 三、对服务端了解较少,想学node,殊不知道如何系统的学习
解答困惑:
一、计算机基础薄弱该如何完善本身的知识体系?
答:追逐长尾,所见所闻不懂的都去学就好啦。我是这样过来的,头几年天天14个小时+,很累,不过效果还能够。os,算法,数据结构,设计模式,编译原理,基本也就这些重点。作到天天都有进步就好,别贪多求快。数学和英文固然也是越狠越好的!
二、如何在技术上作更深刻的探索?
答:技术人只关注技术,想法创意一般比较少。最简单的办法就是抓本身的痒,比我大学时和朋友们翻译过grails文档,因此对翻译有情节。为了翻译,我用node写了无数工具尝试,反复对比各类翻译工具,理解它们背后的设计。包括markdown里嵌html标签标识中英文,而后gulp编译成独立文档。甚至一度想上线卖服务。这种折腾真的很爽,甚至耽误了很多翻译。有时要警戒长尾,不要忘了本身的初衷
三、如何系统的学习node?
答:阶段
1/要会用,能完成工做任务
2/写点提升效率的工具
3/参与开源项目,甚至是node源码
应对方法
1/《node in action》看五遍,而后就去写吧,别管代码质量如何,能写敢写
2/多用些模块,理解它们,若是有机会就本身写一下,万一有不少人用你,我小弟写过一个地区选择加载的json数据,star数很多呢
3/给别人贡献代码,要去学别人的习惯,网上有git标准工做流和提pr方法,你要作的是精研该模块代码,关注issue,其余就是等机会。另外朴灵的深刻浅出多读几遍,试着读node源码,你的理解会更好。推荐看看我写的《经过开源项目去学习》https://github.com/i5ting/Stu...
4/跳出node范围,从新审视node的应用场景,对将来你的技术选项和决策大有裨益
答:若是有机会就直接上Web应用,若是没有机会就从前端构建,工具等方面开始作,慢慢引入更潮更酷的前端技术,天然就把Node引入进来了。不要急。
答:初学者推荐Express,若是有必定经验,推荐Koa。固然真正项目里仍是推荐Eggjs和Thinkjs这样的框架。
答:
1)Node in action和了不得的Node.js是入门的绝好书籍,很是简单,各个部分都讲了,但不深刻,看了以后,基本就能用起来了
2)当你用了一段以后,你会对Node.js的运行机制好奇,为啥呢?这时候去读朴大的《深刻浅出Node.js》一书就可以解惑。缘由很简单,九浅一深一书是偏向底层实现原理的书,从操做系统,并发原理,node源码层层解读。若是是新手读,不免会比较郁闷。
3)实践类的能够看看雷宗民(老雷)和赵坤(nswbmw)写的书
若是你不着急,也能够等个人那本《更了不得的Node.js》,时间待定。
有朋友问如今Android开发和web前端开发哪一个前景更好?个人回答是明显是前端更好,看一下移动端发展过程
native < hybrid < rn/weex < h5
目前rn和weex的开发逐渐变得主流,组件化写法已经由前端主导了。之前ios和android程序员占比很高,但如今就留1到2个写插件,真是差异很大。
Web开发对移动端的冲击很是大。固然如今Web技术也开发PC client了,好比vscode是经过electron打包的,效果仍是至关不错的。
前端能够说是最近几年开发里最火的部分,缘由不少,最主要是开发方式的变动,以今时今日的眼光来看,称之为现代Web开发是不为过的。
先给出现代Web开发的概览图
每次演讲我会都问你们是否是前端,回答“是”的人很是多,我会开玩笑的恭喜你们:“如今的前端就是钱端”,确实,如今前端发展异常的快,并且没有趋向于类比java里ssh框架的那种稳定,因此将来很长一段时间,还会增加,持续混乱,这对前端来讲是把双刃剑,一方面有很强的压迫感,不学习就跟不上时代,另外一方它也是机遇,可以带给更多机会,包括money。
你们都疑惑的一个问题是如何在这样巨变的时代可以经过学习来应变,我能够很负责的告诉你们,没有捷径,但经过掌握 Node.js 可以让你下降这个学习曲线而已,毕竟Node.js是大前端的基础设施。你们能够看一下,前端的开发过程,模块化,构建,辅助工具,调优,架构调整,能够说Node.js是无处不在的。
其实,辅助大前端开发只是Node.js的一个很是无意插柳的衍生功能,经过掌握Node.js可以让你能作的更多、得到的更多,甚至能够说有更多自我实现的快乐,这也是我那本书书名字里“更了不得的”要去阐述的内容。
综上种种,就是我一直提倡以 JavaScript 语言为中心的 Node全栈
概念的原因,JavaScript 覆盖全部前端,Node.js 擅长作 I/O 密集型的后端,外加辅助开发的各类基础设施,无疑是工做、学习和成为快速掌握全栈技术最好的途径。你会的越多,你能作的就更多,你的人生也将会有不同的精彩篇章。
全栈核心
只要打通这2个要点,其余就比较容易了。最怕的是哪样都接触点,而后就号称本身是全栈,建议你们不要这样作,这就比如在简历里写精通同样,基本上都会被问到尴尬。全栈是一种信仰,不是拿来吹牛逼的,而能够解决更多问题,让本身的知识体系不留空白,享受自我实现的极致快乐。
想问一下狼叔最近的业务一直都是简单的用express搭一个后端服务,没有其余更加深刻node的业务了,这种时候应该如何本身给本身创应用场景呢
没有目标就向钱看,有目标就向前看
既然没法逃避,就热爱它,最后变成兴趣
人生不仅有代码,但它能让我快乐,终生受益
也曾懵懂,也曾迷茫,但我这人比较傻,一直信奉:“一次只作1件事儿,尽力作到极致”,短期看这是比较傻的,但一旦你坚持下去,你就会发现技术实际上是门手艺,厚积薄发。
我没办法说本身最擅长什么,但在什么场景下用什么技术是我擅长的。或者说,应变是我最大的本事。不少框架,新技术我都没见过,用过,但花一点点过一下,就能拿已有的知识快速的理解它,这实际上是长期学习的好处。
如今愈来愈忙,写代码的时间愈来愈少,技术又愈加展越快,我能作好的就是每日精进,仗着这点已有的知识储备跟年轻人比赛。我不以为累,相反我很享受这种感受,没有被时代淘汰,是一件多么幸福的事儿。
作后端的人
4阶段按部就班,build 与工具齐飞
前端开发4阶段,个人感受是按照顺序,按部就班就好。
从前端日后端转,api 接口很是容易学会,像 express、koa 这类框架大部分人一周就能学会,最难的是对 db、er 模型的理解,说直白点,仍是业务需求落地的理解
咱们来想一想通常的前端有什么技能?
那么他们若是想在前端领域作的更深有哪些难点呢?
以上皆是痛点,因此比较好的办法应该是这样的。
从咱们的经验看,这样是比较靠谱的。先作最简单先后端分离,里面没有任何和db相关,前端能够很是容易的学会,基本2周就已经很是熟练了。通常半年后,让他们接触【异步流程处理】和【数据库】相关内容,学习后端代码,就能够全栈了。
看一下移动端发展过程
native < hybrid < rn/weex < h5
目前rn和weex的开发逐渐变得主流,组件化写法已经由前端主导了。之前ios和android程序员占比很高,但如今就留1到2个写插件,真是差异很大。狼叔一直执拗的觉得将来是h5的。
如今的 Native 开发是姥姥不疼舅舅不爱,很是尴尬,很明显连培训出的人就业不要工资混经验就很明显了。另外领导们也都在惦记,能不能用 H5 写?这还算是保守的,若是直接激进的就直接上 RN 了,那么 Native开发的程序员就变了
一个写插件的程序员...招谁惹谁了。。。。
要么忍,要么转,没办法,认命吧,温水里舒服了几年,也该学点东西了
原生开发就是 iOS 用 OC/Swift,Android 用 java 或 scala 等,就算偶尔嵌入 webview,能玩js的机会也很是好少
因此移动端转全栈的方法,最好是从 cordova(之前叫 phonegap)开始作 hybrid 开发。
只要入了 H5 的坑,其实就很是好办了。
这个基本上是我走的路,从2010年写iOS、作phonegap(当时是0.9.3)、一路走到如今的总结吧!
之前技术发展还不是那么明显,写 Java 的时候 Apache
的开源用的比较多,那时开源的代码托管sourceforge
,google code
也都凑合用,自从 Git
和 GitHub
出现时候,代码社交兴起,极大的促进了开源的活跃,使得大量明星项目脱引而出。这是好事,若是没有开源,中国的软件水平真是要落后好多年。那么问题也来了,如何可以在技术快速发展的今天,我的成长也能更好呢?
学习的3种层次,跟人学最快,其次是跟书(或者博客)学,最差的是自悟。可是牛人不能遇到,遇到了也未必有精力教你,书本或者博客,别人有,但不必定写出来,就算是写了,可能只是点到为止。至于自悟,若是没有深厚的积累的,仍是有至关大难度的。
对于开发来讲代码是一切基础,在掌握了必定计算机基础后,其差异就在于代码质量和眼界。编程没有捷径,可以作到每日精进就是极好的。如今开源代码很是多,要可以从中获取本身所需的知识,也是一种本领!若是可以坚持着每日精进,根本不须要向其余人学习的。
你们能够在 Github 随便打开一个前端项目,里面有一半以上都是 Node.js 相关信息,各类包管理、测试、ci、辅助模块,若是你们对这些基础信息掌握的很是好,那么学习一个新的框架,你要比别人快好多,最重要的是学了一次,处处使用。
不少人问我怎么才能成为一个 Node.js 大神?个人回答是“在cnode论坛上坚持写文章和开源项目2年,足矣,轻松进阿里腾讯,不用你找他们,他们自会找你的”。
从今天起,开始重视开源项目,重视 node,作到每日精进
先说下个人招人标准,作技术总监时上指下派只要看好技术能力和态度便可,作CTO时要考虑团队文化,人品和可否在公司长留,因此不一样的人面试要看的点是不同的,我曾面过不少Node.js程序员,也见过不少面试题,汇总一下,大体有如下9个点:
补充一句:只看技能没人品的人,千万别招,白脸狼
主动执行,辅助团队
掌握一门后端语言;熟悉用户体验相关知识;了解软件工程。
精通浏览器工做原理,熟悉HTTP协议,熟悉设计模式。
掌握改善无障碍访问的方法;掌握数据采集分析能力;熟悉可维护性问题。
经过开发、使用、推广效率工具让本身与团队的效率获得提升;
提炼可复用组件,为类库贡献高质量代码.
积极完善知识库;
跨团队分享技术和专业相关知识。
辅导新人技能成长;
协助主管作招聘和团队管理工做。
我再知乎上回复的《在跳槽后的第三个月,收到世界500强的offer,我该怎么办?》
1)互联网公司优先,流量大,人才多,机会也多,流程规范一些
2)今天的世界500强不比从前了,普华永道应该是四大之一,不知道信息化怎么样,你只要和你如今的公司对比就行了。
3)问问本身想要什么,钱,经历,仍是时间
若是你很年轻,如今很安逸,我建议你换。若是不是很想动,那就学会全部能接触到的知识再换。
我是降薪来的阿里,缘由有三,一是有事可为,老板重用你给你机会,二是集团内部是open的,恰恰我知识面足够能够看出它们的好处,算是另外一种补偿吧,三是对我的品牌是一个升级,狼叔的职业生涯到此已经足够了,进可攻退可守,也算另外一种自由吧!
钱可能是个优点而已,还有氛围,文化,信仰
前几天还和 @苏千 聊,我和 @死月絲卡蕾特 相继入职阿里,还有cnode社区著名程序员也即将入职阿里,当时你们开玩笑说:
“前端的终极归宿是阿里,不是在阿里,就是在去阿里的路上”
另外要说的一点是pc和h5站在使用Node.js作api中间层,其最佳实践已成型,量也是极大的。之前前端玩得仍是比较弱,若是可以缓存+控制页面数据,得到一个性能极大的提高也是极好的。2018年,争取拿这个作主题演讲上qcon或archsummit大会。
天天忙得很开心,这就是我如今状态。其实,个人折腾仍是在于想作些事情。若是你也想跟我一块儿作事,请将简历邮件给我 langshu.ssl@alibaba-inc.com,团队大量招人,也能够帮忙推荐给集团其余部门。
大公司的作事方式
小公司
狼叔常常说的一句:“少抱怨,多思考,将来更美好”,大部分人都喜欢积极的人,遇到问题不怕不躲不避,要相信本身可以解决,最可能是时间问题。
还有一句是:“没目标向钱看,有目标向前看”。历史上不少这样的例子,在2010年左右iOS开发刚起步,会拖拽弄个界面的就五位数工资,比作JAVA的几年的都要多。这世界就是这样不公平。可是你也不能不思进取,这样也是极其危险。在2016年左右,其实iOS开发就遇到了市场饱和的问题,不少培训出来的人都找不到工做,各家公司都在考虑换react-native或weex或者h5。
因此,当你有机会进入一个颇有前途的方向,你要努力学好,并准备好下一个阶段的应变。相反,若是当成找一个养老的地方,迟早会遇到尴尬的。好比如今不少iOS程序员被迫去学react/vue等,境遇也不太好的,更有甚者直接被开除。
职位描述
职位要求
PixelLab是与淘宝GM Lab联合成立的专一于视频算法方向的研发部门,主要涉及视频的空间感知、轨迹跟踪、图像分割、遮挡检测以及照片级渲染等相关技术。用于实现视频内的内容植入与后期特效的研发,属于视频MR的场景,主要应用于广告植入平台的研发,方向靠谱老板人好,欢迎推荐。主要须要的岗位包括了图像算法、3D视觉算法,渲染算法,WebGL以及并行计算等几大方向,由于算法类招聘实在难,因此将JD的连接帖出来但愿同事们有适合的人能够内推一下。
岗位要求:
1) 本科及以上学历,5年以上工做开发经验;
2) 扎实的计算几何基础,熟悉常见数学工具;
3) 熟练WebGL, Canvas渲染开发,熟练Shader编写, 熟悉Three.js, OSG.js者优先;
4) 熟练运用JavaScript语言与HTML五、CSS3等技术;
5) 熟悉主流移动浏览器的技术特色,有移动端H5, WebGL项目经验者优先;
6) 有移动端WebGL开发经验者优先;
6) 学习能力强、应变能力强,优秀的沟通能力和协调能力,执行能力强,具有较强的团队合做精神。
岗位要求:
咱们的前端专业建设方向
目前北京,杭州,广州,上海,深圳,成都都在招聘,若是你也想跟我一块儿共事,请将简历邮件给我 langshu.ssl@alibaba-inc.com,团队大量招人,也能够帮忙推荐给集团其余部门。
有机会和winter,勾股,玉伯,苏千,朴灵、死马、偏右,徐飞,阮一峰,天猪,裕波等大神一块儿工做哦。
悄悄地说,其实其余公司我也能够帮推荐。
年轻时死磕,年长点让小弟死磕,如今抓个专家一块儿吃饭,没有什么是一顿饭解决不了的,不行就二顿
工程师的能力不是编码和死磕,而是解决问题
强调30岁不是我创造的,大部分人都会认为30岁后事情,压力会明显大得多,好比家庭,孩子,房子,车子,票子,甚至是管理,权利,欲望等等吧。我感觉最深的是身体不如从前和记忆力明显降低。
狼叔说: “少抱怨,多思考,将来更美好”
大部分人体会不到坚持的乐趣,不会玩,因此抱怨多。其实玩出乐趣也是一种能力,尤为是像写代码这种看似无聊的事儿。最开始可能只想赚点钱,后面变成热爱,这样才美好。只要坚持每日精进开心就行了。
另外,时间也要好到处理,狼叔总会提菜根谭上的一句话:【闲时要有吃紧的心思,忙里要有偷闲的乐趣】。
每一个人的一辈子中都有不少坎,相似于瓶颈,惟有苦难和坚持才能冲破,坚持会产生自信,苦难会创造机会。一个通过苦难还有自信的人,必定会有更美好的将来。
若是你们还有问题,能够去cnode社区发帖at我,也能够在Node全栈公众号提问。
答疑有点多,这里就不一一贴出来,若是是新用户和比较迷茫的Node朋友去Live里听吧。