iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 2
1

網路上介紹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

這樣的話只有兩行!(好啦其實差別不大)

雖然伺服器是跑起來了,但光是這樣沒辦法滿足任何需求
所以接下來介紹一些實務常用的搭配

Bundler

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當中
也就是跟著rails的更新走,就是跟著技術趨勢
這對開發者而言,自然是省去了大量的時間,也指引了方向

但是假如你對預設的內容不滿意,當然也有很大的自由度去調整
比方說幾乎沒有人用的內建test測試,大家都習慣性地使用rspec
或許在未來的某個版本,會將rspec改為預設
這就是rails的風格

Sinatra 極簡風格的自助餐

只有開發者自己最懂得專案的需要(設計對白)

Sinatra只提供將伺服器跑起來的最低標準
除此之外,都讓開發者可以自由選擇,好處是擁有極高的自由度
壞處就是需要設定安裝所有需要的元件
而且需要做好功課,選擇什麼才好(相較於rails預先幫你選擇)

如果你對專案的需求掌握度很高,相當確定只會用到少數的功能
那或許Sinatra是可以考慮的選擇
但為了達成現代網站架構的標準而安裝一個又一個Gem以後
我懷疑這樣的專案與Rails其實相去不遠

說到底框架沒有絕對的好壞,只有合適的使用情境與開發風格
了解不同的工具,是為了在情境來臨時有選項可供選擇

參考連結:
http://www.infoq.com/cn/articles/sinatra-intro
https://ithelp.ithome.com.tw/articles/10102707


上一篇
動態網站框架:Rails、Django、Laravel、Phoenix、Sinatra
下一篇
Laravel與Rails比較
系列文
新時代的網頁框架比較-- 淺談Rails、Django、Phoenix、Laravel31

1 則留言

1
逮丸逮丸
iT邦大師 1 級 ‧ 2017-12-05 17:46:39

我每天都在用 sinatra,
一定要推的。
最近也才發現有另個更簡潔的輕量framework:
http://hanamirb.org/
不妨也可快快研究分享一下。

bater iT邦新手 5 級‧ 2017-12-05 19:58:22 檢舉

喔喔喔,又有新玩具了。或許可以在之後收錄XD

froce iT邦高手 1 級‧ 2017-12-06 10:17:12 檢舉

這讓我想到python的flask。
不過還是沒這麼簡潔就是了。

我要留言

立即登入留言