Node.js最新Web技术栈(2016年4月)
上一次的发布的是精华 Node.js最新Web技术栈(2015年5月),感谢大家喜爱,值此koa2.0发布后,决定再次升级技术栈
Node.js是比较简单的,只有你有前端js基础,那就按照我的办法来吧!一周足矣,虽然这版上了es语法,但依然是可以简单写,也可以难写,参见《全栈工程师之路-Node.js》,里面讲了Node.js和全栈相关的思考,整体对未来Node.js比较看好
核心变更:es语法支持
- 使用Node.js 4.x或5.x里的es6特性,如果想玩更高级的,可以使用babel编译支持es7特性
- 合理使用standard 代码风格约定
- es6语法,写的一般,比较啰嗦,凑合看吧 http://es6.ruanyifeng.com/
- 需要大家重视OO(面向对象)写法的学习和使用,这是es的另一个好处,推荐蔡伟小兄弟的《JavaScript Patterns》 examples in ECMAScript6
相比es语法,其实我本人更喜欢typescript的,不过写Node.js还是推荐跟Node SDK玩才是。
推荐技术栈
- koa 1.0 && 2.0 (koa2.0刚发布不久,喜欢折腾的可以考虑)
- mongoose(mongodb)
- bluebird(Promise/A+实现)
- jade(视图层模板)
- ava(测试)
- vscode(调试)
推荐生成器(稍后会把ava和bluebird加上)
https://github.com/17koa/koa-generator
了解http协议,尤其是表单和ajax传值,在req里如何接收
- 绝对地址和相对地址
- querystring
- url 和 uri
- http status code
- http verbs
- req取参数的3种方法
- 3种不同类型的post
- 命令行玩法
- supertest用法
- what is rest?
http://i5ting.github.io/node-http/
了解db相关操作,先以mongoose为主
这部分基本无调整,只是注意es写法就好了
- crud(增删改查)
- 了解分页
- 了解关系(1对1,1对多)在mongoose里如何实现
- 了解statics方法和methods的区别
- 了解pre和post的差别
- 了解mongoose的插件机制
- 了解mvc里m的作用,以及什么样的代码该放到模型里
- 了解索引优化
- 了解mongodb的部署
了解Generator、Async和Promise/A+规范,合理规避回调陷阱
这次的变更主要是es6支持的generator和es7支持的async
根据Koa 2.x的3种中间件看,现在支持是promise第一,其次是co包装的generator,最后是async函数。等async支持了以后,就是await + Promise的天下
- 了解的node的异步、generator和async
- 了解异步的恶心
- 了解异步基本场景,比如waterfall这样的路程使用async如何处理
- 了解q和bluebird用法(如果有angularjs经验,推荐q,其他只推荐bluebird)
- 了解bluebird的promisifyAll用法
- 了解如何重构流程,以及代码的可读性
使用tdd/bdd测试,最小化问题
这次的变更主要是下一代技术栈以es开发为主,这样的话,测试用mocha,tap、tape等就没有ava帅了
推荐ava替代mocha,其他基本都一样
- Minimal and fast
- Simple test syntax
- Runs tests concurrently
- Enforces writing atomic tests
- No implicit globals
- Isolated environment for each test file
- Write your tests in ES2015
- Promise support
- Generator function support
- Async function support
- Observable support
- Enhanced assertion messages
- Optional TAP output
- Clean stack traces
测试的好处,这里就不说了,但是有一点是要说的,node的调试比较难,往往不如写测试来的快,推荐学习一下
- 理解最小问题思想,培养程序员该有的强大的内心
- ava的基本用法
- 理解断言的用法(注内置断言,不需要assert/should/expect等)
- 理解测试生命周期
- 理解箭头函数、generator、promise等用法
- 理解如何模拟数据
- 理解http下的supertest测试
- 理解测试覆盖率
- 理解基于gulp自动化测试方法
如果有兴趣,可以去了解更多bdd/tdd内容,甚至是cucumber.js
你无论如何都要会的:调试
调试有3种方法
- node debug(太挫了,如果不是c,了解gdb、adb之类的人不推荐用)
- node-inspector(推荐4※)
- tdd/bdd(推荐5※)
作为基础技能掌握就好,实际开发推荐vscode
教程见 https://github.com/i5ting/vsc
欢迎关注我的公众号【node全栈】
联系我,更多交流
mark
mark。
mark
用typescript
来写koa2
真是爽爆了。
@hellopao 确实,不过面向更多人,还是要保守一些的,兄弟,多来分享一些ts和koa2的经验啊
@hellopao https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/koa/koa.d.ts 分享一个当时自己写的 koa2
描述文件:)
@DavidCai1993 嗯,一直在用你写的这个,nice job。
我加了koa-router
,koa-bodyparser
,koa-static
,前两个已经merge
了。
@hellopao 赞!
@DavidCai1993 @hellopao 好基友就是这样产生的,哈哈
赞! 自豪地采用 CNodeJS ionic
坐等书出版!
@alsotang 广告已去
mark
今天被osc头条了,哈哈
👍 自豪地采用 CNodeJS ionic
mark
赞一个
🐴
mark
赞
赞一个
mark
大赞啊!正在找这方面相关的教程。
Mark
来自酷炫的 CNodeMD
mark
Mark
赞赞
Mark From Noder
mark
mark
赞! nodejs 单元测试有推荐教程不
以前对generator支持的promise的只有co
现阶段并不是特别看好 async await
的es2016语法,另外也不推荐 co
。一个 bluebird
其实可以搞定所有异步场景了。
async await
连并发执行类似于 Promise.all
都不支持,而且还有限制不能把 class
的 constructor
写成 async function
,另外一旦把函数写成了 async
函数,只能用 await
来调用。但如果写成 promise A+
,await
, yield
,then
三种方式可以随意使用,非常方便。
另外 bluebird
效率非常高,bluebird.coroutine + generator
比原生的直接用 generator
执行效率还高一些, bluebird
的 Promise
也比原生执行效率高得多,功能也多。唯一觉得不是特别完善的地方在于 Promise.all
不带 concurrency
并发数限制的支持,不过也可以用 Promise.map
模拟。
bluebird.coroutine
语法其实也很类似 async await
了,只是略微有点 verbose
:
import { delay as sleep, coroutine as co } from 'bluebird';
// async await:
const a = async() => {
console.time('slept');
await sleep(1000);
console.timeEnd('slept');
}
const b = co(function*(){
console.time('slept');
yield sleep(1000);
console.timeEnd('slept');
});
await a();
b();
另外关于eslint
,还是建议采用 eslint-config-airbnb-base
或者如果用 React
的话可以用 eslint-config-airbnb
。里面有非常多的检查搭配 vscode
几乎可以减少一半代码中的错误编辑期间都可以看到及时改正,觉得比 standard
要完善一些。另外 standard
默认不带分号感觉不太舒服,虽然也可以改配置,但个人不太喜欢。
@andyhu 这个说的有问题吧
await马上就变成native实现了,所以大势所趋的。另外await支持Promise.all的,concurrency类的只能借助扩展的如bb类的库
@i5ting await
不支持吧?以前可以 await* [async_func1, async_func2]
,现在这个语法取消了啊?
async await
我也用,但觉得很多时候功能太欠缺,写的稍微复杂点就得一半全部用 promise 或者 coroutine
@andyhu promise化已经不可逆了。。。。所以未来是await + promise的天下,最近node会发布async/await,好期待啊,再也不用babel了
马克 不错的文章<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>
赞 还可以附带 JSON Web Tokens(koa-jwt)、bookshelf(mysql ORM)、turbolinks
@i5ting 嗯,的确是,最好import export node 7 或者node 8赶紧给完善下,就真的是写代码非常舒服了。babel 好是好,不过太慢了
@hxh1246996371 哈哈,后面的拼错了,是turbolinks吧
@andyhu es6的模块貌似还没有完善呢。。。。不过这更新已经是挺快的了
mark
坐等await 技术栈更新
现在正逐步加强自己测试和调试的基础能力
@DavidCai1993 弱弱问下 es6下 import React, {Component} from 'react'
, 若转为 typescript写法, 该如何书写呢?
技术发展太快,时不我待,fighting!
仍然不过时,不过可能要加一个ts了
Koa这个词天天在眼前晃,到底该怎么读啊?
@ReakingAd 抠啊
@m31271n 学坏了,哈哈
@i5ting 看来以后只能打打拼音了。kōu ā
我是小白学了一个月的node用的是express框架,请问现在直接去学koa好,还是再等等好
@i5ting 可以用AVA代替Mocha?我最近在用Mocha。。。
@sunfeng90 可以完全替代,执行速度和新特性支持上有点优势,其他都一样
@HmhWz 先精通你会的再说,不要急,也不要贪多
测试回复
mark
写了几个月 nodejs,对前端知识的汲取少了好多,本来就是前端😭 node 有毒,我要找前端工作😯不过 node挺好玩的😜
来自酷炫的 CNodeMD