網路上介紹Sinatra與比較兩者之間的文章並不少見,但作為系列文這部分的基礎介紹不能省。
說來慚愧,我寫了rails將近兩年,還是為了這次鐵人賽蒐集資料才發現Sinatra,可說是發現的非常之晚。大部份網路上的中文資料都出產在2012年左右,如果你跟我一樣之前沒聽過Sinatra,現在讓你看看:
所有第一次接觸的人,想必都會對這點印象深刻(事實上還可以更短)。
首先在環境內安裝Sinatra這個gem
$ gem install sinatra
接著建立一個檔案,假設你用vim
$ vim hello.rb
然後貼上下面的程式碼,儲存退出:wq
require 'sinatra'
get '/' do
"Hello Sinatra"
end
接著在command line執行這個檔案
$ ruby hello.rb
== Sinatra (v2.0.0) has taken the stage on 4567 for development with backup from Puma
Puma starting in single mode...
* Version 3.10.0 (ruby 2.3.1-p112), codename: Russell's Teapot
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://localhost:4567
沒錯!見證奇蹟的時刻,當你用瀏覽器訪問 http://localhost:4567 時,就會發現一個簡易的伺服器已經跑起來了。
扣除掉命令不算,檔案本身是不是剛好四行呢?
事實上如果我們利用ruby block的特性,還可以改寫如下:
require 'sinatra'
get '/' do "Hello Sinatra" end
這樣的話只有兩行!(好啦其實差別不大)
雖然伺服器是跑起來了,但光是這樣沒辦法滿足任何需求
所以接下來介紹一些實務常用的搭配
ruby專案無可避免地會用到其他gem,為了讓gem更好管理
所以bundler是不可或缺的
首先在環境中安裝bundler
$ gem install bundler
接著在目錄內新增一個檔案命名為Gemfile
# Gemfile
source "http://rubygems.org"
gem 'haml' # Haml模版
gem 'rdiscount' # Markdown
gem 'sinatra' # Sinatra
gem 'thin' # 比較推薦的伺服器
gem 'shotgun' # 重啟伺服器
group :test do
gem 'rspec' # 測試
gem 'nokogiri' # 解析HTML輸出
end
完成後執行bundle install
,就會將所有Gem一次安裝
看到這邊,熟悉Rails的朋友應該會覺得相當眼熟
因為bundler是rails內建的gem,而且還會預先產生Gemfile
光是從這一點上,就可以觀察出Rails與Sinatra設計理念上的差異:
如果七成的專案都有這個需求,那我假設你也會有這個需求(設計對白)
彷彿可以聽到Rails設計團隊這樣宣示,但根據rails的設計理念「慣例重於設定」
其實是可以推導出這樣的精神
不僅是如此,當最佳實踐出現的同時,也會被收錄在新版的Rails當中
也就是跟著rails的更新走,就是跟著技術趨勢
這對開發者而言,自然是省去了大量的時間,也指引了方向
但是假如你對預設的內容不滿意,當然也有很大的自由度去調整
比方說幾乎沒有人用的內建test測試,大家都習慣性地使用rspec
或許在未來的某個版本,會將rspec改為預設
這就是rails的風格
只有開發者自己最懂得專案的需要(設計對白)
Sinatra只提供將伺服器跑起來的最低標準
除此之外,都讓開發者可以自由選擇,好處是擁有極高的自由度
壞處就是需要設定安裝所有需要的元件
而且需要做好功課,選擇什麼才好(相較於rails預先幫你選擇)
如果你對專案的需求掌握度很高,相當確定只會用到少數的功能
那或許Sinatra是可以考慮的選擇
但為了達成現代網站架構的標準而安裝一個又一個Gem以後
我懷疑這樣的專案與Rails其實相去不遠
說到底框架沒有絕對的好壞,只有合適的使用情境與開發風格
了解不同的工具,是為了在情境來臨時有選項可供選擇
參考連結:
http://www.infoq.com/cn/articles/sinatra-intro
https://ithelp.ithome.com.tw/articles/10102707
我每天都在用 sinatra,
一定要推的。
最近也才發現有另個更簡潔的輕量framework:
http://hanamirb.org/
不妨也可快快研究分享一下。
喔喔喔,又有新玩具了。或許可以在之後收錄XD
這讓我想到python的flask。
不過還是沒這麼簡潔就是了。