Node.js是2009年5月由Ryan Dahl 發佈的服務器程序。html
它封裝了Google V8 JavaScript 引擎, 並將其重建爲可在服務器上使用。node
它旨在提供一種簡單的構建可伸縮網絡程序的方法。它更改了一向的鏈接服務器的方法(好比一個請求就會成生一個新的OS線程,並分配必定量的RAM)。每個鏈接只是發射一個在node引擎的進程中運行的事件,採用事件驅動,這樣就解決了高併發。一個鏈接被創建,這是一個事件。數據經過鏈接進行接收,這也是一個事件。數據經過鏈接中止,這仍是一個事件。因此Node對於處理高流量程序很理想。web
Node.js用的common.js架構,採用CMD模式。npm
npm是Node.js的包管理工具。服務器
實戰一下,搭建Web服務器網絡
在網站根目錄添加server.js, 添加如下代碼架構
// http協議模塊 var http = require('http'); // url解析模塊 var url = require('url'); // 文件系統模塊 var fs = require('fs'); // 路徑解析模塊 var path = require('path'); var server = http.createServer(function(request,response){ var hasExt = true; var requestUrl = request.url; var pathName = url.parse(requestUrl).pathname; // 對請求的路徑進行解碼,防止中文亂碼 pathName = decodeURI(pathName); // 若是路徑中沒有擴展名 if (path.extname(pathName) === '') { // 若是不是以/結尾的,加/並做301重定向 if (pathName.charAt(pathName.length-1) != '/'){ pathName += '/'; var redirect = 'http://' + request.headers.host + pathName; response.writeHead(301, { location: redirect }); response.end(); return ; } // 添加默認的訪問頁面,但這個頁面不必定存在,後面會處理 pathName += 'index.html'; hasExt = false; // 標記默認頁面是程序自動添加的 } // 獲取資源文件的相對路徑(相對於這個js文件的地址) var filePath = path.join('path', pathName); // 獲取對應文件的文檔類型 var contentType = this.getContentType(filePath); // 若是文件名存在 fs.exists(filePath, function(exists) { if (exists) { response.writeHead(200, {'content-type': contentType}); var stream = fs.createReadStream(filePath, {flags: 'r', encoding: null}); stream.on('error', function () { response.writeHead(500, {'content-type': 'text/html'}); response.end('<h1>500 Server Error</h1>'); }); // 返回文件內容 stream.pipe(response); } else { // 文件名不存在的狀況 if (hasExt) { // 若是這個文件不是程序自動添加的,直接返回404 response.writeHead(404, {'content-type': 'text/html'}); response.end('<h1>404 Not Found</h1>'); } else { // 若是文件是程序自動添加的且不存在,則表示用戶但願訪問的是該目錄下的文件列表 var html = "<head><meta charset='utf-8'></head>"; try { // 用戶訪問目錄 var filedir = filePath.substring(0, filePath.lastIndexOf('\\')); // 獲取用戶訪問路徑下的文件列表 var files = fs.readdirSync(filedir); // 將訪問路徑下的因此文件一一列舉出來,並添加超連接,以便用戶進一步訪問 for (var i in files) { var filename = files[i]; html += "<div><a href='" + filename + "'>" + filename + "</a></div>"; } } catch (e){ html += '<h1>您訪問的目錄不存在</h1>'; } response.writeHead(200, {'content-type': 'text/html'}); response.end(html); } } }); });
執行node server.js, 啓動web服務器併發
訪問http://localhost:3030ide
停止服務器用ctrl+c, 或者調用server.close();高併發
Node語法可參考:https://juejin.im/post/5c4c0ee8f265da61117aa527
相對路徑:
./表示當前路徑下。../表示上一級路徑
做者:
After working on the Node project since 2009, Dahl announced in January, 2012 that he would step away from the project and turn over the reins to NPM creator and then Joyent employee Isaac Z. Schlueter.
Ryan Dahl gave the following reason for moving on from the project:
「After three years of working on Node, this frees me up to work on research projects. I am still an employee at Joyent and will advise from the sidelines but I won’t be involved in the day-to-day bug fixes.」