node.js學習筆記整理(二)
阿新 • • 發佈:2018-12-28
(1)前端專案自動化構建
1、建立myProject專案檔案以及對應的資料夾
var projectData ={ 'name':'myProject', 'fileData':[ { 'name':'css', 'type':'dir' },{ 'name':'js', 'type':'dir' },{ 'name':'images', 'type':'dir' },{ 'name':'index.html', 'type':'file', 'content' : '<html>\n\t<head>\n\t\t<title>title</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello</h1>\n\t</body>\n</html>' } ] }; var fs = require('fs'); if(projectData.name){ // 建立專案資料夾 fs.mkdirSync(projectData.name); var fileData = projectData.fileData; if(fileData && fileData.length){ fileData.forEach(function(file){ //檔案或資料夾路徑 file.path = './'+projectData.name +'/'+ file.name; //根據type型別建立檔案或資料夾 file.content = file.content || ''; switch(file.type){ case 'dir': fs.mkdirSync(file.path); break; case 'file': fs.writeFileSync(file.path,file.content); break; default: break; } }); } }
2、自動打包多個檔案
var fs = require('fs'); var filedir = './myProject/dist'; fs.exists(filedir,function(isExists){ if(!isExists){ fs.mkdirSync(filedir); } fs.watch(filedir,function(ev,file){ //只要有一個檔案發生了變化,我們就需要對資料夾下的所有檔案進行讀取、合併 fs.readdir(filedir,function(err,dataList){ var arr = []; dataList.forEach(function(file){ if(file){ //statSync檢視檔案屬性 var info = fs.statSync(filedir + '/' +file); //mode檔案許可權 if(info.mode === 33206){ arr.push(filedir + '/' +file); } } }); //讀取陣列中的檔案內容 var content = ''; arr.forEach(function(file){ var c = fs.readFileSync(file); content += c.toString()+'\n'; }); //合併檔案中的內容 fs.writeFileSync('./myProject/js/index.js',content); }) }); });
(2)使用node進行web開發
1、搭建一個http的伺服器,用於處理使用者傳送的http請求
//載入一個http模組 var http = require('http'); //通過http模組下的createServer建立並返回一個web伺服器物件 var server = http.createServer(); //開啟 HTTP 伺服器監聽連線,只有呼叫了listen方法以後,伺服器才開始工作 server.listen(8000,'localhost'); //伺服器是否正在監聽連線 server.on('listening',function(){ console.log("listening.........."); }); //每次接收到一個請求時觸發,每個連線可能有多個請求(在 HTTP keep-alive 連線的情況下)。 server.on('request',function(){ res.write('<p>hello</p>'); res.end(); });
2、request方法有兩個引數:request、response
1)request:http.IncomingMessage的一個例項,獲取請求的一些資訊,如頭資訊,資料等
httpVession:使用的http協議的版本
headers:請求頭資訊中的資料
url:請求的地址
method:請求的方式
2)response:http.ServerResponse的一個例項,可以向請求的客戶端輸出返回響應
write(chunk,encoding):傳送一個數據塊到相應正文中
end(chunk,encoding):當所有的正文和頭資訊傳送完成以後呼叫該方法告訴伺服器資料已經全部發送完成了,這個方法在每次完成資訊傳送以後必須呼叫,並且是最後呼叫。
statusCode:該屬性用來設定返回的狀態碼
setHeader(name,value):設定返回頭資訊
writeHead(statusCode,reasonPhrase,headers)這個方法只能在當前請求中使用一次,並且必須在response.end()之前呼叫
3、使用fs模組實現行為表現分離
var http = require('http');
var url = require('url');
var fs = require('fs');
var server = http.createServer();
//html檔案的路徑
var htmlDir = __dirname + '/html/';
server.on('request',function(request,response){
var urlStr = url.parse(request.url);
//根據pathname匹配對應的html檔案
switch(urlStr.pathname){
case '/':
sendData(htmlDir + 'index.html',request,response);
break;
case '/user':
sendData(htmlDir + 'user.html',request,response);
break;
case '/login':
sendData(htmlDir + 'login.html',request,response);
break;
default:
//處理其他情況
sendData(htmlDir + 'err.html',request,response );
break;
}
});
function sendData(file,request,response){
//讀取檔案,存在則返回對應讀取的內容,不存在則返回錯誤資訊
fs.readFile(file,function(err,data){
if(err){
response.writeHead(404,{
'content-type':'text/html;charset=utf-8'
});
response.end('<h1>頁面不存在</h1>')
}else{
response.writeHead(200,{
'content-type':'text/html;charset=utf-8'
});
response.end(data);
}
})
}
server.listen(8000,'localhost');