Meteor是什么
基于nodejs的實時web APP開發框架。
Meteor能帶來什么
簡單的說,你可以用js搞定客戶端、服務端的開發。另外,客戶端、服務端的界限被極大的模糊。客戶端的界面跟服務端的數據是雙向綁定的,修改服務端的數據,用戶界面會隨著更新;你也可以在客戶端直接修改服務端的數據庫。
系統的歸納下,對于(前端)開發者來說,可能比較吸引人的點。
- 統一開發語言:客戶端、服務端都可以用js搞定。
- 提高開發效率:開發者可以用10行左右的代碼就開發出一個具有多點實時更新的應用,因為底層框架已經幫你處理好了數據更新、數據同步以及界面更新的工作。
- 數據驅動下的多端同步更新機制:基于DDP協議,服務端數據的修改會引起客戶端界面的更新,同時客戶端對數據的改動也會同步到服務端。
- 統一插件系統:同樣的插件,可以同時運行在客戶端、服務端。
- 簡易熱部署:通過簡單的命令,即可快速部署到生產系統。同時對所有當前已鏈接的應用進行更新。
- 高實時性:通過巧妙的延遲補償策略,讓終端的用戶感覺是在訪問一個實時無延遲的應用。
- 原生應用:可通過編譯工具,將web app編譯成原生的終端應用程序
- 數據庫訪問:客戶端、服務端都可以直接訪問數據庫(安全性隱患)
getting started
demo請點擊,參照官方demo進行的仿寫,進一步進行了簡化。也可直接參考官方demo
meteor的入門demo還是比較好上手的。跟著ste by step的教程走,基本就可以搗鼓出一個像樣的TODO LIST的demo了,所以這里也不打算細講,只是挑一些重點備忘下。
首先,安裝meteor,然后通過meteor create
這個命令創建一個新項目。
meteor create meteor-todo-list
創建好的項目結構如下。
大致包含以下內容。有點像傳統的web頁面,1個HTML頁面,再加1個css文件、1個js文件。
. ├── .meteor // 項目依賴的package,在這個小demo里我們可以先忽略 ├── meteor-todo-list.css // 頁面相關的css ├── meteor-todo-list.html // 頁面入口文件 └── meteor-todo-list.js // 頁面主邏輯
meteor-todo-list.html
打開html頁面,你會發現只有head
、body
、template
三個標簽。如果接觸過模版引擎的同學會有中熟悉之感。其中:
head
、body
兩個標簽中的內容,最終會被嵌入到輸出給終端用戶的HTML頁面中。template
則定義了頁面需要用到的模版,有點向web component規范看齊的意味。
舉例來說,head標簽中內容如下
<head> <title>程序猿小卡的meteor demo</title> </head
我們訪問頁面就可以看到title為程序猿小卡
至于body
標簽,如果對handlebars
熟悉的同學,大致就知道是干嘛用的了。{{>create}}
引入定義好的模版,該模版的name
為create
。{{#each tasks}}
則是對數據進行遍歷,至于數據源,下面會提到。
<body> {{>create}} <div class="todo-items"> {{#each tasks}} {{>task}} {{/each}} </div> </body>
我們再來看看這段模版。name
為create
,就可以在頁面里方便的通過create
這個名字來引用這段模版(包括模版嵌套)。而模版數據會在 meteor-todo-list.js 小節提到。
<template name="create"> <div class=""> <input type="text" placehodler="輸入todo項" class="js-text" /> <button class="js-add">創建</button> </div> </template>
meteor-todo-list.js
打開meteor-todo-list.js
,會看到一行顯眼的代碼。正如meteor官方介紹所說,meteor應用的代碼可以同時跑在客戶端、服務端。有些場景下,某些代碼只適合跑在客戶端,那么,就可以用下面的判斷。
if( Meteor.isClient ){
//...
}
meteor-todo-list.html
里其實就一堆模版。相應的,需要為這些模版提供數據。數據大都是存在數據庫的,那么就需要有數據庫操作。
除了數據之外,還要處理用戶交互,那么就涉及到事件綁定。
1、數據 & 數據庫操作
數據在meteor應用了扮演了極為重要的角色,作為實時雙向更新的引用,meteor服務端數據的修改,會導致客戶端界面的更新。同時,客戶端用戶操作導致的數據更新,也會實時同步到服務端。
比如這段代碼,意思就是,模版body
用到的tasks
數據,就是這個同名方法的返回值。
Template.body.helpers({ tasks: function(){ return Tasks.find({}); } });
比如頁面有這么一段無聊的模版,那么就可以通過Template.nonsense.helpers
來注冊nonsense
這段模版需要用到的數據。我們的頁面里其實沒有name
為body
的模版,這是因為內部做了特殊處理,body
、head
標簽默認當模板對待了。
<template name="nonsense"> <p>hello {{nick}}</p> </template>
下面來講數據庫操作,這里用到了人民大眾熱愛已久的mongodb
。
首先,我們我們創建collections
,對應的是一系列的文檔集合,下面我們做的就是對這個文檔集合進行操作,比如增、刪、改、查,這四大操作demo里都覆蓋到了。
var Tasks = new Mongo.Collection("tasks");
舉個例子,返回所有的task
數據,類似mysql里的select *
。
return Tasks.find({});
插入一條task
。
2、事件綁定
相當直觀。以下面代碼為例。更多細節參考官方文檔
Template.create.events
表示為create
這個模版渲染出來的節點綁定事件。click .js-add
表示:為.js-add
這個選擇器匹配中的節點監聽click
事件。event
就是常規的事件對象。而template
相當于模版自身的引用,可以通過template.$(selector)
來選中模版內部的子節點。(類似backbone內部節點操作的設計)
Template.create.events({ 'click .js-add': function(event, template){ var ('.js-text'), value = $input.val(); Tasks.insert({text: value, createdAt: new Date()}); $input.val(''); } });
meteor-todo-list.css
沒什么好講的,跳過。。。
DDP協議
DDP是 分布式數據協議 (Distributed Data Protocol)的簡稱,meteor雙向實時更新機制的底層依賴的就是這東東。官方協議
粗略瞄了下協議,大致有兩個特點:
- 平臺無關的通用協議:DDP只是定義了協議的格式和一些規范,但具體用什么語言在什么平臺上實現無所謂,你可以用js寫,也可以用java寫。
- json格式:從協議說明,以及實際抓包來看,服務端、客戶端數據通信采用的都是json格式的數據,前端極為友好~
實際看看例子。在chrome控制臺下,切到WebSocket
這個tab,就會看到不斷的有收發包。部分是用戶操作發出(如刪除操作),部分是用于保持通信狀態的心跳包。(可以這樣翻譯吧。。)
協議比較長,內容本身倒是不復雜,有興趣的自行圍觀。。。
編譯原生應用
同樣沒什么好講的,直接貼上官方文檔地址 https://www.meteor.com/try/7 ,有空再貼幾章截圖。。
文章列表