課程來源:https://www.shiyanlou.com/courses/493【@實(shí)驗(yàn)樓】
第1節(jié) 一個(gè)最簡單的 express 應(yīng)用
1.1 新建lesson1,進(jìn)去里面安裝express
1.2 新建app.js
1.3 運(yùn)行app.js,打開瀏覽器峭竣,輸入http://localhost:3000/
第2節(jié) 學(xué)習(xí)使用外部模塊
2.1 新建lesson1,并生成一份它的 package.json惰赋。
2.2 安裝依賴洛口, express 和 utility 兩個(gè)模塊
2.3 新建app.js
2.4 運(yùn)行app.js,在瀏覽器輸入http://localhost:3000/?q=alsotang
第3節(jié) 使用 superagent 與 cheerio 完成簡單爬蟲
3.1 新建文件夾特咆,進(jìn)去之后 npm init
3.2 安裝依賴:express,superagent,cheerio
3.3 寫應(yīng)用邏輯
3.4 運(yùn)行及結(jié)果
第4節(jié) 使用 eventproxy 控制并發(fā)
4.1 獲取主頁
4.1.1 新建文件夾,進(jìn)去之后 npm init
4.1.2 安裝依賴:express,superagent,cheerio
4.1.3 寫應(yīng)用邏輯
4.1.4 運(yùn)行及結(jié)果
4.2 eventproxy介紹
4.2.1 不使用 eventproxy 也不使用計(jì)數(shù)器
// 參考 jquery 的 $.get 的方法
$.get("http://data1_source", function (data1) {
// something
$.get("http://data2_source", function (data2) {
// something
$.get("http://data3_source", function (data3) {
// something
var html = fuck(data1, data2, data3);
render(html);
});
});
});
4.2.2 使用計(jì)數(shù)器
(function () {
var count = 0;
var result = {};
$.get('http://data1_source', function (data) {
result.data1 = data;
count++;
handle();
});
$.get('http://data2_source', function (data) {
result.data2 = data;
count++;
handle();
});
$.get('http://data3_source', function (data) {
result.data3 = data;
count++;
handle();
});
function handle() {
if (count === 3) {
var html = fuck(result.data1, result.data2, result.data3);
render(html);
}
}
})();
4.2.3 使用eventproxy
var ep = new eventproxy();
ep.all('data1_event', 'data2_event', 'data3_event', function (data1, data2, data3) {
var html = fuck(data1, data2, data3);
render(html);
});
$.get('http://data1_source', function (data) {
ep.emit('data1_event', data);
});
$.get('http://data2_source', function (data) {
ep.emit('data2_event', data);
});
$.get('http://data3_source', function (data) {
ep.emit('data3_event', data);
});
eventproxy 提供了不少其他場景所需的 API,但最最常用的用法就是以上的這種羔挡,即:
- 先 var ep = new eventproxy(); 得到一個(gè) eventproxy 實(shí)例。
- 告訴它你要監(jiān)聽哪些事件间唉,并給它一個(gè)回調(diào)函數(shù)绞灼。
ep.all('event1', 'event2', function (result1, result2) {})。- 在適當(dāng)?shù)臅r(shí)候 ep.emit('event_name', eventData)呈野。
4.3 抓取每條url的內(nèi)容
完整代碼如下:
var eventproxy = require('eventproxy');
var superagent = require('superagent');
var cheerio = require('cheerio');
var url = require('url');
var cnodeUrl = 'https://cnodejs.org/';
superagent.get(cnodeUrl)
.end(function (err, res) {
if (err) {
return console.error(err);
}
var topicUrls = [];
var $ = cheerio.load(res.text);
$('#topic_list .topic_title').each(function (idx, element) {
var $element = $(element);
var href = url.resolve(cnodeUrl, $element.attr('href'));
topicUrls.push(href);
});
var ep = new eventproxy();
ep.after('topic_html', topicUrls.length, function (topics) {
topics = topics.map(function (topicPair) {
var topicUrl = topicPair[0];
var topicHtml = topicPair[1];
var $ = cheerio.load(topicHtml);
return ({
title: $('.topic_full_title').text().trim(),
href: topicUrl,
comment1: $('.reply_content').eq(0).text().trim(),
});
});
console.log('final:');
console.log(topics);
});
topicUrls.forEach(function (topicUrl) {
superagent.get(topicUrl)
.end(function (err, res) {
console.log('fetch ' + topicUrl + ' successful');
ep.emit('topic_html', [topicUrl, res.text]);
});
});
});
第5節(jié) 使用 async 控制并發(fā)
5.1 準(zhǔn)備工作
- mkdir lesson5 && cd lesson5
- npm init
- npm install --save async
- touch app.js
5.2 app.js 代碼如下
5.3 運(yùn)行及結(jié)果
第6節(jié) 測試用例:mocha低矮,should,istanbul
6.1 編寫測試用例
6.1.1 準(zhǔn)備工作
6.1.2 編寫測試用例
6.1.3 運(yùn)行及結(jié)果
6.2 執(zhí)行測試
6.2.1 修改main.js被冒,暴露 fibonacci
6.2.2 準(zhǔn)備工作
6.2.3 main.test.js 代碼
6.2.4 運(yùn)行及結(jié)果
6.2.4 增加測試军掂,修改main.test.js,并運(yùn)行
6.2.5 根據(jù)報(bào)錯(cuò)更新main.js昨悼,使測試全部通過
以上過程為TDD(測試驅(qū)動(dòng)開發(fā)):先把要達(dá)到的目的都描述清楚蝗锥,然后讓現(xiàn)有的程序跑不過 case,再修補(bǔ)程序率触,讓 case 通過终议。
6.3 使用isbantul(代碼覆蓋率)
- 行覆蓋率(line coverage):是否每一行都執(zhí)行了?
- 函數(shù)覆蓋率(function coverage):是否每個(gè)函數(shù)都調(diào)用了?
- 分支覆蓋率(branch coverage):是否每個(gè)if代碼塊都執(zhí)行了穴张?
- 語句覆蓋率(statement coverage):是否每個(gè)語句都執(zhí)行了细燎?
6.3.1 準(zhǔn)備工作
- subo npm install --global mocha
- sudo npm install --save-dev mocha
- sudo nom i istanbul -g
- istanbul cover _mocha
6.3.2 運(yùn)行結(jié)果
第7節(jié) 瀏覽器端測試:mocha,chai陆馁,phantomjs
7.1 瀏覽器環(huán)境執(zhí)行
7.1.1 準(zhǔn)備工作
- mkdir lesson7 && cd lesson7
- mkdir vendor && cd vendor
- npm i -g mocha # 安裝全局的 mocha 命令行工具
- mocha init . # 生成腳手架
7.1.2 在index.html插入如下代碼
7.1.3 在test.js輸入如下代碼
7.1.4 打開index.html,結(jié)果如下
7.2 命令行環(huán)境執(zhí)行
7.2.1 安裝 mocha-phantomjs
- sudo npm i -g mocha-phantomjs
7.2.2 index.html增加如下代碼
7.2.3 運(yùn)行
報(bào)錯(cuò)找颓,不知道是什么原因?叮贩?
第8節(jié) 測試用例:supertest
8.1 準(zhǔn)備工作
8.2 編寫app.js
8.3 編寫test/app.test.js
8.4 運(yùn)行及結(jié)果
--
第9節(jié) 正則表達(dá)式
- i :不區(qū)分大小寫
- g:匹配多個(gè)
- m :^ 和 $ 可以匹配每一行的開頭击狮。
- 加 g 會(huì)返回?cái)?shù)組,不加 g 則返回比較詳細(xì)的信息
- 加 g 之后益老,如果你的正則不是字面量的正則彪蓬,而是存儲(chǔ)在變量中的話,這個(gè)變量就會(huì)變得有記憶
- [\s\S],[^]:能匹配包括 \n 在內(nèi)的所有字符
第10節(jié) benchmark 怎么寫(測試性能)
- mkdir lesson10 && cd lesson10
- npm init
- npm install benchmark --save
- touch main.js
第11節(jié) 作用域與閉包
11.1 var作用域
- 內(nèi)部函數(shù)可以訪問外部函數(shù)的變量捺萌,外部不能訪問內(nèi)部函數(shù)的變量档冬。
內(nèi)部函數(shù)child可以訪問變量age,而外部函數(shù)parent不可以訪問child中的變量childAge桃纯,因此會(huì)拋出沒有定義變量的異常酷誓。
- 如果忘記var,那么變量就被聲明為全局變量了态坦。
- JavaScript 中盐数,變量的局部作用域是函數(shù)級(jí)別的。不同于 C 語言伞梯,在 C 語言中玫氢,作用域是塊級(jí)別的。
11.2 閉包
- 閉包的一個(gè)坑
- 上面這個(gè)代碼塊打印五個(gè) 5:setTimeout 中的 i 是對(duì)外層 i 的引用谜诫。當(dāng) setTimeout 的代碼被解釋的時(shí)候漾峡,運(yùn)行時(shí)只是記錄了 i 的引用,而不是值喻旷。而當(dāng) setTimeout 被觸發(fā)時(shí)生逸,五個(gè) setTimeout 中的 i 同時(shí)被取值,由于它們都指向了外層的同一個(gè) i且预,而那個(gè) i 的值在迭代完成時(shí)為 5牺陶,所以打印了五次 5。
- 下面這個(gè)代碼塊打印0-4:把 i 賦值成一個(gè)局部的變量辣之,從而擺脫外層迭代的影響。
11.3 this
- 函數(shù)有所屬對(duì)象時(shí):指向所屬對(duì)象
- 函數(shù)沒有所屬對(duì)象:指向全局對(duì)象
- 構(gòu)造器中的 this:指向新對(duì)象
- apply 和 call 調(diào)用以及 bind 綁定:指向綁定的對(duì)象
第13節(jié) 持續(xù)集成平臺(tái):travis
13.1 注冊travis賬號(hào)
我直接關(guān)聯(lián)了自己的github賬號(hào)
13.2 選擇自己需要測試的倉庫
13.3 寫.travis.yml
13.4 運(yùn)行及結(jié)果
當(dāng) .travis.yml 完成后皱炉,travis自動(dòng)被觸發(fā)
第15節(jié) Mongodb 與 Mongoose 的使用
15.1 安裝mongodb
15.2 使用mongodb和mongoose模塊
- mkdir lesson15 && cd lesson15
- touch test_db.js
- npm install mongoose
- node test_db.js
- mongod
- 在另一個(gè)終端輸入 mongo