十個(gè)最適合 Web 和 APP 開發(fā)的 NodeJS 框架

英文原文:NodeJS Frameworks: The 10 Best for Web and Apps Development
譯者:HAILINCAI, wancheng, omegat, CleverKing, 社會(huì)主義好, david203812, 無若
原文地址:
http://www.oschina.net/translate/best-nodejs-frameworks-for-web-and-app-development

在瀏覽器以外運(yùn)行 JavaScript 對(duì)于 JavaScript 愛好者來說非常神奇,同時(shí)也肯定是 web 應(yīng)用程序開發(fā)界最受歡迎的進(jìn)步之一洗做。全球各地的開發(fā)者張開雙臂擁抱 NodeJS锭碳。

對(duì)于新手來說蔗坯,Node.js 是 JavaScript 運(yùn)行時(shí)憨奸,允許你在瀏覽器之外服務(wù)器上運(yùn)行 JavaScript 代碼臣疑。它是基于谷歌 Chrome 的 V8 虛擬機(jī)引擎建立的嫩码,V8 虛擬機(jī)引擎用于在 Chrome 瀏覽器中支持 JavaScript蜻牢。

NodeJS 逐漸普及的步伐是因?yàn)樗梢宰屇阒皇褂?JavaScript 就可以建立大規(guī)模向拆、實(shí)時(shí)性亚茬、可擴(kuò)展的移動(dòng)和 Web 應(yīng)用程序。

隨著節(jié)點(diǎn)生態(tài)系統(tǒng)的增長(zhǎng)浓恳,框架也開始著手加快工作流程刹缝。有許多的 Node.js 框架,允許你構(gòu)建實(shí)時(shí)的端到端網(wǎng)絡(luò)應(yīng)用颈将,而無需任何其他第三方 Web 服務(wù)器梢夯、應(yīng)用服務(wù)器、工具和技術(shù)晴圾。

通用性的 Node 框架就像快遞颂砸,Koa 和 Hapi 更加靈活,讓你做你想要的一切,最大限度的滿足開發(fā)需求人乓。但是勤篮,在最初你需要投入更多的努力,更加依靠開發(fā)者作出正確的決策色罚。

而另一方面碰缔,像 Mean.io,Meteor, Derby 和 Mojito戳护,有自己的標(biāo)準(zhǔn)結(jié)構(gòu)和技術(shù)體系金抡,靈活性較差。然而這些框架不會(huì)給開發(fā)者太多做錯(cuò)誤決策的空間腌且。

讓我們來看看目前可用的最好梗肝、最強(qiáng)大的 NodeJS 框架,并幫助你建立實(shí)時(shí)的切蟋、各種規(guī)模和復(fù)雜性的可擴(kuò)展 Web 應(yīng)用程序统捶。

  1. Node.js Express
    --

對(duì)于一個(gè)已經(jīng)在使用 node.js 的開發(fā)人員來說,Express 或者"node.js express"并不是一個(gè)新鮮事柄粹。Express 框架提供了對(duì) node.js 原生 API 的比較好的封裝喘鸟,從而使開發(fā)者更加容易地使用node.js。

Express 框架提供了用來開發(fā)強(qiáng)壯的 web/移動(dòng)應(yīng)用驻右,以及 API 的所有功能什黑。并且開發(fā)人員還能夠方便地為它開發(fā)插件和擴(kuò)展,從而增加 Express 的能力堪夭。下面列出了一些 Express 提供的基本的功能:

  • 可以和任何的第三方數(shù)據(jù)庫進(jìn)行通訊愕把;
  • 可以使用任何的用戶認(rèn)證方式;
  • 可以使用任何符合 Express 接口定義的模板引擎森爽;
  • 可以按照需要定義工程目錄恨豁。

通過使用 Node Express,你可以使用更少的代碼來實(shí)現(xiàn)功能爬迟。至少通過使用 Node Express橘蜜,你可以實(shí)現(xiàn)中間件來響應(yīng) http 請(qǐng)求,可以定義路由表來定義對(duì)不同請(qǐng)求的響應(yīng)函數(shù)付呕,還可以使用模板引擎來輸出 html 頁面计福。

對(duì)于一個(gè) NodeJS 開發(fā)新手來說,Express 還提供了如下的好處:

  1. Express的學(xué)習(xí)曲線并不陡峭徽职,可以很快上手象颖;
  2. Express 有非常龐大的社區(qū),和組織良好的文檔姆钉,新手可以很容易得到所需要的一切说订。

Express 根據(jù) MIT 協(xié)議進(jìn)行開源抄瓦,目前 StrongLoop 對(duì)它提供支持。你也可以通過 Express 的官方網(wǎng)站 expressjs.com 獲得更多的信息克蚂。

  1. Sails.js (node.js mvc)
    --

Sails 作為一個(gè)非常穩(wěn)固的 nodejs 框架闺鲸,提供了建立任何規(guī)模的 web 應(yīng)用所需要的所有功能功能。

Sails.js 在底層使用了 express框架來提供對(duì) http 請(qǐng)求的處理埃叭,同時(shí)使用 Socket.IO 框架來處理WebSocket 請(qǐng)求摸恍。同時(shí)作為一個(gè)前端應(yīng)用開發(fā)框架,它允許開發(fā)人員選擇他/她熟悉的技術(shù)來開發(fā)應(yīng)用赤屋。

同時(shí) Sails.js 也通過 waterline 框架實(shí)現(xiàn)了 ORM 功能立镶。通過這個(gè)功能,你的應(yīng)用程序可以在不進(jìn)行大的修改的前提下类早,就可以從一個(gè)后端數(shù)據(jù)庫媚媒,切換到另外一個(gè)后端數(shù)據(jù)庫(也可以是一個(gè)NoSQL數(shù)據(jù)庫)。

Sails 特別適合用來開發(fā)對(duì)數(shù)據(jù)的實(shí)時(shí)更新有較高要求的應(yīng)用涩僻,比如多人棋類游戲缭召,單頁web應(yīng)用等等。如果你對(duì) Ruby, Django 或者 Zend 有一定的了解逆日,那么你將非常容易理解Sail中的概念嵌巷。

簡(jiǎn)單來說,Sails.js 既給開發(fā)者提供了一個(gè)優(yōu)秀的 MVC 框架室抽,也提供了一定的靈活性搪哪,讓開發(fā)者可以自主選擇前端開發(fā)方式和后端的數(shù)據(jù)庫。 Sails.js 是由 Mike McNeil 創(chuàng)建的坪圾,現(xiàn)在由 Treeline and balderdash 提供支持晓折。Sails.js 在 MIT 協(xié)議下開源。

你可以在網(wǎng)站 sailsjs.org 上找到更多關(guān)于這個(gè)框架的內(nèi)容兽泄。

  1. KOA
    --

KOA 是 node.js mvc 框架的后起之秀漓概,在2013第四個(gè)季度才發(fā)布了第一個(gè)版本。開發(fā) KOA 的人員基本來自 Express 開發(fā)團(tuán)隊(duì)病梢,TJ Holowaychuk 是 KOA 開發(fā)團(tuán)隊(duì)的領(lǐng)導(dǎo)者。雖然 KOA 大部分開發(fā)人員來自 Express飘千,但是他們使用了完全不同的技術(shù)來開發(fā) KOA,并且 KOA 正成為 Express 一個(gè)強(qiáng)有力的競(jìng)爭(zhēng)對(duì)手栈雳。

KOA 框架的核心是 ES6 的 generator护奈。KOA 使用 generator 來實(shí)現(xiàn)中間件的流程控制,使用try/catch 來增強(qiáng)異常處理哥纫,同時(shí)在 KOA 框架中你再也看不到復(fù)雜的 callback 回調(diào)了霉旗。

KOA 框架本身非常小,只打包了一些必要的功能,但是它本身通過良好的模塊化組織厌秒,讓開發(fā)人員可以按照自己的想法來實(shí)現(xiàn)一個(gè)擴(kuò)展性非常好的應(yīng)用读拆。

許多 JavaScript/Node.js 的忠實(shí)開發(fā)者都開始選擇使用 KOA 來開發(fā)新的項(xiàng)目,因?yàn)?KOA 提供了更多的靈活性開發(fā)應(yīng)用程序鸵闪。

你可以通過koajs.com獲取更多的信息檐晕。

  1. Meteor
    --

Meteor 框架是 Node.js 上最出色的全棧框架蚌讼。項(xiàng)目在 GitHub 上有 28K+ 的贊辟灰,擁有大量的自定義包,龐大的社區(qū)支持篡石,非常好的教程和文檔芥喇。在這個(gè)領(lǐng)域 Meteor 毫無疑問是王者,你可以用它構(gòu)建純 Javascript 的實(shí)時(shí) Web 和 手機(jī)應(yīng)用凰萨。

Meteor 最優(yōu)秀的部分是继控,無論是服務(wù)器端的數(shù)據(jù)庫訪問,商業(yè)邏輯實(shí)現(xiàn)胖眷,還是客戶端的展示武通,所有的流程都是無縫連接,開箱即用瘦材。整個(gè)框架使用統(tǒng)一的 API厅须,Meteor API 同時(shí)適用于客戶端和服務(wù)器端。

它使用的 DDP 協(xié)議可以讓你在后端連接簡(jiǎn)單的數(shù)據(jù)庫服務(wù)食棕、企業(yè)數(shù)據(jù)倉庫朗和、甚至 IOT 傳感器。Meteor 帶有自己默認(rèn)的棧簿晓,但又有足夠的靈活性眶拉,可以讓你選擇自己的技術(shù)方案。如果你不需要嘗試其他的框架或者沒有其他的條件限制憔儿,你可以直接使用默認(rèn)配置忆植,進(jìn)行快速地應(yīng)用開發(fā)。

Meteor 擁有專業(yè)化的開發(fā)團(tuán)隊(duì)谒臼,頂級(jí)風(fēng)投的大量資金支持朝刊,這都讓 Meteor 能夠時(shí)刻保持業(yè)界領(lǐng)先。

你可以通過 meteor.com 網(wǎng)站進(jìn)一步了解 Meteor蜈缤。

  1. Derby.js
    --

Derby.JS 跟它的直接競(jìng)爭(zhēng)對(duì)手 Meteor拾氓、Mean.io、以及 Mojito 一樣底哥,也是一個(gè)全椓埃框架房官。它運(yùn)行在 Nodejs + mongo + Redis 的上層。Derby 主要部分是一個(gè)叫做 Racer 的數(shù)據(jù)同步引擎续滋,它能夠讓數(shù)據(jù)在數(shù)據(jù)庫翰守、服務(wù)器和瀏覽器之間的同步變得輕而易舉。

Racer 的確能夠讓基于 Derby 框架的應(yīng)用運(yùn)行地更快疲酌,無論是在瀏覽器端還是服務(wù)器端蜡峰,對(duì)于單頁面應(yīng)用來說,它都是一個(gè)完美的選擇方案徐勃。Derby 經(jīng)常被用來和業(yè)界老大 Meteor 進(jìn)行比較事示,Meteor 項(xiàng)目已經(jīng)開發(fā)了一段很長(zhǎng)時(shí)間,因而能夠提供更多的開箱即用的功能僻肖,使得在更短時(shí)間內(nèi)開發(fā)復(fù)雜的 web 應(yīng)用變得更加容易肖爵。

而 Derby 更適合于需要更快運(yùn)行速度的應(yīng)用,并且它的模塊化方式能夠讓應(yīng)用更靈活臀脏,更容易擴(kuò)展劝堪。Derby 最近的發(fā)展有些緩慢,但它并沒有出局揉稚,仍有改寫 Nodejs 全椕肜玻框架游戲規(guī)則的潛力。

你可以通過 derbyjs.com網(wǎng)站進(jìn)一步了解 Derby搀玖。

  1. Flatiron.js (Node.js MVC 框架)
    --

Flatiron 框架背后的核心思想是讓你能使用它所提供的組件以及一些第三方庫構(gòu)建你自己的全椨嗑常框架。很酷不是嗎灌诅?我個(gè)人十分的喜歡這種方式芳来。然而,這帶來的是更高的復(fù)雜度猜拾,并有可能會(huì)被使用錯(cuò)誤組件的開發(fā)者搞得一團(tuán)糟即舌。

你能稱之為一個(gè)由多個(gè)相互獨(dú)立的組件松散地組建起來的全棧 MVC 框架。Flatiron 框架支持Director挎袜,一個(gè)從頭到腳都使用JavaScript 搭建起來的顽聂,并不需要任何依賴項(xiàng)的 URL 路由組件。

通過一個(gè)叫 Plates 的模板引擎盯仪,F(xiàn)latiron 能夠支持模版語言紊搪,然而數(shù)據(jù)管理是通過 json 實(shí)現(xiàn)的,并能與任何一種數(shù)據(jù)庫一起使用全景。Flatiron 現(xiàn)在由 Nodejitsu 以及其他的社區(qū)成員在進(jìn)行維護(hù)耀石,并做的相當(dāng)不錯(cuò),是一個(gè)不那么流行卻值得一看的框架蚪燕。

你能在 flatironjs.org 上獲得更多信息娶牌。

  1. Hapi
    --

Hapi 是為數(shù)不多的不依賴于 Express 的 node.js 框架,現(xiàn)在甚至已經(jīng)完全獨(dú)立于 Express 了馆纳。在最近一段時(shí)間中诗良,很多開發(fā)者選擇了 Hapi 而非 Express,這使得它或多或少變?yōu)榱?Express 的競(jìng)爭(zhēng)對(duì)手鲁驶。

Hapi 在眾多 nodejs 的框架中并非一個(gè)老牌選手鉴裹,然而它卻成功的在這當(dāng)中創(chuàng)造了自己的一個(gè)生態(tài)圈。Hapi 致力于完全的分離 node HTTP 服務(wù)器钥弯、路由以及業(yè)務(wù)邏輯径荔,并更多的聚焦于如何盡可能的通過配置而非代碼來控制東西。

Hapi 最初是由 Eran Hammer 以及在 Walmart labs 的團(tuán)隊(duì)為了工作需要開發(fā)的脆霎。其后便以極快的速度受到了歡迎总处,現(xiàn)在已在 MIT 許可下成為一個(gè)開源的框架,能夠免費(fèi)的被下載和使用睛蛛。

迪士尼鹦马、雅虎、Pebble忆肾、beats 音樂以及 Walmart 這樣的公司都在使用 HAPI 作為他們旗下一個(gè)或多個(gè)項(xiàng)目的網(wǎng)絡(luò)應(yīng)用框架荸频,它的影響力便可見一斑了。

你能在 hapijs.com上找到更多關(guān)于 Hapi 的信息客冈。

  1. Mean.IO
    --

Mean 是 Mongo DB旭从,Express,Angular 和 Node.js 捆綁在一起的組合场仲『驮茫基本上說只要有它,你就擁有了數(shù)據(jù)庫層燎窘,服務(wù)器端和網(wǎng)頁前端的整套工具摹闽,足以開發(fā)所有類型的現(xiàn)代網(wǎng)絡(luò)應(yīng)用。

Mean 是一個(gè)完整獨(dú)立的包褐健,它涵蓋了應(yīng)用開發(fā)的所有方面付鹿。尤其適合于那些需要快速開始開發(fā)的人。它內(nèi)置多種技術(shù)而且在聯(lián)合使用時(shí)變現(xiàn)非常好蚜迅《尕遥可以用于創(chuàng)建任意大小和復(fù)雜度的應(yīng)用。

使用 Mean谁不,開發(fā)者可以避免經(jīng)歷混合和匹配不同的技術(shù)棧坐梯。通過 mean 棧,你可以減少安裝和配置MongoDB刹帕,Express吵血,Angular 和 Node.js需要的時(shí)間谎替。Mean.io 的另一個(gè)巨大好處就是所有的棧都使用 JavaScript,服務(wù)器端 Express 對(duì)MongoDB 的訪問(json)和通多 Angular 從 Node 到客戶端蹋辅。

在這里 - mean.io了解更多Mean.io的相關(guān)信息钱贯。

還有一個(gè)名為 mean.js 的 mean 分支也相當(dāng)流行。

  1. Mojito
    --

Mojito 由 Yahoo 開發(fā)并迅速取得成功侦另。然而很快又帶著關(guān)于框架的空前的成功坐到了冷板凳秩命,就像Meteor 和 Mean stack 那樣。

Mojito 同樣是一個(gè) MVC 應(yīng)用框架褒傅,非常適合于創(chuàng)建使用 HTML5弃锐,JavaScript 和 CSS3 的高性能的網(wǎng)絡(luò)和手機(jī)應(yīng)用。Mojito 的根本目標(biāo)是提供一個(gè)框架殿托,該框架用于構(gòu)建標(biāo)準(zhǔn)的基于跨平臺(tái)的應(yīng)用霹菊。使之可以同時(shí)運(yùn)行在客戶端和服務(wù)器端,并實(shí)現(xiàn)高性能碌尔。

你可以在 Yahoo 開發(fā)者網(wǎng)頁—— mojito 獲得更多信息浇辜。

  1. Socket Stream
    --

SocketStream 是一個(gè)有趣的框架,專注于客戶端和服務(wù)端數(shù)據(jù)的快速同步唾戚,它致力于前后端數(shù)據(jù)的實(shí)時(shí)更新柳洋。

它最大的特點(diǎn)是不嚴(yán)格要求你使用指定的客戶端技術(shù),也不限定數(shù)據(jù)庫的 ORM叹坦。我趨向于將它和有同樣功能的兄弟項(xiàng)目 Sail.js 做比較熊镣,它更適合做單頁 web 應(yīng)用,多用戶游戲募书,聊天客戶端绪囱,網(wǎng)絡(luò)應(yīng)用,交易平臺(tái)以及所有的需要將數(shù)據(jù)從服務(wù)端實(shí)時(shí)推送到客戶端的應(yīng)用莹捡。

服務(wù)端和客戶端使用 JSON 來傳輸數(shù)據(jù)鬼吵,比較理想的是使用 websockets 在服務(wù)端事件發(fā)生時(shí)自動(dòng)將數(shù)據(jù)推送到客戶端,Socket stream 是由 Owen Barnes 創(chuàng)建篮赢,現(xiàn)在由 Paul Jensen 和團(tuán)隊(duì)維護(hù)齿椅,他們的工作讓這個(gè)框架得到了應(yīng)有的榮耀。

SocketStream framework 在最近幾月獲得了很好的發(fā)展启泣,未來一片光明涣脚。

更多 SocketStream 信息請(qǐng)瀏覽 github 上的 - socketstream

其它類似優(yōu)秀框架還有:total.js, Geddy.JS, Locomotive, compoundRestify寥茫。

結(jié)論

Web 和應(yīng)用開發(fā)的風(fēng)景變化是非城彩矗快速的,開發(fā)人員轉(zhuǎn)向快速框架和清潔項(xiàng)目交付(clean project delivery)。使用 node 框架的最大優(yōu)勢(shì)是提供了高層級(jí)結(jié)構(gòu)的盒子芭梯,你可以關(guān)注擴(kuò)展您的應(yīng)用程序而不是努力在建設(shè)上支出险耀。

框架提供了多樣的特性,工作在不同的底層玖喘,試圖解決構(gòu)建實(shí)時(shí)的常見問題胰耗,并解決了可伸縮的和復(fù)雜的 Web 應(yīng)用程序在速度上的問題。在這篇文章里討論的框架是當(dāng)今市場(chǎng)上最好的 node.js 框架芒涡。

請(qǐng)留下評(píng)論讓我們知道你對(duì) node 框架的使用體會(huì)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卖漫,一起剝皮案震驚了整個(gè)濱河市费尽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羊始,老刑警劉巖旱幼,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異突委,居然都是意外死亡柏卤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門匀油,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缘缚,“玉大人,你說我怎么就攤上這事敌蚜∏疟酰” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵弛车,是天一觀的道長(zhǎng)齐媒。 經(jīng)常有香客問我,道長(zhǎng)纷跛,這世上最難降的妖魔是什么喻括? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮贫奠,結(jié)果婚禮上唬血,老公的妹妹穿的比我還像新娘。我一直安慰自己叮阅,他們只是感情好刁品,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浩姥,像睡著了一般挑随。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上勒叠,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天兜挨,我揣著相機(jī)與錄音膏孟,去河邊找鬼。 笑死拌汇,一個(gè)胖子當(dāng)著我的面吹牛柒桑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播噪舀,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼魁淳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了与倡?” 一聲冷哼從身側(cè)響起界逛,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纺座,沒想到半個(gè)月后息拜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡净响,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年少欺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馋贤。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赞别,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出配乓,到底是詐尸還是另有隱情氯庆,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布扰付,位于F島的核電站堤撵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏羽莺。R本人自食惡果不足惜实昨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盐固。 院中可真熱鬧荒给,春花似錦、人聲如沸刁卜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛔趴。三九已至挑辆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鱼蝉。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工洒嗤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人魁亦。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓渔隶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親洁奈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子间唉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容