【全文】狼叔:如何正确的学习Node.js

说明

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

【全文】狼叔:如何正确的学习Node.js

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

  • 2.1 Node 用途那么多,我该从哪里学起?
  • 2.2 Node Web 框架那么多,我该怎么选?
  • 2.3 关于 Node 的书几乎都过期了,我该买哪本?

Part 3延伸:大前端变化那么快,如何才能作到每日精进?

Part 4实践:从招聘角度来看, Node.js 开发须要具有哪些技能?

Part 5答疑:回答你们的问题

本次Live主要是科普,适用新用户和比较迷茫的Node朋友,但愿你们多多理解和支持。

Part 0 :Node.js简介

a)Node.js简介
b)什么是Node.js?
c)基本原理

a)Node.js简介

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,同时没有异步回调烦恼。

b)什么是Node.js?

按照 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.

从这段介绍来看,解读要点以下

  • Node.js 不是 JavaScript 应用,不是语言(JavaScript 是语言),不是像 Rails(Ruby)、 Laravel(PHP) 或 Django(Python) 同样的框架,也不是像 Nginx 同样的 Web 服务器。Node.js 是 JavaScript 运行时环境
  • 构建在 Chrome's V8 这个著名的 JavaScript 引擎之上,Chrome V8 引擎以 C/C++ 为主,至关于使用JavaScript 写法,转成 C/C++ 调用,大大的下降了学习成本
  • 事件驱动(event-driven),非阻塞 I/O 模型(non-blocking I/O model),简单点讲就是每一个函数都是异步的,最后由 Libuv 这个 C/C++ 编写的事件循环处理库来处理这些 I/O 操做,隐藏了非阻塞 I/O 的具体细节,简化并发编程模型,让你能够轻松的编写高性能的Web应用,因此它是轻量(lightweight)且高效(efficient)的
  • 使用 npm 做为包管理器,目前 npm 是开源库里包管理最大的生态,功能强大,截止到2017年12月,模块数量超过 60 万+

大多数人都认为 Node.js 只能写网站后台或者前端工具,这实际上是不全面的,Node.js的目标是让并发编程更简单,主要应用在以网络编程为主的 I/O 密集型应用。它是开源的,跨平台,而且高效(尤为是I/O处理),包括IBM、Microsoft、Yahoo、SAP、PayPal、沃尔玛及GoDaddy都是 Node.js 的用户。

c)基本原理

下面是一张 Node.js 早期的架构图,来自 Node.js 之父 Ryan Dahl 的演讲稿,在今天依然不过期,它简要的介绍了 Node.js 是基于 Chrome V8引擎构建的,由事件循环(Event Loop)分发 I/O 任务,最终工做线程(Work Thread)将任务丢到线程池(Thread Pool)里去执行,而事件循环只要等待执行结果就能够了。

14912763353044.png

核心概念

  • Chrome V8 是 Google 发布的开源 JavaScript 引擎,采用 C/C++ 编写,在 Google 的 Chrome 浏览器中被使用。Chrome V8 引擎能够独立运行,也能够用来嵌入到 C/C++ 应用程序中执行。
  • Event Loop 事件循环(由 libuv 提供)
  • Thread Pool 线程池(由 libuv 提供)

梳理一下

  • Chrome V8 是 JavaScript 引擎
  • Node.js 内置 Chrome V8 引擎,因此它使用的 JavaScript 语法
  • JavaScript 语言的一大特色就是单线程,也就是说,同一个时间只能作一件事
  • 单线程就意味着,全部任务须要排队,前一个任务结束,才会执行后一个任务。若是前一个任务耗时很长,后一个任务就不得不一直等着。
  • 若是排队是由于计算量大,CPU 忙不过来,倒也算了,可是不少时候 CPU 是闲着的,由于 I/O 很慢,不得不等着结果出来,再往下执行
  • CPU 彻底能够无论 I/O 设备,挂起处于等待中的任务,先运行排在后面的任务
  • 将等待中的 I/O 任务放到 Event Loop 里
  • 由 Event Loop 将 I/O 任务放到线程池里
  • 只要有资源,就尽力执行

咱们再换一个维度看一下

14992384974942.png

核心

  • Chrome V8 解释并执行 JavaScript 代码(这就是为何浏览器能执行 JavaScript 缘由)
  • 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 引擎指令的能力,其原理示意图以下

15018598977763.jpg

目前,Node.js 同时支持这2种 JavaScript 引擎,两者性能和特性上各有千秋,ChakraCore 在特性上感受更潮一些,曾经是第一个支持 Async函数 的引擎,但目前 Node.js 仍是以 Chrome V8 引擎为主, ChakraCore 版本须要单独安装,你们了解一下就好。

Part 1前言:学习 Node.js 的三个境界

我总结的编程3种境界

  • 打日志:console.log
  • 断点调试:断点调试:node debugger 或node inspector 或vscode
  • 测试驱动开发(tdd | bdd)

你们能够自测一下,本身在哪一个水平?若是是第三个阶段,那么本场Live可能不太适合你。哈哈哈

Part 2准备:如何学习Node.js

Node不是语言,不是框架,只是基于V8运行时环境。结合libuv可以经过js语法得到更好的等价于c/c++的性能。

它很简单,异步是解决并发的最佳实践。本节主要讲如何学习Node.js,是本次Live很是核心的内容,你们要注意听。

基础学习

1)js语法必须会

  1. js基本语法,都是c语系的,有其余语言背景学习起来相对更简单
  2. 常见用法,好比正则,好比数据结构,尤为是数组的几种用法。好比bind/call/apply等等
  3. 面向对象写法。js是基于对象的,因此它的oo写起来很是诡异。参见红皮书JavaScript高级编程,不少框架都是本身实现oo基础框架,好比ext-core等。

犀牛书,《JavaScript权威指南》,没事就多翻翻,看少多少遍都不为过。

2)我的学习和技术选型都要按部就班

  1. 先能写,采用面向过程写法,简单理解就是定义一堆function,而后调用,很是简单
  2. 而后再追求更好的写法,能够面向对象。对于规模化的编程来讲,oo是有它的优点的,通常java、c#,ruby这些语言里都有面向对象,因此后端更习惯,但对于语言经验不那么强的前端来讲算高级技巧。
  3. 等oo玩腻了,能够有更好的追求:函数式编程,不管编程思惟,仍是用法上都对已有的编程思惟是个挑战。我很喜欢函数式,但不太会在团队里使用,毕竟oo阶段还没彻底掌握,风险会比较大。但若是团队水平都很是高了,团队稳定是能够用的。

能够看出个人思路,先能写,而后再追求更好的写法,好比面向对象。等团队水平到必定程度了,而且稳定的时候,能够考虑更加极致的函数式写法。

团队是这样选型的,我的学习也这样,最好是按部就班,步子迈大了很差。

3)各类高级的JavaScript友好语言

JavaScript友好语言指的是可以使用其余语法实现,但最终编译成js的语言。自从Node.js出现后,这种黑科技层出不穷。好比比较有名的coffee、typescript、babel(es)等。

CoffeeScript虽然也是JavaScript友好语言,但其语法借鉴ruby,崇尚极简,对于类型和OO机制上仍是偏弱,并且这么多年也没发展起来,仍然是比较小众的活着。将来比例会愈来愈少的。

显然TypeScript会愈来愈好,TypeScript 的强大之处是要用过才知道的。

  • 1)规模化编程,像Java那种,静态类型,面向对象,前端只有TypeScript能作到
  • 2)亲爹是微软安德斯·海尔斯伯格,不知道此人的请看borland传奇去
  • 3)开源,将来很好
  • 4)组合拳:TypeScript + VSCode = 神器

当下前端发展速度极快,以指数级的曲线增加。之前可能1年都不必定有一项新技术,如今可能每月都有。大前端,Node全栈,架构演进等等都在快速变化。能够说,前端越复杂,有越多的不肯定性,TypeScript的机会就越大。

4)再论面向对象

面向对象想用好也不容易的,并且js里有各类实现,真是让人眼花缭乱。

  • 基于原型的写法,纵观JavaScript高级编程,就是翻来覆去的讲这个,这个很基础,但很差是很好用。能够不用,但不能够不会。
  • 本身写面向对象机制是最好的,但不是每一个人都有这个能力的。好在es6规范出了更好一点的面向对象,经过class、extends、super关键字来定义类,已经明显好不少了,虽然还很弱,但起码勉强能用起来了。从面向过程走过来的同窗,推荐这种写法,简单易用。但要注意面向对象要有面向对象的写法,要理解抽象,继承,封装,多态4个基本特征。若是想用好,你甚至还须要看一些设计模式相关的书。好在有《JavaScript设计模式》一书。Koa2里已经在用这种写法了。
  • js是脚本语言,解释便可执行。因此它的最大缺点是没有类型系统,这在规模化编程里是很是危险的,一个函数,传参就能玩死人。因而如今流行使用flow和typescript来作类型校验。flow只是工具,比较轻量级。而typescript是es6超级,给es6补充了类型系统和更完善的面向对象机制,因此大部分人都会对ts有好感,颇有多是将来的趋势。

对于es6高级特性,我是比较保守的,通常node长期支持版本lts支持的我都让用,一些更新的特性我通常不让使用。根本lts版本保持一致就好。

个人团队如今是采用es6的面向对象写法开发,后面会一点一点转到typescript上的。熟练oo转到ts是很是容易的。

安装Node.js环境

3m安装法

  • nvm(node version manager)【须要使用npm安装,替代品是yrm(支持yarn),nvs对window支持很好】
  • nrm(node registry manager)【须要使用npm安装,替代品是yrm(支持yarn)】
  • npm(node packages manager)【内置,替代品是n或nvs(对win也支持)】

nvm

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

nrm

https://registry.npmjs.com 是node官方的源(registry),服务器在国外,下载速度较慢,推荐安装nrm来切换源,国内的cnpm和taobao的源都很是快,固然,若是你想自建源也是支持的。

$ npm install --global nrm --registry=https://registry.npm.taobao.org
$ nrm use cnpm

npm

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

经常使用软件

  • 1)oh my zsh是我最习惯的shell,终端下很是好用

配合iterm2分屏 + spectacle全屏,几乎无敌

  • 2)brew是mac装软件很是好的方式,和apt-get、rpm等都很是相似

安装4个必备软件

  • brew install git 最流行的SCM源码版本控制软件
  • brew install wget 下载、扒站神器
  • brew install ack 搜索代码神器
  • brew install autojump 终端下多目录跳转神器
  • 3)vim

我虽然不算vim党,但也深爱着。janus是一个很是好用的vim集成开发环境。好比ctrl-p、nerdtree等插件都集成了,对我这种懒人足够了。

IDE和编辑器

关于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)

  • vsc是一个比较潮比较新的编辑器(跨平台Mac OS X、Windows和 Linux )
  • vsc功能和textmate、sublime、notepad++,ultraedit等比较,绝不逊色
  • vsc尤为是在nodejs(调试)和typescript、go上支持尤为好
  • vsc提供了自定义 Debugger Adapter 和 VSCode Debug Protocol 从而实现本身的调试器

值得一学,我推荐VSCode编辑器!

更多调试方法,参见https://github.com/i5ting/nod...

Node.js应用场景

《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大类

屏幕快照 2017-05-17 07.25.05.png

  • 1)跨平台:覆盖你能想到的面向用户的全部平台,传统的PC Web端,以及PC客户端 nw.js/electron 、移动端 cordova、HTML五、react-nativeweex,硬件 ruff.io
  • 2)Web应用开发:网站、Api、RPC服务等
  • 3)前端:三大框架 React Vue Angular 辅助开发,以及工程化演进过程(使用Gulp /Webpack 构建 Web 开发工具)
  • 4)工具: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
编辑器 AtomVSCode 都是基于 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核心:异步流程控制

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

1) 异步流程控制学习重点

我整理了一张图,更直观一些。从09年到如今,8年多的时间里,整个Node.js社区作了大量尝试,其中曲折足足够写一本书的了。你们先简单了解一下。

Screen Shot 2017-04-05 at 08.43.08.png

  • 红色表明Promise,是使用最多的,不管async仍是generator均可用
  • 蓝色是Generator,过分货
  • 绿色是Async函数,趋势

结论:Promise是必须会的,那你为何不顺势而为呢?

推荐:使用Async函数 + Promise组合,以下图所示。

其实,通常使用是不须要掌握上图中的全部技术的。对于初学者来讲,先够用,再去深究细节。因此,精简一下,只了解3个就足够足够用了。

Screen Shot 2017-04-05 at 08.43.34.png

结论

  1. Node.js SDK里callback写法必须会的。
  2. Node.js学习重点: Async函数与Promise

    1. 中流砥柱:Promise
    2. 终极解决方案:Async/Await

因此下面咱们会分个小部分进行讲解。

2)Api写法:Error-first Callback 和 EventEmitter

a)Error-first Callback
定义错误优先的回调写法只须要注意2条规则便可:

  • 回调函数的第一个参数返回的error对象,若是error发生了,它会做为第一个err参数返回,若是没有,通常作法是返回null。
  • 回调函数的第二个参数返回的是任何成功响应的结果数据。若是结果正常,没有error发生,err会被设置为null,并在第二个参数就出返回成功结果数据。

下面让咱们看一下调用函数示例,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文档,在高并发场景下慎用。

笔者推荐使用 DashZeal 查看离线文档,常常查看离线文档,对Api理解会深刻不少,比IDE辅助要好,能够有效避免离开IDE就不会写代码的窘境。

api.png

3)中流砥柱:Promise

回调地狱

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)的缘由。要点有三个:

  • 递归,每一个异步操做返回的都是promise对象
  • 状态机:三种状态转换,只在promise对象内部能够控制,外部不能改变状态
  • 全局异常处理

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实现 问题,使用与全部版本兼容
  • 避免Node.js 4曾经出现的内存泄露问题
  • 内置更多扩展,timeout、 promisifyAll等,对Promise/A+规范提供了强有力的补充

限于时间关系,这里就不一一列举了,仍是那句话,在学习Node.js过程当中,对于Promise了解多深刻都不过度。

推荐学习资料

4)终极解决方案:Async/Await

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件事儿

  • 经过await Student.getAllAsync();来获取全部的students信息。
  • 经过await ctx.render渲染页面
  • 因为是同步代码,使用try/catch作的异常处理

是否是很是简单,如今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();

要点

  • co的返回值是promise,因此await能够直接接co。
  • co的参数是genrator
  • 在generator里能够使用yield,而yield后面接的有5种可能,故而把这些能够yield接的方式成为yieldable,便可以yield接的。

    • Promises
    • Thunks (functions)
    • array (parallel execution)
    • objects (parallel execution)
    • Generators 和 GeneratorFunctions

由上面3中基本用法能够推出Async函数要点以下:

  • Async函数语义上很是好
  • Async不须要执行器,它自己具有执行能力,不像Generator须要co模块
  • Async函数的异常处理采用try/catch和Promise的错误处理,很是强大
  • Await接Promise,Promise自身就足够应对全部流程了,包括async函数没有纯并行处理机制,也能够采用Promise里的all和race来补齐
  • Await释放Promise的组合能力,外加co和Promise的then,几乎没有不支持的场景

综上所述

  • Async函数是趋势,若是Chrome 52. v8 5.1已经支持Async函数(https://github.com/nodejs/CTC...,Node.js支持还会远么?
  • Async和Generator函数里都支持promise,因此promise是必须会的。
  • Generator和yield异常强大,不过不会成为主流,因此学会基本用法和promise就行了,不必全部的都必须会。
  • co做为Generator执行器是不错的,它更好的是当作Promise 包装器,经过Generator支持yieldable,最后返回Promise,是否是有点无耻?

小结

这部分共讲了4个小点,都是极其直接的必须掌握的知识点。

  • 1) 异步流程控制学习重点
  • 2)Api写法:Error-first Callback 和 EventEmitter
  • 3)中流砥柱:Promise
  • 4)终极解决方案:Async/Await

这里再提一下关于Node.js源码阅读问题,不少人api都还没完熟练就去阅读源码,这是很是不同意的,不带着问题去读源码是比较容易迷失在大量代码中的。效果并很差。

先用明白,而后再去阅读Node.js源码,而后探寻libuv并发机制。不少人买了朴大的《深刻浅出Node.js》一书,看了以后仍是不太会用,不是书写的很差,而是步骤不对。

  • Node in action和了不得的Node.js是入门的绝好书籍,很是简单,各个部分都讲了,但不深刻,看了以后,基本就能用起来了
  • 当你用了一段以后,你会对Node.js的运行机制好奇,为啥呢?这时候去读朴大的《深刻浅出Node.js》一书就可以解惑。缘由很简单,九浅一深一书是偏向底层实现原理的书,从操做系统,并发原理,node源码层层解读。若是是新手读,不免会比较郁闷。
  • 实践类的能够看看雷宗民(老雷)和赵坤(nswbmw)写的书

我通常给你们的推荐是把Node in action读上5遍10遍,入门干活足够了。剩下的就是反复实践,多写代码和npm模块就好。

目前全部的书籍几乎都有点过期了,大部分都是Node.js v0.10左右的版本的,我得新书是基于Node.js 8版本的,预计2018年3月或4月出版。别催我,真无法更快了。

目录

博文视点的美女编辑在苦逼的整理中,预计出版在3月以后(不要催我,我也无法说),20章,800页+,订价预计在130+。

Web编程要点

通常,后端开发指的是 Web 应用开发中和视图渲染无关的部分,主要是和数据库交互为主的重业务型逻辑处理。但如今架构升级后,Node.js 承担了先后端分离重任以后,有了更多玩法。从带视图的传统Web应用面向Api接口应用,到经过 RPC 调用封装对数据库的操做,到提供前端 Api 代理和网关,服务组装等,统称为后端开发,再也不是以往只有和数据库打交道的部分才算后端。这样,就可让前端工程师对开发过程可控,更好的进行调优和性能优化。

对 Node.js 来讲,一直没有在后端取得其合理的占有率,缘由是多方面的,暂列几条。

  • 1)利益分配,已有实现大可能是Java或者其余语言,基本是无法撼动的,重写的成本是巨大的,另外,若是用Node写了,那么那些写Java的人怎么办?抢人饭碗,这是要拼命的。
  • 2)Node相对年轻,你们对Node的理解不够,回调和异步流程控制略麻烦,不少架构师都不肯意花时间去学习。尽管在Web应用部分处理起来很是简单高效,但在遇到问题时并不容易排查定位,对开发者水平要求略高。
  • 3)开发者技能单一,不少是从前端转过来的,对数据库,架构方面知识欠缺,对系统设计也知之很少,这是很危险的,有种麻杆打狼两头惧怕的感受。
  • 4)Node在科普、培训、布道等方面作的并很差,国外使用的很是多,国内却不多人知道,不如某些语言作得好。

尽管如此,Node.js 仍是尽人皆知,卷入各类是非风口,也算是在大前端浪潮中大红大紫。缘由它的定位很是明确,补足以 JavaScript 为核心的全栈体系中服务器部分。开发也是人,可以同时掌握并精通多门语言的人毕竟很少,并且程序员的美德是“懒”,能使用 JavaScript 一门语言完成全部事儿,为何要学更多呢?

对于 Web 应用大体分2种,带视图的传统Web应用面向Api接口应用,咱们先看一下 Node.js Web 应用开发框架的演进时间线大体以下:

  • 2010年 TJ Holowaychuk 写的 Express
  • 2011年 Derby.js 开始开发,8月5日,WalmartLabs 的一位成员 Eran Hammer 提交了 Hapi 的第一次git记录。Hapi 本来是 Postmile 的一部分,而且最开始是基于 Express 构建的。后来它发展成本身本身的框架,
  • 2012年1月21日,专一于 Rest api 的 Restify 发布1.0版本,同构的 Meteor 开始投入开发,最像Rails 的 Sails 也开始了开发
  • 2013年 TJ Holowaychuk 开始玩 es6 generator,编写 co 这个 Generator 执行器,并开始了Koa 项目。2013 年下半年李成银开始 ThinkJS,参考 ThinkPHP
  • 2014年4月9日,Express 发布4.0,进入4.x时代持续到今天,MEAN.js 开始随着 MEAN 架构的提出开始开发,意图大一统,另外 Total.js 开始起步,最像PHP里 Laravel 或 Python 里的 Django 或 ASP.NET MVC的框架,表明着 Node.js 的成熟,开始从其余语言里的成熟框架借鉴
  • 2015年8月22日,下一代 Web 框架 Koa 发布1.0,能够在Node.js v0.12下面,经过co 和 generator实现同步逻辑,那时候 co 仍是基于 thunkfy 的,在2015年10月30日,ThinkJS发布了首个基于 Es2015+ 特性开发的 v2.0 版本
  • 2016 年 09 月,蚂蚁金服的 Eggjs,在 JSConf China 2016 上亮相并宣布开源
  • 2017年2月,下一代Web框架 Koa 发布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开发框架

对于框架选型

  • 业务场景、特色,没必要为了什么而什么,避免本末倒置
  • 自身团队能力、喜爱,有时候技术选型决定团队氛围的,须要平衡激进与稳定
  • 出现问题的时候,有人可以作到源码级定制。Node.js 已经有8年历史,但模块完善程度参差不齐,若是不慎踩到一个坑里,须要团队在无外力的状况可以搞定,不然会影响进度
Tips:我的学习求新,企业架构求稳,无非喜爱与场景而已

Node.js 原本就为了作后端而设计的,这里咱们再看看利益问题。Node.js 向后端延伸,必然会触动后端开发的利益。那么 Proxy 层的事儿,先后端矛盾的交界处,后端不想变,前端又求变,那么久而久之,Api接口会变得愈来愈恶心。后端是愿意把Api的事儿叫前端的,对后端来讲,只要你不动个人数据库和服务就能够。

可是 Node.js 能不能作这部分呢?答案是能的,这个是和 Java、PHP 相似的,通常是和数据库链接到一块儿,处理带有业务逻辑的。目前国内大部分都是以 Java、PHP 等为主,因此要想吃到这部分并不容易。

  • 小公司,创业公司,新孵化的项目更倾向于 Node.js ,简单,快速,高效
  • 微服务架构下的某些服务,使用 Node.js 开发,是比较合理的

国内这部分一直没有作的很好,因此 Node.js 在大公司尚未很好的被应用,安全问题、生态问题、历史遗留问题等,还有不少人对 Node.js 的误解。

  • 单线程很脆弱,这是事实,但单线程不等于不能多核并发,并且你还有集群呢
  • 运维,其实很简单,比其余语言之简单,日志采集、监控也很是简单
  • 模块稳定性,对于 MongoDBMySQLRedis 等仍是至关不错,但其余的数据库支持可能没那么好。
  • 安全问题是个伪命题,全部框架面临的都是同样的。

这些对于提供Api服务来讲已经足够了,本书后面有大量篇幅讲如何使用 Koa 框架来构建Api服务。

Web编程核心

  • 异步流程控制(前面讲过了)
  • 基本框架 Koa或Express,新手推荐Express,毕竟资料多,上手更容易。若是有必定经验,推荐Koa,其实这些都是为了了解Web编程原理,尤为是中间件机制理解。
  • 数据库 mongodb或mysql都行,mongoose和Sequelize、bookshelf,TypeOrm等都很是不错。对于事物,不是Node.js的锅,是你选的数据库的问题。另一些偏门,想node连sqlserver等估计还不成熟,我是不会这样用的。
  • 模板引擎, ejs,jade,nunjucks。理解原理最好。尤为是extend,include等高级用法,理解布局,复用的好处。其实先后端思路都是同样的。

迷茫时学习Node.js最好的方法

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/...

非科班出身如何Node.js

有朋友提问

狼叔,关注你和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的应用场景,对将来你的技术选项和决策大有裨益

  • 2.1 Node 用途那么多,我该从哪里学起?

答:若是有机会就直接上Web应用,若是没有机会就从前端构建,工具等方面开始作,慢慢引入更潮更酷的前端技术,天然就把Node引入进来了。不要急。

  • 2.2 Node Web 框架那么多,我该怎么选?

答:初学者推荐Express,若是有必定经验,推荐Koa。固然真正项目里仍是推荐Eggjs和Thinkjs这样的框架。

  • 2.3 关于 Node 的书几乎都过期了,我该买哪本?

答:
1)Node in action和了不得的Node.js是入门的绝好书籍,很是简单,各个部分都讲了,但不深刻,看了以后,基本就能用起来了
2)当你用了一段以后,你会对Node.js的运行机制好奇,为啥呢?这时候去读朴大的《深刻浅出Node.js》一书就可以解惑。缘由很简单,九浅一深一书是偏向底层实现原理的书,从操做系统,并发原理,node源码层层解读。若是是新手读,不免会比较郁闷。
3)实践类的能够看看雷宗民(老雷)和赵坤(nswbmw)写的书

若是你不着急,也能够等个人那本《更了不得的Node.js》,时间待定。

Part 3延伸:大前端变化那么快,如何才能作到每日精进?

有朋友问如今Android开发和web前端开发哪一个前景更好?个人回答是明显是前端更好,看一下移动端发展过程

native < hybrid < rn/weex < h5

目前rn和weex的开发逐渐变得主流,组件化写法已经由前端主导了。之前ios和android程序员占比很高,但如今就留1到2个写插件,真是差异很大。

Web开发对移动端的冲击很是大。固然如今Web技术也开发PC client了,好比vscode是经过electron打包的,效果仍是至关不错的。

前端能够说是最近几年开发里最火的部分,缘由不少,最主要是开发方式的变动,以今时今日的眼光来看,称之为现代Web开发是不为过的。

先给出现代Web开发的概览图

15117552681353.jpg

每次演讲我会都问你们是否是前端,回答“是”的人很是多,我会开玩笑的恭喜你们:“如今的前端就是钱端”,确实,如今前端发展异常的快,并且没有趋向于类比java里ssh框架的那种稳定,因此将来很长一段时间,还会增加,持续混乱,这对前端来讲是把双刃剑,一方面有很强的压迫感,不学习就跟不上时代,另外一方它也是机遇,可以带给更多机会,包括money。

你们都疑惑的一个问题是如何在这样巨变的时代可以经过学习来应变,我能够很负责的告诉你们,没有捷径,但经过掌握 Node.js 可以让你下降这个学习曲线而已,毕竟Node.js是大前端的基础设施。你们能够看一下,前端的开发过程,模块化,构建,辅助工具,调优,架构调整,能够说Node.js是无处不在的。

其实,辅助大前端开发只是Node.js的一个很是无意插柳的衍生功能,经过掌握Node.js可以让你能作的更多、得到的更多,甚至能够说有更多自我实现的快乐,这也是我那本书书名字里“更了不得的”要去阐述的内容。

综上种种,就是我一直提倡以 JavaScript 语言为中心的 Node全栈 概念的原因,JavaScript 覆盖全部前端,Node.js 擅长作 I/O 密集型的后端,外加辅助开发的各类基础设施,无疑是工做、学习和成为快速掌握全栈技术最好的途径。你会的越多,你能作的就更多,你的人生也将会有不同的精彩篇章。

全栈核心

  • 后端不会的 UI(界面相关)
  • 前端不会的 DB(业务相关)

只要打通这2个要点,其余就比较容易了。最怕的是哪样都接触点,而后就号称本身是全栈,建议你们不要这样作,这就比如在简历里写精通同样,基本上都会被问到尴尬。全栈是一种信仰,不是拿来吹牛逼的,而能够解决更多问题,让本身的知识体系不留空白,享受自我实现的极致快乐。

个人全栈之路

想问一下狼叔最近的业务一直都是简单的用express搭一个后端服务,没有其余更加深刻node的业务了,这种时候应该如何本身给本身创应用场景呢

没有目标就向钱看,有目标就向前看
  • 从 java 开始,蹭课,背着机箱到深圳,3个月胖20斤
  • 坚持翻译英文文档,看 《Thinking in Java》
  • 毕业后开始 bi,整理 bi 文档
  • 学长明林清,传授 jQuery,愿意学,别人就更愿意分析
  • 接手《内蒙广电数据分析与科学决策系统》,打通前、后端
  • 广东联通,本身造轮子,写 jQuery 插件,DRY
  • 作云计算,学习 AIX,写有《凌云志》
  • 分手、离职,去作 iOS,从 cordova 开始搞 H5,研究各类移动端框架,本身写框架,转原生
  • 面试也是学习的利器,轻松进新浪
  • 总结了大量 iOS 经验,想写书,结果写了一堆写书的工具
既然没法逃避,就热爱它,最后变成兴趣
  • 去网秦作技术总监,作首席,管架构,带人,写开源项目
  • 创业,当 CTO,结婚,作公众号运营,写书,最苦的时候没钱吃饭,又不能找媳妇要,只能在 StuQ 上讲点课
  • 加入去哪儿网,任职前端架构师
  • 加入阿里巴巴,前端技术专家
人生不仅有代码,但它能让我快乐,终生受益

也曾懵懂,也曾迷茫,但我这人比较傻,一直信奉:“一次只作1件事儿,尽力作到极致”,短期看这是比较傻的,但一旦你坚持下去,你就会发现技术实际上是门手艺,厚积薄发。

我没办法说本身最擅长什么,但在什么场景下用什么技术是我擅长的。或者说,应变是我最大的本事。不少框架,新技术我都没见过,用过,但花一点点过一下,就能拿已有的知识快速的理解它,这实际上是长期学习的好处。

如今愈来愈忙,写代码的时间愈来愈少,技术又愈加展越快,我能作好的就是每日精进,仗着这点已有的知识储备跟年轻人比赛。我不以为累,相反我很享受这种感受,没有被时代淘汰,是一件多么幸福的事儿。

从后端转

作后端的人

  • 对数据库是比较熟悉,不管 mongodb,仍是 mysql、postgres
  • 对前端理解比较弱,会基本的 html,css,模板引擎等比较熟悉
4阶段按部就班,build 与工具齐飞

前端开发4阶段,个人感受是按照顺序,按部就班就好。

从前端转

从前端日后端转,api 接口很是容易学会,像 express、koa 这类框架大部分人一周就能学会,最难的是对 db、er 模型的理解,说直白点,仍是业务需求落地的理解

咱们来想一想通常的前端有什么技能?

  • html
  • css(兼容浏览器)
  • js 会点(可能更多的是会点 jquery)
  • ps 切图
  • firebug 和 chrome debuger 会的人都不太多
  • 用过几个框架,大部分人是仅仅会用
  • 英语通常
  • svn/git 会一点

那么他们若是想在前端领域作的更深有哪些难点呢?

  • 基础:oo,dp,命令,shell,构建等
  • 编程思想上的理解(mvc、ioc,规约等)
  • 区分概念
  • 外围验收,如 H5 和 hybird 等
  • 追赶趋势,如何学习新东西

以上皆是痛点,因此比较好的办法应该是这样的。

  • 玩转 npm、gulp 这样的前端工具类(此时仍是前端)
  • 使用 node 作先后端分离(此时仍是前端)
  • express、koa 这类框架
  • jade、ejs 等模板引擎
  • nginx
  • 玩转【后端】异步流程处理(promise/es6的(generator|yield)/es7(async|await))
  • 玩转【后端】mongodb、mysql 对应的 Node 模块

从咱们的经验看,这样是比较靠谱的。先作最简单先后端分离,里面没有任何和db相关,前端能够很是容易的学会,基本2周就已经很是熟练了。通常半年后,让他们接触【异步流程处理】和【数据库】相关内容,学习后端代码,就能够全栈了。

从移动端转

看一下移动端发展过程

native < hybrid < rn/weex < h5

目前rn和weex的开发逐渐变得主流,组件化写法已经由前端主导了。之前ios和android程序员占比很高,但如今就留1到2个写插件,真是差异很大。狼叔一直执拗的觉得将来是h5的。

如今的 Native 开发是姥姥不疼舅舅不爱,很是尴尬,很明显连培训出的人就业不要工资混经验就很明显了。另外领导们也都在惦记,能不能用 H5 写?这还算是保守的,若是直接激进的就直接上 RN 了,那么 Native开发的程序员就变了

一个写插件的程序员...招谁惹谁了。。。。

要么忍,要么转,没办法,认命吧,温水里舒服了几年,也该学点东西了

  • hybrid 或组件化开发,你总要会同样
  • 不管哪一种,你都离前端很近,由于 H5 或组件化都是从前端走出来的
  • 组件化在前端领域先行,不管借鉴仍是学习都不可避免
  • 若是没时间就直接上组件化,若是有时间就好好学学前端完总体系,最终也仍是要学组件化

原生开发就是 iOS 用 OC/Swift,Android 用 java 或 scala 等,就算偶尔嵌入 webview,能玩js的机会也很是好少

因此移动端转全栈的方法,最好是从 cordova(之前叫 phonegap)开始作 hybrid 开发。

  • 只要关注 www 目录里的 H5 便可,比较简单
  • 若是 H5 不足以完成的状况下,能够编写 cordova 插件,即经过插件让 js 调用原生 sdk 里功能
  • cordova 的 cli 能够经过 npm 安装,学习 npm 的好方法
  • 学习 gulp 构建工具

只要入了 H5 的坑,其实就很是好办了。

  • 而后 h五、zeptojs、iscroll、fastclick 等
  • 而后微信经常使用的,如 weui、vux(vue+weui)、jmui(react+weui)
  • 而后能够玩点框架,好比 jquery mobile,sencha touch
  • 而后能够玩点高级货,ionicframework(基于 angularjs、cordova)
  • 而后前端4阶段,依次打怪升级
  • 而后 node

这个基本上是我走的路,从2010年写iOS、作phonegap(当时是0.9.3)、一路走到如今的总结吧!

之前技术发展还不是那么明显,写 Java 的时候 Apache 的开源用的比较多,那时开源的代码托管sourceforgegoogle code 也都凑合用,自从 GitGitHub 出现时候,代码社交兴起,极大的促进了开源的活跃,使得大量明星项目脱引而出。这是好事,若是没有开源,中国的软件水平真是要落后好多年。那么问题也来了,如何可以在技术快速发展的今天,我的成长也能更好呢?

学习的3种层次,跟人学最快,其次是跟书(或者博客)学,最差的是自悟。可是牛人不能遇到,遇到了也未必有精力教你,书本或者博客,别人有,但不必定写出来,就算是写了,可能只是点到为止。至于自悟,若是没有深厚的积累的,仍是有至关大难度的。

对于开发来讲代码是一切基础,在掌握了必定计算机基础后,其差异就在于代码质量和眼界。编程没有捷径,可以作到每日精进就是极好的。如今开源代码很是多,要可以从中获取本身所需的知识,也是一种本领!若是可以坚持着每日精进,根本不须要向其余人学习的。

15011322589471.jpg

你们能够在 Github 随便打开一个前端项目,里面有一半以上都是 Node.js 相关信息,各类包管理、测试、ci、辅助模块,若是你们对这些基础信息掌握的很是好,那么学习一个新的框架,你要比别人快好多,最重要的是学了一次,处处使用。

不少人问我怎么才能成为一个 Node.js 大神?个人回答是“在cnode论坛上坚持写文章和开源项目2年,足矣,轻松进阿里腾讯,不用你找他们,他们自会找你的”。

从今天起,开始重视开源项目,重视 node,作到每日精进

Part 4实践:从招聘角度来看, Node.js 开发须要具有哪些技能?

招人标准

先说下个人招人标准,作技术总监时上指下派只要看好技术能力和态度便可,作CTO时要考虑团队文化,人品和可否在公司长留,因此不一样的人面试要看的点是不同的,我曾面过不少Node.js程序员,也见过不少面试题,汇总一下,大体有如下9个点:

  1. 基本的Node.js几个特性,好比事件驱动、非阻塞I/O、Stream等
  2. 异步流程控制相关,Promise是必问的
  3. 掌握1种以上Web框架,好比Express、Koa、Thinkjs、Restfy、Hapi等,会问遇到过哪些问题、以及前端优化等常识
  4. 数据库相关,尤为是SQL、缓存、Mongodb等
  5. 对于常见Node.js模块、工具的使用,观察一我的是否爱学习、折腾
  6. 是否熟悉linux,是否独立部署过服务器,有+分
  7. js语法和es六、es7,延伸CoffeeScript、TypeScript等,看看你是否关注新技术,有+分
  8. 对前端是否了解,有+分
  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等,境遇也不太好的,更有甚者直接被开除。

优酷-高级前端开发

职位描述

  1. 支撑企业级应用后台开发,使用 React 等前端框架搭建后台页面,实现交互需求及后端服务对接;
  2. 以模块化的思想设计开发通用前端组件,并可以针对OTT,移动端进行针对性优化;
  3. 在理解前端开发流程的基础上,结合前端实际创建或优化提高工做效率的工具;
  4. 在理解产品业务的基础上,提高产品的用户体验,技术驱动业务的发展;
  5. 关注前端前沿技术研究,经过新技术服务团队和业务;
  6. 使用 Weex 技术开发产品需求。"

职位要求

  1. 精通前端技术,包括HTML/CSS/JavaScript/Node.JS等;
  2. 掌握Bootstrap,jQuery,AngularJS,React等框架,并有项目实践;
  3. 熟悉前端模块化、编译和构建工具,如grunt,gulp,webpack等;
  4. 至少熟悉一门非前端的语言(如Java/PHP/C/C++/Python/Ruby),有项目实践更佳;
  5. 具有跨终端的前端开发能力,在Web(PC+Mobile)/Node.js/Native App三个方向上至少精通一个方向,具有多个的更佳,鼓励在Native和Web技术融合上的探索;
  6. 具备较强的学习能力,对前端技术有持续的热情,个性乐观开朗,逻辑性强,善于和产品,UED,后端等方向同窗合做。

PixelLab

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) 学习能力强、应变能力强,优秀的沟通能力和协调能力,执行能力强,具有较强的团队合做精神。

蚂蚁金服

岗位要求:

  • 大学本科学历,2年以上开发经验,能熟练使用常见类库或框架,编写高质量的前端代码;
  • 熟悉NodeJS,有NodeJS开发经验,熟悉Expresskoa等框架;
  • 熟练掌握React、Redux及相关框架和技术,有单页面应用开发经验;
  • 精通ES6,gulp,webpack等规范和技术;
  • 善于 Web 性能优化与前端效果的实现;
  • 良好的团队合做精神和积极主动的沟通意识,具备很强的学习能力和对新技术的追求精神,乐于分享;
  • 有大型网站开发经验者优先。

咱们的前端专业建设方向

  • 基于ReactJS的主题可配置组件化平台
  • 基于Nodejs的UED中台业务(浏览器端web页面监控等)
  • 基于Docker的nodejs云容器平台
  • 基于Webpack的前端工程化体系建设
  • 基于eggjs的react同构框架
  • 基于G2的业务数据可视化组件库
  • 大规模图形识别/图像处理/AR/VR//语音交互等研究性领域探索

联系方式

目前北京,杭州,广州,上海,深圳,成都都在招聘,若是你也想跟我一块儿共事,请将简历邮件给我 langshu.ssl@alibaba-inc.com,团队大量招人,也能够帮忙推荐给集团其余部门。

有机会和winter,勾股,玉伯,苏千,朴灵、死马、偏右,徐飞,阮一峰,天猪,裕波等大神一块儿工做哦。

悄悄地说,其实其余公司我也能够帮推荐。

结束语

年轻时死磕,年长点让小弟死磕,如今抓个专家一块儿吃饭,没有什么是一顿饭解决不了的,不行就二顿

工程师的能力不是编码和死磕,而是解决问题

  • 年轻死磕是为了长本事,30岁之前均可以这样作
  • 带团队后,要懂得任务下放,让更多人帮你,别带人越多越累
  • 30岁以后是打牌阶段,技能积累足够用,这时要注重社交,打组合拳才能玩的更好

强调30岁不是我创造的,大部分人都会认为30岁后事情,压力会明显大得多,好比家庭,孩子,房子,车子,票子,甚至是管理,权利,欲望等等吧。我感觉最深的是身体不如从前和记忆力明显降低。

狼叔说: “少抱怨,多思考,将来更美好”

大部分人体会不到坚持的乐趣,不会玩,因此抱怨多。其实玩出乐趣也是一种能力,尤为是像写代码这种看似无聊的事儿。最开始可能只想赚点钱,后面变成热爱,这样才美好。只要坚持每日精进开心就行了。

另外,时间也要好到处理,狼叔总会提菜根谭上的一句话:【闲时要有吃紧的心思,忙里要有偷闲的乐趣】。

每一个人的一辈子中都有不少坎,相似于瓶颈,惟有苦难和坚持才能冲破,坚持会产生自信,苦难会创造机会。一个通过苦难还有自信的人,必定会有更美好的将来。

若是你们还有问题,能够去cnode社区发帖at我,也能够在Node全栈公众号提问。

Part 5答疑:回答你们的问题

答疑有点多,这里就不一一贴出来,若是是新用户和比较迷茫的Node朋友去Live里听吧。

相关文章
相关标签/搜索