鍍金池/ 教程/ HTML/ 線上部署:heroku
瀏覽器端測試:mocha,chai,phantomjs
搭建 Node.js 開發(fā)環(huán)境
測試用例:mocha,should,istanbul
線上部署:heroku
Mongodb 與 Mongoose 的使用
使用 superagent 與 cheerio 完成簡單爬蟲
js 中的那些最佳實(shí)踐
使用 eventproxy 控制并發(fā)
使用 promise 替代回調(diào)函數(shù)
作用域與閉包:this,var,(function () {})
持續(xù)集成平臺:travis
測試用例:supertest
benchmark 怎么寫
使用 async 控制并發(fā)
學(xué)習(xí)使用外部模塊
一個最簡單的 express 應(yīng)用
正則表達(dá)式
cookie 和 session

線上部署:heroku

目標(biāo)

https://github.com/Ricardo-Li/node-practice-2 這個項(xiàng)目部署上 heroku,成為一個線上項(xiàng)目

我部署的在這里 http://serene-falls-9294.herokuapp.com/

知識點(diǎn)

  1. 學(xué)習(xí) heroku 的線上部署(https://www.heroku.com/ )

課程內(nèi)容

什么是 heroku

heroku 是弄 ruby 的 paas 起家,現(xiàn)在支持多種語言環(huán)境,更甚的是它強(qiáng)大的 add-on 服務(wù)。

paas 平臺相信大家都不陌生。Google 有 gae,國內(nèi)新浪有 sae。paas 平臺相對 vps 來說,不需要你配置服務(wù)器,不需要裝數(shù)據(jù)庫,也不需要理會負(fù)載均衡。這一切都可以在平臺上直接獲取。

你只要專注自己的業(yè)務(wù),把應(yīng)用的邏輯寫好,然后發(fā)布上去,應(yīng)用自然就上線了。數(shù)據(jù)庫方面,如果你用 mysql,那么你可以從平臺商那里得到一個 mysql 的地址、賬號和密碼,直接連接就能用。如果應(yīng)用的流量增大,需要橫向拓展,則只用去到 paas 平臺的管理頁面,增大服務(wù)器實(shí)例的數(shù)量即可,負(fù)載均衡會自動幫你完成。

說起來,我之所以對于 web 開發(fā)產(chǎn)生興趣也是因?yàn)楫?dāng)年 gae 的關(guān)系。那時候除了 gae 之外,沒有別的 paas 平臺,gae 是橫空出世的。有款翻墻的軟件,叫 gappproxy(https://code.google.com/p/gappproxy/ )——可以認(rèn)為是 goagent 的前身——就是搭建在 gae 上面的,不僅快,而且免費(fèi)。于是我就很想弄懂這樣一個程序是如何開發(fā)的。好在 gappproxy 是開源的,于是我下了源碼來看,那時候才大一,只學(xué)過 c,看到那些 python 代碼就凌亂了。于是轉(zhuǎn)頭也去學(xué) python,后來漸漸發(fā)現(xiàn)了 web 開發(fā)的樂趣,于是 ruby 和 node.js 也碰碰。后來 goagent 火起來了,我又去看了看它的代碼,發(fā)現(xiàn)非常難看,就自己寫了個 https://github.com/alsotang/keepagent 。不過現(xiàn)在回想起來,還是 goagent 的實(shí)現(xiàn)比較穩(wěn)定以及效率高。

heroku 的免費(fèi)額度還是足夠的,對于 demo 應(yīng)用來說,放上去是綽綽有余的。各位搞 web 開發(fā)的大學(xué)生朋友,一定要試著讓你開發(fā)的項(xiàng)目盡可能早地去線上跑,這樣你的項(xiàng)目可以被其他人看到,能夠促使你更有熱情地進(jìn)行進(jìn)一步開發(fā)。這回我們放的是 cnode 社區(qū)的爬蟲上去,你其實(shí)可以試著為你們學(xué)院或者學(xué)校的新聞?wù)军c(diǎn)寫個爬蟲,提供 json api,然后去申請個微信公共平臺,每天推送學(xué)院網(wǎng)站的新聞。這東西輔導(dǎo)員是有需求的,可以做個給他們用。

好了,我們先 clone https://github.com/Ricardo-Li/node-practice-2 這個項(xiàng)目。由于我們這回講部署,所以代碼就用現(xiàn)成的了,代碼的內(nèi)容就是 lesson 3(https://github.com/alsotang/node-lessons/tree/master/lesson3 ) 里面的那個爬蟲。

http://wiki.jikexueyuan.com/project/node-lessons/images/12-1.png" alt="" />

clone 下來以后,我們?nèi)タ纯创a。代碼中有兩個特殊的地方,

一個是一個叫 Procfile 的文件,內(nèi)容是:

web: node app.js

一個是 app.js 里面,

app.listen(process.env.PORT || 5000);

這兩者都是為了部署 heroku 所做的。

大家有沒有想過,當(dāng)部署一個應(yīng)用上 paas 平臺以后,paas 要為我們干些什么?

首先,平臺要有我們語言的運(yùn)行時;

然后,對于 node.js 來說,它要幫我們安裝 package.json 里面的依賴;

然后呢?然后需要啟動我們的項(xiàng)目;

然后把外界的流量導(dǎo)入我們的項(xiàng)目,讓我們的項(xiàng)目提供服務(wù)。

上面那兩處特殊的地方,一個是啟動項(xiàng)目的,一個是導(dǎo)流量的。

heroku 雖然能推測出你的應(yīng)用是 node.js 應(yīng)用,但它不懂你的主程序是哪個,所以我們提供了 Procfile 來指導(dǎo)它啟動我們的程序。

而我們的程序,本來是監(jiān)聽 5000 端口的,但是 heroku 并不知道。當(dāng)然,你也可以在 Procfile 中告訴 heroku,可如果大家都監(jiān)聽 5000 端口,這時候不就有沖突了嗎?所以這個地方,heroku 使用了主動的策略,主動提供一個環(huán)境變量 process.env.PORT 來供我們監(jiān)聽。

這樣的話,一個簡單 app 的配置就完成了。

我們?nèi)?https://www.heroku.com/ 申請個賬號,然后下載它的工具包 https://toolbelt.heroku.com/ ,然后再在命令行里面,通過 heroku login 來登錄。

上述步驟完成后,我們進(jìn)入 node-practice-2 的目錄,執(zhí)行 heroku create。這時候,heroku 會為我們隨機(jī)取一個應(yīng)用名字,并提供一個 git 倉庫給我們。

http://wiki.jikexueyuan.com/project/node-lessons/images/12-2.png" alt="" />

接著,往 heroku 這個遠(yuǎn)端地址推送我們的 master 分支:

http://wiki.jikexueyuan.com/project/node-lessons/images/12-3.png" alt="" />

heroku 會自動檢測出我們是 node.js 程序,并安裝依賴,然后按照 Procfile 進(jìn)行啟動。

push 完成后,在命令鍵入 heroku open,則 heroku 會自動打開瀏覽器帶我們?nèi)サ较鄳?yīng)的網(wǎng)址:

http://wiki.jikexueyuan.com/project/node-lessons/images/12-4.png" alt="" />

到此課程也就結(jié)束了。

隨便聊聊 heroku 的 addon 吧。這個 addon 確實(shí)是個神奇的東西,反正在 heroku 之外我還沒怎么見到這類概念。這些 addon 提供商,有些提供 redis 的服務(wù),有些提供 mongodb,有些提供 mysql。你可以直接在 heroku 上面進(jìn)行購買,然后 heroku 就會提供一段相應(yīng)服務(wù)的地址和賬號密碼給你用來連接。

大家可以去 https://addons.heroku.com/ 這個頁面看看,玲瑯滿目各種應(yīng)用可以方便接入。之所以這類服務(wù)有市場,也是因?yàn)閬嗰R遜的 aws 非常牛逼。為什么這么說呢,因?yàn)榫W(wǎng)絡(luò)速度啊。如果現(xiàn)在在國內(nèi),你在 ucloud 買個主機(jī),然后用個阿里云的 rds,那么應(yīng)用的響應(yīng)速度會因?yàn)?mysql 連接的問題卡得動不了。但在 heroku 這里,提供商們,包括 heroku 自己,都是構(gòu)建在 aws 上面,這樣一來,各種服務(wù)的互通其實(shí)走的是內(nèi)網(wǎng),速度很可以接受,于是各種 addon 提供商就做起來了。

國內(nèi)的話,其實(shí)在阿里云上面也可以考慮這么搞一搞。

完。