5 回答

TA貢獻1934條經驗 獲得超2個贊
node.js實現web服務器還是比較簡單的,我了解node.js是從《node入門》開始的,如果你不了解node.js也可以看看!
我根據那書一步一步的練習完了,也的確大概了解了node.js,不過里面寫的路由的地方總感覺不方便,十一放假最后一天,試著寫了個簡單的web服務器,現在分享記錄于此!
http模塊已提供了基本功能,所以我主要解決兩個問題,1是靜態資源的處理,2是動態資源的路由。
靜態資源在node.js里的意思是不變的,如圖片、前端js、css、html頁面等。
動態資源我們一般指aspx頁面,ashx頁面,asp頁面,jsp頁面,php頁面等,而node.js里其實沒動態資源這一說,它對請求的處理都是由回調方法完成的,在我實現的httserver里,借鑒了ashx的寫法,把處理請求的js文件看作動態資源。
首先實現一個處理靜態資源的函數,其實就是對本地文件的讀取操作,這個方法已滿足了上面說的靜態資源的處理。
//處理靜態資源
function staticResHandler(localPath, ext, response) {
fs.readFile(localPath, "binary", function (error, file) {
if (error) {
response.writeHead(500, { "Content-Type": "text/plain" });
response.end("Server Error:" + error);
} else {
response.writeHead(200, { "Content-Type": getContentTypeByExt(ext) });
response.end(file, "binary");
}
});
}
而動態資源肯定不能一個方法搞定,就像你的網站有register.aspx、login.aspx等等,都需要你自己來寫,在我的httpserver里,每個處理請求的js模塊都導出processRequest(request,response)即可,比如實現一個register.js(只輸出字符串register)
exports.processRequest = function (request, response) {
response.writeHead(200, { 'Content-Type': 'text/plain' });
resp.end("register");
}
現在當請求到來時,我們要做的就是決定怎么處理,即路由。
因為靜態資源url指定靜態資源大家都很習慣了,所以這里不變,比如
訪問http://localhost/img/logo.png 就是訪問 web根目錄\img\logo.png;
訪問http://localhost/js/what.js 就是訪問 web根目錄\js\what.js;
而動態資源也是一般的js文件,即服務器端js,就比如我實現的這個httpserver.js和上面說的register.js都是不應該讓用戶訪問的,所以路由的時候要判斷,就是一些if、else,簡單而強大是我的最愛,這里只看最后的的判斷,
fs.exists(localPath, function (exists) {
if (exists) {
if (staticRes) {
staticResHandler(localPath, ext, response); //靜態資源

TA貢獻1818條經驗 獲得超7個贊
Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對于單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能
比如排序、聚合等,對于這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

TA貢獻1757條經驗 獲得超8個贊
去除不必要的插件
剛開始用 webpack 的時候,開發環境和生產環境用的是同一個 webpack 配置文件,導致生產環境打包的 JS 文件包含了一大堆沒必要的插件,比如 HotModuleReplacementPlugin, NoErrorsPlugin... 這時候不管用什么優化方式,都沒多大效果。所以,如果你打包后的文件非常大的話,先檢查下是不是包含了這些插件。
提取第三方庫
像 react 這個庫的核心代碼就有 627 KB,這樣和我們的源代碼放在一起打包,體積肯定會很大。所以可以在 webpack 中設置
{
entry: {
bundle: 'app'
vendor: ['react']
}
plugins: {
new webpack.optimize.CommonsChunkPlugin('vendor', 'vendor.js')
}
}
添加回答
舉報