簡單類express實現

最近公司app的開發又緩慢了下來,于是又重新看node,上一次用node實現個人blog(前端angular)已有兩個月了。廢話不多說,先談談最近對node的新理解。

  • node是屬于后端,但與C、Java 、Python等后端不一樣。node不屬于一門語言,只是一個運行Javascript的平臺。這也是官網的描述:

Node.js? is a JavaScript runtime built onChrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem,npm, is the largest ecosystem of open source libraries in the world.

  • 那Node為什么選擇javascript為載體語言?
    事實上,在實現 Node.js 之初,作者 Ryan Dahl 并沒有選擇 JavaScript,他嘗試過 C、Lua,皆因其欠缺一些高級語言的特性,如閉包、函數式編程,致使程序復雜,難以維護。
      而 JavaScript 則是支持函數式編程范型的語言,很好地契合了 Node.js 基于事件驅動的編程模型。加之 Google 提供的 V8 引擎,使 JavaScript 語言的執行速度大大提高。最終呈現在我們面前的就成了 Node.js,而不是 Node.c,Node.lua 或其他語言的實現。
      還有一點就是方便推廣node,JavaScript作為一門腳本語言,已經廣受認可,而且JavaScript最近崛起得比較快,十分熱門,有各種前輩使用JavaScript去實現各種功能,node打上這個快車就能很容易打入市場,畢竟前端程序員能用較低成本去達成node入門級,然后搭建個小網站或博客時使用一門語言就可以完成了,后面也容易達成全棧。

正文

express的使用

var express = require('express');
var app = express();
app.listen(3000);

能看出引入express時獲得的是一個Function,然后調用獲得一個對象,最后調用其listen方法去開啟服務

由此我們自己可以這樣實現

var http=require('http')
var CreateApplication = function(){};
CreateApplication.prototype.listen=function(port,cb){
     var server = http.createServer(function(req,res){
     });
     server.listen(port,cb)
}
var express = function() {
    return new CreateApplication();
} ;

express路由的使用

var express = require('express');
var app = express();
app.use('/',function(req,res){res.end('hello')});
app.listen(3000);

use的方法是對路由的保存

我們自己可以這樣實現,對象創建時初始化一個空數組route,然后調用對象的use方法時把路由添加到route里

var CreateApplication = function() {
    this.route = [];
};

CreateApplication.prototype.use = function(path,fn) {
    this.route.push({
        path:path,
        fn:fn
    })
}

要路由生效的話,只需要在http.createServer里循環route去判斷就行

CreateApplication.prototype.listen = function(port,cb) {
    var self = this;
    var server = http.createServer(function(req,res) {
        for(let i=0,len = self.route.length;i<len;i++) {
            let tar = self.route[i];
            if(tar.path == req.url) {
                return tar.fn(req,res);
            }
        }
        res.end('Cannot '+req.method+' '+ req.url);
    });
    server.listen(port,cb)
};

所有代碼及驗證

var http = require('http');

var CreateApplication = function() {
    this.route = [];
};

CreateApplication.prototype.use = function(path,fn) {
    this.route.push({
        path:path,
        fn:fn
    })
}

CreateApplication.prototype.listen = function(port,cb) {
    var self = this;
    var server = http.createServer(function(req,res) {
        for(let i=0,len = self.route.length;i<len;i++) {
            let tar = self.route[i];
            if(tar.path == req.url) {
                return tar.fn(req,res);
            }
        }
        res.end('Cannot '+req.method+' '+ req.url);
    });
    server.listen(port,cb)
};

var express = function() {
    return new CreateApplication();
}

var app = express();
app.use('/hello',(req,res) => res.end('hello world'));
app.use('/hey',(req,res) => res.end('hey world'))
app.listen(3001,() => {
    console.log('running on port'+3001);
})

如果覺得文章對你有點用的話,麻煩拿出手機,這里有一個你我都有的小福利(每天一次): 打開支付寶首頁搜索“8601304”,即可領紅包。謝謝支持

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容