国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Express 實戰(一):概覽

zhaochunqi / 1881人閱讀

摘要:一個標準性的事件就是年的橫空出世。引擎快速處理能力和異步編程風格,讓開發者從多線程中解脫了出來。其次,通過異步編程范式將其高并發的能力發揮的淋漓盡致。它也僅僅是一個處理請求并作出響應的函數,并無任何特殊之處。

在正式學習 Express 內容之前,我們有必要從大的方面了解一下 Node.js 。

在很長的一段時間里,JavaScript 一門編寫瀏覽器中運行腳本的語言。不過近些年,隨著互聯網的發展以及技術進步,JavaScript 迎來了一個集中爆發的時代。一個標準性的事件就是 09 年 Node.js 的橫空出世。

Node.js 由 Google Chrome 的 V8 引擎發展而來,它能夠讓 JavaScript 運行在服務端。從而極大的拓展了 JavaScript 的應用場景也讓 JavaScript 全棧成為了一個熱門話題。開發者不必再去學習 Ruby、Python、Java 等語言和框架,僅僅依靠 JavaScript 就能完成前后端的大部分開發任務。

雖然,從某些方面來說 JavaScript 并不完美甚至還有一些設計缺陷,但是這并不影響 Nodejs 的流行。V8 引擎快速處理能力和異步編程風格,讓開發者從多線程中解脫了出來。其中,前后端同一技術棧可以說是它最大的殺手锏。而日益豐富的生態環境也讓 JavaScript 受到開發者越來越多的關注,使用 Node.js 進行開發也變成了一件非常符合潮流的事情了。

和瀏覽器環境中的 JavaScript 一樣,Node.js 也只提供了構建應用基本所需的底層接口和特性。而這些底層接口一般都很冗長、難用。所以有人就在 Node.js 的基礎上實現了 Express 框架。其基本理念與 jQuery 類似,通過對底層接口進行了封裝,在簡化代碼的同時提供更高級的接口。另外,Express 拓展性也非常強。框架本身與程序的架構和業務無關,并且你還可以通過第三方庫進行功能拓展。

Node.js 應用場景

Node.js (通常簡稱為 Node )是一個 JavaScript 代碼的運行平臺。雖然大多數情形下 JavaScript 都運行在瀏覽器中,但是并沒有任何地方規定其只能運行在瀏覽器中。作為一門編程語言,本質上它與 Ruby、Python、C++、PHP 并沒有什么區別。就像你可以使用 python myfile.py 來運行 Python 腳本,你可以使用 ?node myfile.js 來執行 JavaScript 程序。

但是 Node 到底有啥優點值得我們在服務端開發是嘗試呢?

首先,Node.js 的 JavaScript 引擎非常快。畢竟,它是基于以速度著稱的 Google Chrome V8 引擎,可以每秒執行幾千條 JavaScript 指令。

其次,Node.js 通過異步編程范式將其高并發的能力發揮的淋漓盡致。

用現實生活中的烘焙做類比最恰當不過了。假設現在我需要制作一些松餅,那么首先就需要把面粉弄好。而此時我是無法抽身做其他的事情的。但是,一旦我把松餅送進烤箱,我就可以抽身做其他的事情而不必干等。

在 Node.js 中,客戶端可能隨時都會給服務端發送請求。有可能在你處理一個請求時,另一個請求也被客戶端送達了。假設,兩個請求都需要訪問數據庫。那么就可以在第一個請求進行數據庫操作時,轉去處理第二個請求。雖然不能同時對兩者做成響應,但是我們可以使用異步方式跳過對耗時操作結果的等待直接處理后續請求。而其他的一些運行環境默認是沒有此能力的。例如,Ruby on Rails 同時時間只能處理一個請求。如果想提高程序的并發能力,那么你就需要去購買更多的服務器。

下圖可以清晰的看出兩者的區別:

與同步方式相比,異步處理的效率明顯要更高,雖然異步代碼也不是并行處理。

當然,這并不是說異步處理機制讓 Node.js 是世界上最快的語言之一。Node.js 雖然能夠最大化壓制單核 CPU 的性能,但是還是無法與多核處理能力相媲美。其他語言中可以讓你利用多核能力同時執行多個任務。像之前和烘培一樣:你可以購買更多的烤箱來同時烤更多的餅干。Node 正在開始支持這個能力,但是它并不像其他語言中那樣重要。

就我個人而言,因為性能而選擇 Node.js 并不是最重要的依據,雖然,它確實比 Ruby、Python 等腳步語言要快。最大的理由是,它在前后端開發中使用同一種語言。

通常,在編寫 Web 應用程序時你都會要使用 JavaScript。但是在 Node.js 出現之前,前后端的開發必須使用不同的語言進行。為此你需要學習多種的語言和框架。有了 Node.js 之后,你就可以使用一門語言在前后端開發中自由切換,這是最吸引人的地方。

什么是 Express ?

Express 是一個基于 Node.js 封裝的上層服務框架,它提供了更簡潔的 API 更實用的新功能。它通過中間件和路由讓程序的組織管理變的更加容易;它提供了豐富的 HTTP 工具;它讓動態視圖的渲染變的更加容易;它還定義了一組可拓展標準。

Node.js 的功能

通過一個簡單的 JavaScript 函數,你就可以利用 Node.js 創建一個 Web 程序。該函數用于監聽來自瀏覽器或者其他設備的發起的網絡請求。當接收到一個請求后,函數會分析請求的內容并做成相應的處理。例如,當你請求站點主頁時,該函數就會知道知道你的目的并將主頁的 HTML 渲染出來。如果是請求某個 API 接口,該函數就會把對應的 JSON 數據返回給客戶端。

假設,現在需要服務器返回當前時間和時區信息給用戶,那么該程序大致包括如下功能:

如果客戶端發起主頁請求,Web 應用將會返回一個包含所需信息的 HTML 。

如果客戶端訪問地址錯誤,Web 應用將會返回 HTTP 404 錯誤,并附帶一段錯誤描述。

如果直接在 Node.js 之上構建該應用而不使用 Express 的話,那么完整流程圖大抵如下:

在上述流程中,開發人員只需要關注圓圈部分內容處理。

這個用于處理瀏覽器請求的 JavaScript 函數叫做請求處理函數(request handler)。它也僅僅是一個處理請求并作出響應的 JavaScript 函數,并無任何特殊之處。Node.js 的 HTTP 服務會接管其中的網絡連接,所以你無需關注和處理復雜的網絡協議內容。

從代碼角度來說,該函數包含兩個參數:一個是網絡請求 request 對象 ,另一個表示網絡響應的 response 對象。在前面時間信息應用中,該請求處理函數會檢查請求 URL 。如果請求的是主頁,那么就返回成功的響應頁面。否則,返回 404 錯誤。沒有 Node.js 應用中都是這么處理的:編寫處理函數對請求作出響應,非常的簡單。

問題在于,Node.js 的 API 對開發者來說并不是非常友好。例如,如果我們想發送一個 JPEG 圖片的話,可能需要至少 45 行代碼才行。創建可復用 HTML 模版則更復雜。另外,Node.js 的 HTTP 模塊雖然強大,但是仍然缺少一些實用特性。

Express 的出現就是為了解決這些問題,讓你能夠高效的使用 Node.js 來編寫 Web 應用。

Express 給 Node.js 帶來了什么?

從大的方面來說,Express 為 Node.js 的 HTTP 模塊帶來了兩大特性:

通過提供大量易用接口,簡化了程序的復雜度。例如上面放松 JPEG 圖片問題,Express 可以將代碼壓縮帶一行。

它允許對請求處理函數進行拆分,將其重構為很多負責特定請求的小型請求處理函數。這便于模塊化和后期維護。

與上圖相比,下圖是 Express 處理請求的大致流程:

與之前一樣,開發者只需要關注圓圈部分的內容。

雖然,圖看起來比前面復雜,但是實際開發卻更簡單,本質上它主要做了兩件事:

與之前一個大型的 request 請求處理函數不同,這里使用大量小型處理函數。有些函數每次都會執行(例如,請求日志),而有些函數只在特定情形下才會觸發(例如,404 錯誤)。Express 有很多使用的工具能夠對這些處理函數進行區分。

請求處理函數中有兩個參數:request 和 response。Node 的 HTTP 可以對其做些基本處理,例如:獲取瀏覽器的 user-agent 。Express 則更為強大,你可以獲取到訪問者 IP 地址,以及解析優化過的 URL 請求對象。esponse 對象也同樣得到了增強。通過類似 sendFile 這樣的函數將文件傳輸代碼壓縮至一行。這極大的簡化了處理函數的功能實現。

利用 Express 提供的簡潔 API 接口,通過編寫小型 request 請求處理函數,可以極大的壓縮代碼量提高開發效率。

Express 的最小化理念

雖然 Express 是一個框架,但是它的編程規范非常靈活。你可以用它編寫各種類型的應用,從視頻聊天到個人博客等等。另外,Express 本身并不是百寶箱,你可能會在實際開發中需要使用大量第三方類庫。這些類庫能幫你解決一些次要問題,這樣你可以將關注點地放在那些重要的問題上,然后發揚 Unix do-one-thing-well 的哲學將事情處理好。

但是這種最小化理念也是一把雙刃劍。一方面,Express 非常靈活可靠,而且不會引入那些無用的垃圾代碼。另一方面,與其他框架相比這種簡潔不可避免導致了部分功能缺失。這意味需要在程序架構上做更多的功課,并且在出現問題后要花時間去尋找第三方模塊。離開箱即用還差一點。

有人喜歡靈活多變的框架,而有人則喜歡那些結構固定的框架。例如,PayPal 雖然也使用 Express,但是卻制定了嚴格的規范來約束其開發者。Express 本身并不關注程序架構,所以程序員可以根據偏好自行選擇。由于對程序有著絕對控制權,所以一旦你做出不明智的決策,那么后面的坑你就慢慢爬吧。

對于大型框架和極簡框架的優劣,從來都沒有固定的正確答案,所以我們無須太過糾結。這里,我只希望你記住 Express 是一個極簡框架。

Express 的核心

Express 非常簡潔而且對 Node.js 的封裝效果也非常棒,而這一切都源于框架中的四個設計。

中間件

正如之前提到的,原生的 Node.js 使用一個 request 處理函數應對所有請求并做出響應。

Middleware 這個名字起的并不好,但是這個術語并不是 Express 獨有,相反它已經存在很久了。概念非常簡單:我們不采用一個巨大的 request 請求處理函數,相反我們將一系列簡單的處理函數組合起來。每一個小的處理函數對應一個小任務,而這些處理函數就被稱為中間件。

中間件可以處理各種任務,從記錄請求到發送靜態文件到設置 HTTP 頭部。例如,應用中使用的第一個中間件功能可能就是記錄服務器中每個請求的 logger-log。當日志記錄完成后,它將繼續執行調用鏈中的下一個中間件。而下一個中間件功能可能會去驗證用戶。如果權限不夠,就會使用“未授權”進行提示。反之則繼續執行下一個中間件。此時中間件功能可能會是渲染主頁并結束響應。下圖演示了這兩種情形:

在圖中可以看出,記錄日志的中間件位于第一個并且肯定會被執行。緊接著就是執行權限認證的中間件。如果用戶權限滿足的話就繼續執行下一個中間件,否則就不再執行后續中間件。

中間件最大的特點就是其相對來說比較標準,這也意味著開發者可以通過為 Express 開發中間件來拓展其功能。同時,這也許意味著某些通用的中間件,很有可能已經有人開發過來,例如: LESS 和 SCSS 等靜態文件的編譯、權限控制、cookies 和 sessions 的解析。

路由

相比中間件,Routing 顯然更好。與中間價類似,路由對請求處理函數進行了拆分。不同的是,路由根據請求的 URL 和 HTTP 方法來決定處理方式的。

例如,你的程序中有一個主頁和一個留言板頁面。當用戶使用 GET 去請求主頁時,Express 會返回對應的主頁內容。對留言板的請求的處理也是如此。如果用戶通過 POST 方法在留言板頁面中進行了留言操作的話,路由需要做出對應處理并刷新頁面。

類似于中間件,上述路由的處理也是通過處理函數進行定義的。而不同的行為會調用不同的處理函數。

Express 中的中間件和路由相輔相成。例如:你可以一邊記錄請求日志,同時對主頁路由做出響應。

子應用

Express 應用通常都很小,甚至可以是一個文件。隨著應用規模的擴張,可能你會將其進行拆分為多個文件和文件夾。雖然 Express 對應用的規模增長沒有明確的指導規則。但是我們可以通過 sub-applications 這一重要特性來作出應對。 在 Express 術語中這些只應用也被稱為路由器

通過實現正常規模的路由器子應用,可以將一個大型應用進行模塊拆分。甚至你可以對某些子應用進行更細致的拆分。例如,在應用中可能存在管理后臺、單頁應用、API 接口 等等幾個子模塊。這時,你就可以將這些子模塊作為一個子應用來實現。詳情如下:

當程序規模變大之后,該特性的優勢將會逐步凸顯出來。

易用的 API 函數

Express 由中間件和路由構成,在其中你需要編寫大量的異步處理函數來實現相關功能。

為了使處理過程更加高效正確,Express 在原生的 Node.js 基礎上進行了大量的封裝。在壓縮代碼量提高效率的同時也降低了人為錯誤的概率。除了發送文件之外,Express 提供的 HTML 渲染功能也讓原生 Node.js 望塵莫及。另外在請求解析方面,Express 也做了非常多的工作。

跟前面的特性不一樣的是,在保持功能強大的同時這些易用的函數并不會對應用造成負面影響。

Express 生態環境

像其他的工具一樣,Express 并不是遺世獨立的。

它存活于 Node.js 的生態中,所有你能找到大量的第三發模塊提升你的開發效率,例如數據庫連接驅動。因為Express 可拓展性極強,所有整個生態中存在大量為 Express 開發的類庫。

Express 跟其他框架的比較

Express 既不是第一個 Web 框架,當然更不會是最后一個。

同樣,Express 也不是 Node.js 生態中的唯一框架。可能它最大的競爭對手就是 Hapi.js 了。與 Express 類似,它也有路由、中間件這就概念。不過不同的是它沒有基于 Node.js 的 HTTP 模塊來處理網絡請求,而是有 Walmart 開發的網絡模塊。該模塊被 Mozilla,OpenTable 和 NPM 所接受并在真實程序中檢驗過。作為 Express 的最大競爭對手,因此我懷疑雙方的開發人員可能彼此抱有不小敵意。

在 Node.js 世界中最流行的大型框架非全棧式的 Meteor 莫屬。相比自由靈活的 Express ,Metero 有著非常嚴格的程序結構。不同于 Express 只關注 HTTP 層的處理,Meteor 作為全棧框架可以同時運行在客戶端和服務端。當然,這僅僅只是設計上的選擇說不上到底誰更優秀。

跟 Express 基于 Node.js 進行封裝類似,也有人對 Express 進行更高級的封裝。例如,PayPal 創造的 Kraken 。盡管從技術角度來說,Kraken 不過只是 Express 的一個中間件而已。但是,它還是做了不少的事情,例如:中間件的安全綁定。Sails.js 則是另一個以 Express 為基礎的新型框架,它內置了數據庫、WebSocket 集成、API 生產等等功能。所有的這些框架,都是 Express 的一種相對固定化的封裝實現。

Express 最主要的幾個特性之一就是中間件。Connect 是一個僅作用于 Node.js 和中間件的框架。它沒有提供路由和易用函數接口。而 Express 曾經在它的中間件層中使用了 Connect。雖然現在被拋棄了,但是 Express 中間件一直都完全兼容 Connect 中間件。這意味著 Express 的火力得到了更大的提升。

除了上面提到的這些,還有很多使用其它語言實現的 Web 框架。

Express 的很多靈感都來自于 Ruby 世界中的輕型 Web 框架 Sinatra。與 Express 類似,Sinatra 中也有路由和中間件功能。Sinatra 框架思想被其他很多語言所借鑒并且重新實現,如果你曾經用過這類框架的話,那么對 Express 一定不會陌生。當然,Express 也借鑒了 Python 中的 Bottle 和 Flask 框架。

相應的,Express 與 Django、Ruby on Rails、ASP.NET 等框架差距巨大。這些框架都十分龐大,而且程序結構也相對固定功能更為豐富。而且,Express 與 PHP 也差異明顯,雖然都是運行在服務上但是后者與 HTML 緊耦合。

Express 僅僅是服務端 Web 框架中的一種,所以我們不能在這里說 Express 就一定比其他的框架好。它具備一些獨有的特性,例如,Node.js 的性能以及前后端統一的語言。但是與之同時,它的功能遠比其他框架來的少而去 JavaScript 也并不是一門得到廣大開發者認可的“好”語言。脫離具體場景討論優劣勢沒有意義的,下面我們就看看 Express 一些適用場景。

Express 的應用場景

理論上來說,Express 可以用來構建任何 Web 應用。對所有請求作出響應這件事上述提到的框架同樣能夠做到。所以,為什么要選擇 Express 呢?

最大的優點就是 Node.js 中編寫的 JavaScript 可以在瀏覽器和客戶端實現共享。從代碼復用角度來說,這種情況是最理想的。從心理角度來說也非常有用,開發過程中無需進行服務器模式和客戶端模式的切換。前端開發者可以在不學習新語言的情況下直接就可以編寫后端代碼。當然,前端開發者還是需要學習一些新內容的,不然這本書就沒存在的必要了。

Express 可以幫助你做到這一點,人們已經為這個技術棧擬好了名稱:MEAN 。像 “LAMP” 代表 Linux、Apache、MySQL 和 PHP 一樣,“MEAN” 表示 MongoDB、Express、Angular 和 Node.js。人們之所以對它喜愛有加是因為它是純 JavaScript 技術棧。

Express 常用于驅動單頁應用程序(SPA)。SPA 在前端重度依賴 JavaScript,而且通常需要一個服務器組件。大多數服務器只需要簡單的提供 HTML、CSS 和 JavaScript ,但是有時候 REST API 也是常規需求。Express 可以同時完成這兩件任務,既可以提供 HTML 也非常適合構建 API 。 Express 相對較低的學習曲線使得前端開發者在幾乎無需學習新內容的情況下搭建一個 SPA 服務。

當你使用 Express 編寫應用的時候就決定了你必須使用 MEAN 技術棧中的 E 和 N 部分,而對于另外兩個 Express 沒有做出過限定你完全可以采用不同的方案。例如,可以使用 Backbone.js 替換其中的 Angular,構成 MEBN 技術棧。使用 SQL 替換 MongoDB 構成 SEAN 技術棧。雖然 MEAN 術語很常見而且配置也非常流行,但是你完全可以更具需要自行選擇。在這本書中我們將涵蓋的技術棧是 MEN:MongoDB、Express 和 Node.js。

另外 Express 還具有一些實時特性。雖然其他語言也支持 WebSocket 和 WebRTC,但是 Node.js 似乎要更強。這意味著你可以將這些特性應用到 Express 程序中。因為 Node.js 能做的,Express 一樣不少。

Node.js 和 Express 的第三方模塊

社區中存在大量可以在 Express 中使用的模塊。有一些是 Express 獨占的,這些模塊與路由和中間件的特性高度兼容。其他的非獨占模塊也能提升 Express 應用的開發體驗和程序性能。

如果你曾經有過 ERB、Jinja2、HAML 等模版引擎的使用經驗的話,你就會發現 Express 自帶的功能在渲染 HTML 方面簡直就是弱雞。好在 Express 還可以使用 EJS 和 Jade 這些社區模版引擎來解決這個問題。

另外,Express 本身并沒有對數據庫做支持。你可以通過文件、關系數據庫、或者其他機制來實現數據保存。不過后面將會介紹在 Express 中如何通過 Mongoose 來調用 MongoDB 數據庫。

需要注意的一點是:并不存在 Express 模塊這一概念,所以第三方庫都是 Node.js 模塊。Node.js 模塊與 Express 相互兼容并且能夠配合其工作。所有這些某塊都是在 npm 倉庫注冊的 JavaScript 代碼塊,并且可以使用一致的方法進行安裝。與其他環境中一樣,模塊之間可以相互依賴,并且不同模塊可以相互配合。另外,Express 也不過是 Node.js 中的一個模塊而已。

Hello World

每次學習新內容的時候,絕大多數都是從 Hello World 開始。

那么現在我們來看看如何使用 Express 構建一個簡單的 Hello World 工程。不要太關注代碼的細節,后面將會進行詳細介紹。代碼如下:

var express = require("express");? #A
?
var app = express();? #B
?
app.get("/", function(request, response) {? #C
? response.send("Hello world!");??????????? #C
});???????????????????????????????????????? #C
?
app.listen(3000, function() {??????????????????? ???#D
? console.log("Express app started on port 3000."); #D
});???????????????????????????????????????????????? #D

A:導入 express 模塊并新建變量。
B:創建 app 應用
C:設置訪問 Root 路由,并將響應設置為 “Hello world!”。
D:設置程序監聽的端口,并打贏服務啟動成功的信息。

再次提醒一下,沒有全部弄懂代碼不要緊,后面會有更詳細的講解。

你馬上就能學到關于 Express 的所有知識了。

小結

本文主要介紹了:

Node.js 可以編寫 Web 應用,但是開發過程并不高效。而 Express 則優雅的解決了這些問題。

Express 很小但是也非常靈活

Express 有幾個關鍵特性:

中間件將程序處理進行了拆分并且按照順序鏈式執行。

路由同樣對程序進行了拆分,按規則對不同的訪問請求做出不同的響應。

子工程可以實現對大型 Express 的拆分,從而提高可讀性方便后期維護。

Express 中的代碼大多請求處理函數的編寫,而 Express 為此提供了大量易用 API 。

原文地址

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84828.html

相關文章

  • AI開發書籍分享

    摘要:編程書籍的整理和收集最近一直在學習深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后也找了很多的書和文章,隨著不斷的學習,也整理了下自己的學習筆記準備分享出來給大家后續的文章和總結會繼續分享,先分享一部分的 編程書籍的整理和收集 最近一直在學習deep learning深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后...

    huayeluoliuhen 評論0 收藏0
  • 2017-08-24 前端日報

    摘要:前端日報精選和實現直接當前頁預覽手淘互動動效的探索白話原型和原型鏈源碼解析瀏覽器前端優化中文第期深入理解中的動畫演示,提高你的網頁開發技能知乎專欄實戰一概覽工作機制第部分迷津欲有問把賣了眾成翻譯代理程序實現復制集搭建及抓包 2017-08-24 前端日報 精選 iframe和HTML5 blob實現JS,CSS,HTML直接當前頁預覽手淘互動動效的探索白話原型和原型鏈React 源碼解...

    kel 評論0 收藏0

發表評論

0條評論

zhaochunqi

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<