複習:Node.js開發服務器,數據、路由。本地關心的效果,交互;html
Node.js其實是極客開發出的一個小玩具,不是銀彈。有着別人不具有的怪異特色:node
單線程、Non-blocking I/O、Event Driven。 其實是一個特色。web
首先,Node不爲每一個用戶開闢一個線程,因此很是極端的選擇了單線程。單線程,要照顧全部的用戶,那麼就必須有非阻塞I/O,不然一我的的I/O就把別人、本身都阻塞了。一旦有非阻塞I/O,一我的若是I/O去了,就會放棄CPU的使用權,換成另外一我的使用CPU(或者執行此人後面的語句)。因此CPU的利用率100%。第一我的I/O結束了,就要用事件來通知線程,執行回調函數。此時必須有事件環,就有一個排隊調度機制。Node中有超過半數的C++代碼,在搭建事件環。npm
Node.js和別的老牌3P不同:json
1) 沒有本身的語法,使用V8引擎,因此就是JS。V8引擎解析JS的,效率很是高,而且V8中不少東西都是異步的。Node就是將V8中的一些功能本身沒有重寫(別人作了,本身就站在巨人肩膀上),移植到了服務器上。api
2) 沒有web容器,就是安裝配置完成以後,沒有一個根目錄。服務器
命令提示符所在路徑過重要了,由於程序中的全部相對路徑」./」,都是相對這個命令提示符路徑的,而不是相對於js文件本身。app
系統中,80端口,就是默認http端口。因此當沒有端口號的時候,就是80端口。異步
1 server.listen(80,"127.0.0.1");函數 |
● 在Node.js中,以模塊爲單位劃分全部功能,而且提供了一個完整的模塊加載機制,這時的咱們能夠將應用程序劃分爲各個不一樣的部分。
不可能用一個js文件去寫所有的業務。確定要有MVC。
● 狹義的說,每個JavaScript文件都是一個模塊;而多個JavaScript文件之間能夠相互require,他們共同實現了一個功能,他們總體對外,又稱爲一個廣義上的模塊。
● Node.js中,一個JavaScript文件中定義的變量、函數,都只在這個文件內部有效。當須要今後JS文件外部引用這些變量、函數時,必須使用exports對象進行暴露。使用者要用require()命令引用這個JS文件。
foo.js文件中的代碼:
1 var msg = "你好"; 2 3 exports.msg = msg; |
msg這個變量,是一個js文件內部纔有做用域的變量。
若是別人想用這個變量,那麼就要用exports進行暴露。
使用者:
1 var foo = require("./test/foo.js"); 2 3 console.log(foo.msg); |
使用者用foo來接收exports對象,也就是說,這裏的foo變量,就是文件中的exports變量。
● 一個JavaScript文件,能夠向外exports無數個變量、函數。可是require的時候,僅僅須要require這個JS文件一次。使用的它的變量、函數的時候,用點語法便可。因此,無形之中,增長了一個頂層命名空間。
js文件中,能夠用exports暴露不少東西,好比函數、變量。
1 var msg = "你好"; 2 var info = "呵呵"; 3 4 function showInfo(){ 5 console.log(info); 6 } 7 8 exports.msg = msg; 9 exports.info = info; 10 exports.showInfo = showInfo; |
在使用者中,只須要require一次。
1 var foo = require("./test/foo.js"); |
至關於增長了頂層變量。全部的函數、變量都要從這個頂層變量走:
1 console.log(foo.msg); 2 console.log(foo.info); 3 foo.showInfo(); |
Node中,js文件和js文件,就是被一個個exports和require構建成爲網狀的。
不是靠html文件統一在一塊兒的。
● 能夠將一個JavaScript文件中,描述一個類。用
module.export = 構造函數名;
的方式向外暴露一個類。
也就是說,js文件和js文件之間有兩種合做的模式:
1) 某一個js文件中,提供了函數,供別人使用。 只須要暴露函數就好了; exports.msg=msg;
2) 某一個js文件,描述了一個類。 module.exports = People;
● 若是在require命令中,這麼寫:
1 var foo = require("foo.js"); //沒有寫./, 因此不是一個相對路徑。是一個特殊的路徑 |
那麼Node.js將該文件視爲node_modules目錄下的一個文件
● node_modules文件夾並不必定在同級目錄裏面,在任何直接祖先級目錄中,均可以。甚至能夠放到NODE_PATH環境變量的文件夾中。這樣作的好處稍後你將知道:分享項目的時候,不須要帶着modules一塊兒給別人。
● 咱們可使用文件夾來管理模塊,好比
1 var bar = require("bar"); |
那麼Node.js將會去尋找node_modules目錄下的bar文件夾中的index.js去執行。
每個模塊文件夾中,推薦都寫一個package.json文件,這個文件的名字不能改。node將自動讀取裏面的配置。有一個main項,就是入口文件:
1 { 2 "name": "kaoladebar", 3 "version": "1.0.1", 4 "main" : "app.js" 5 } 6 |
package.json文件,要放到模塊文件夾的根目錄去。
咱們剛纔學習了,模塊就是一些功能的封裝,因此一些成熟的、常用的功能,都有人封裝成爲了模塊。而且放到了社區中,供人免費下載。
這個偉大的社區,叫作npm。 也是一個工具名字 node package management
去社區搜索需求,而後點進去,看api。
若是要配置一個模塊,那麼直接在cmd使用
1 npm install 模塊名字 |
就能夠安裝。 模塊名字全球惟一。
安裝的時候,要注意,命令提示符的所在位置。
1.咱們的依賴包,可能在隨時更新,咱們永遠想保持更新,或者某持某一個版本;
2.項目愈來愈大的時候,給別人看的時候,沒有必要再次共享咱們引用的第三方模塊。
咱們能夠用package.json來管理依賴。
在cmd中,使用npm init能夠初始化一個package.json文件,用回答問題的方式生成一個新的package.json文件。
使用
1 npm install |
將能安裝全部依賴。
npm也有文檔,這是package.json的介紹:
https://docs.npmjs.com/files/package.json
require()別的js文件的時候,將執行那個js文件。
注意:
require()中的路徑,是從當前這個js文件出發,找到別人。而fs模塊是從命令提示符找到別人。
因此,桌面上有一個a.js, test文件夾中有b.js、c.js、1.txt
a要引用b:
1 var b = require(「./test/b.js」); |
b要引用c:
1 var b = require(「./c.js」); |
可是,fs等其餘的模塊用到路徑的時候,都是相對於cmd命令光標所在位置。
因此,在b.js中想讀1.txt文件,推薦用絕對路徑:
1 fs.readFile(__dirname + "/1.txt",function(err,data){ 2 if(err) { throw err; } 3 console.log(data.toString()); 4 }); |
1 var alldata = ""; 2 //下面是post請求接收的一個公式 3 //node爲了追求極致,它是一個小段一個小段接收的。 4 //接受了一小段,可能就給別人去服務了。防止一個過大的表單阻塞了整個進程 5 req.addListener("data",function(chunk){ 6 alldata += chunk; 7 }); 8 //所有傳輸完畢 9 req.addListener("end",function(){ 10 console.log(alldata.toString()); 11 res.end("success"); 12 }); |
原生寫POST處理,比較複雜,要寫兩個監聽。文件上傳業務比較難寫。
因此,用第三方模塊。formidable。
只要涉及文件上傳,那麼form標籤要加一個屬性:
1 <form action="http://127.0.0.1/dopost" method="post" enctype="multipart/form-data"> |
1 <a href="<%= url %>"><img src="<%= imageURL %>" alt=""></a> |
數據綁定,就成爲一個完整的html字符串了。
前臺的模板,咱們如今要學習的是後臺的模板。
後臺模板,著名的有兩個,第一個叫作ejs; 第二個叫作jade。
是npm第三方包。
Embedded JavaScript templates
後臺模板引擎
1 <ul> 2 <% for(var i = 0 ; i < news.length ; i++){ %> 3 <li><%= news[i] %></li> 4 <% } %> 5 </ul> |
1 var dictionary = { 2 a:6, 3 news : ["1期班太牛逼了","高薪就業","哈哈哈哈哈"] 4 }; |