NodeJS 入門第二天(EJS模板)


一、復習

復習:Node.js開發服務器,數據、路由。本地關心的效果,交互;

Node.js實際上是極客開發出的一個小玩具,不是銀彈。有着別人不具備的怪異特點:

單線程、Non-blocking I/OEvent Driven。 實際上是一個特點。

首先,Node不為每個用戶開辟一個線程,所以非常極端的選擇了單線程。單線程,要照顧所有的用戶,那么就必須有非阻塞I/O,否則一個人的I/O就把別人、自己都阻塞了。一旦有非阻塞I/O,一個人如果I/O去了,就會放棄CPU的使用權,換成另一個人使用CPU(或者執行此人后面的語句)。所以CPU的利用率100%。第一個人I/O結束了,就要用事件來通知線程,執行回調函數。此時必須有事件環,就有一個排隊調度機制。Node中有超過半數的C++代碼,在搭建事件環。

 

Node.js和別的老牌3P不一樣:

1) 沒有自己的語法,使用V8引擎,所以就是JSV8引擎解析JS的,效率非常高,並且V8中很多東西都是異步的。Node就是將V8中的一些功能自己沒有重寫(別人做了,自己就站在巨人肩膀上),移植到了服務器上。

2) 沒有web容器,就是安裝配置完成之后,沒有一個根目錄。

命令提示符所在路徑太重要了,因為程序中的所有相對路徑”./”,都是相對這個命令提示符路徑的,而不是相對於js文件自己。

系統中,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 = "你好";

3 exports.msg = msg;

msg這個變量,是一個js文件內部才有作用域的變量。

如果別人想用這個變量,那么就要用exports進行暴露

使用者:

1 var foo = require("./test/foo.js");

3 console.log(foo.msg);

使用者用foo來接收exports對象,也就是說,這里的foo變量,就是文件中的exports變量。

 

● 一個JavaScript文件,可以向外exports無數個變量、函數。但是require的時候,僅僅需要require這個JS文件一次。使用的它的變量、函數的時候,用點語法即可。所以,無形之中,增加了一個頂層命名空間。

 

js文件中,可以用exports暴露很多東西,比如函數、變量。

1 var msg = "你好";

2 var info = "呵呵";

4 function showInfo(){

5     console.log(info);

6 }

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文件,就是被一個個exportsrequire構建成為網狀的。

不是靠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 }

package.json文件,要放到模塊文件夾的根目錄去。


我們剛才學習了,模塊就是一些功能的封裝,所以一些成熟的、經常使用的功能,都有人封裝成為了模塊。並且放到了社區中,供人免費下載。

這個偉大的社區,叫做npm。 也是一個工具名字  node package management

https://www.npmjs.com/

 

去社區搜索需求,然后點進去,看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.jsc.js1.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 });


三、post請求

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第三方包。

 

先說EJS

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 };

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM