6666 < div id ='readme ' style ='width:70%;margin-left:20%; '>
6767 < article class ='markdown-body '>
6868 < h1 id ="-live-node-js "> 【知乎Live】狼叔:如何正确的学习Node.js</ h1 >
69+ < p > < img src ="media/preview.png " alt =""> </ p >
70+ < p > 预览地址 < a href ="https://i5ting.github.io/How-to-learn-node-correctly/ "> https://i5ting.github.io/How-to-learn-node-correctly/</ a > </ p >
6971< p > Live 简介</ p >
7072< p > 你好,我是 i5ting ,江湖人称「狼叔」,目前是阿里巴巴技术专家,斯达克学院( StuQ )明星讲师, Node.js 技术布道者。曾就职于去哪儿、新浪、网秦,做过前端、后端、数据分析,是一名全栈技术的实践者。</ p >
7173< p > 现在,越来越多的科技公司和开发者开始使用 Node.js 开发各种应用。Node.js除了能够辅助大前端开发外,还可以编写Web应用,封装Api,组装RPC服务等,甚至是开发VSCode编辑器一样的PC客户端。和其它技术相比, Node.js 简单易学,性能好、部署容易,能够轻松处理高并发场景下的大量服务器请求。Node.js 周边的生态也非常强大,NPM(Node包管理)上有超过60万个模块,日下超过载量3亿次。但编写 Node.js 代码对新人和其它语言背景的开发者来说,不是一件容易的事,在入门之前需要弄懂不少复杂的概念。</ p >
@@ -248,7 +250,7 @@ <h4 id="npm">npm</h4>
248250< td > npm i -s xxx</ td >
249251</ tr >
250252< tr >
251- < td > npm install --save-de xxx</ td >
253+ < td > npm install --save-dev xxx</ td >
252254< td > 安装xxx模块,并且记录到package.json里,字段对应的dev-dependency,是开发环境必须依赖的模块,比如测试类的(mocha、chai、sinon、zombie、supertest等)都在</ td >
253255< td > npm i -D xxx</ td >
254256</ tr >
@@ -592,7 +594,7 @@ <h4 id="3-promise">3)中流砥柱:Promise</h4>
592594< h4 id ="4-async-await "> 4)终极解决方案:Async/Await</ h4 >
593595< p > Async/Await是异步操作的终极解决方案,Koa 2在node 7.6发布之后,立马发布了正式版本,并且推荐使用async函数来编写Koa中间件。</ p >
594596< p > 这里给出一段Koa 2应用里的一段代码 </ p >
595- < pre > < code > exports.list = async (ctx, next) => {
597+ < pre > < code class =" lang-js " > exports.list = async (ctx, next) => {
596598 try {
597599 let students = await Student.getAllAsync();
598600
@@ -603,15 +605,16 @@ <h4 id="4-async-await">4)终极解决方案:Async/Await</h4>
603605 return ctx.api_error(err);
604606 }
605607};
606- </ code > </ pre > < p > 它做了3件事儿</ p >
608+ </ code > </ pre >
609+ < p > 它做了3件事儿</ p >
607610< ul >
608611< li > 通过await Student.getAllAsync();来获取所有的students信息。</ li >
609612< li > 通过await ctx.render渲染页面</ li >
610613< li > 由于是同步代码,使用try/catch做的异常处理</ li >
611614</ ul >
612615< p > 是不是非常简单,现在Eggjs里也都是这样同步的代码。</ p >
613616< p > 4.1 正常写法</ p >
614- < pre > < code > const pkgConf = require('pkg-conf');
617+ < pre > < code class =" lang-js " > const pkgConf = require('pkg-conf');
615618
616619async function main(){
617620 const config = await pkgConf('unicorn');
@@ -621,17 +624,19 @@ <h4 id="4-async-await">4)终极解决方案:Async/Await</h4>
621624}
622625
623626main();
624- </ code > </ pre > < p > 变态写法</ p >
625- < pre > < code > const pkgConf = require('pkg-conf');
627+ </ code > </ pre >
628+ < p > 变态写法</ p >
629+ < pre > < code class ="lang-js "> const pkgConf = require('pkg-conf');
626630
627631(async () => {
628632 const config = await pkgConf('unicorn');
629633
630634 console.log(config.rainbow);
631635 //=> true
632636})();
633- </ code > </ pre > < p > 4.2 await + Promise</ p >
634- < pre > < code > const Promise = require('bluebird');
637+ </ code > </ pre >
638+ < p > 4.2 await + Promise</ p >
639+ < pre > < code class ="lang-js "> const Promise = require('bluebird');
635640const fs = Promise.promisifyAll(require("fs"));
636641
637642async function main(){
@@ -640,8 +645,9 @@ <h4 id="4-async-await">4)终极解决方案:Async/Await</h4>
640645}
641646
642647main();
643- </ code > </ pre > < p > 4.3 await + co + generator</ p >
644- < pre > < code > const co = require('co');
648+ </ code > </ pre >
649+ < p > 4.3 await + co + generator</ p >
650+ < pre > < code class ="lang-js "> const co = require('co');
645651const Promise = require('bluebird');
646652const fs = Promise.promisifyAll(require("fs"));
647653
@@ -655,7 +661,8 @@ <h4 id="4-async-await">4)终极解决方案:Async/Await</h4>
655661}
656662
657663main();
658- </ code > </ pre > < p > 要点</ p >
664+ </ code > </ pre >
665+ < p > 要点</ p >
659666< ul >
660667< li > co的返回值是promise,所以await可以直接接co。</ li >
661668< li > co的参数是genrator</ li >
0 commit comments