สำหรับบางครั้งที่เราอยากทดลองสร้างเว็บและหัดใช้ CSS framework ทดลองเขียน Stimulus Controller ใหม่ๆ หรือจะอะไรก็แล้วแต่อย่างง่ายๆ โดยไม่ต้องต่อกับฐานข้อมูล การใช้ Rails ก็ดูเหมือนจะ Overweight เกินไป ครั้งนี้ก็เลยจะทดลองใช้ Sinatra ดูว่ามันตอบโจทย์ของเราหรือไม่ โดยสิ่งที่จะใช้ในบทความนี้จะประกอบด้วย
- Sinatra ในการทำเว็บ
- Stimulus ซึ่งเป็นเฟรมเวิร์คของ JavaScript ที่เรียบง่าย เพื่อเพิ่มลูกเล่นให้กับเว็บของเรา
- Rollup + Babel สำหรับ compile และ bundle ไฟล์ JavaScript ต่างๆ
ติดตั้งทุกอย่างให้พร้อม
- Sinatra
gem install sinatra
- Stimulus
yarn add --dev stimulus
- Rollup
yarn add --dev rollup @rollup/plugin-babel @rollup/plugin-node-resolve rollup-plugin-terser @babel/core @babel/preset-env @babel/plugin-proposal-class-properties
กำหนดค่าให้กับ Sinatra
- สร้างโฟลเดอร์ public ในการเก็บไฟล์ static
- สร้างโฟลเดอร์ views ในการเก็บ layout และหน้าเว็บอื่นๆ
กำหนดค่าให้กับ Stimulus
- สร้างโฟลเดอร์ src
- สร้างโฟลเดอร์ controllers ไว้ภายใน src เพื่อเก็บ stimulus controller
กำหนดค่าให้กับ Rollup
- สร้าง rollup.config.js และกำหนดค่าต่างๆ ในการ compile และ bundle ไฟล์
// rollup.config.js
import babel from '@rollup/plugin-babel'
import { nodeResolve } from '@rollup/plugin-node-resolve'
import { terser } from "rollup-plugin-terser"
export default {
context: 'window',
input: 'src/app.js',
output: {
file: 'public/js/app.js',
format: 'cjs'
},
plugins: [
babel({ babelHelpers: 'bundled' }),
nodeResolve(),
terser()
]
}- สร้าง babel.config.json
// babel.config.json
{
"presets": ["@babel/preset-env"]
}- เขียนคำสั่งสำหรับการคอมไพล์ไว้ใน package.json
// package.json
"scripts": {
"build": "rollup -c rollup.config.js"
}ลงมือเขียนโค้ด
- สร้างหน้าเว็บ index.erb
<div data-controller="hello"> <input data-hello-target="name" type="text"> <button data-action="click->hello#greet">Greet</button> <span data-hello-target="output"></span> </div>
- สร้าง hello_controller.js
import { Controller } from "stimulus"
export default class extends Controller {
static targets = [ "name", "output" ]
greet() {
this.outputTarget.textContent = `Hello, ${this.nameTarget.value}!`
}
}- สร้าง app.js เพื่อใช้สำหรับการลงทะเบียน controller ที่จะใช้งานเข้าสู่โปรแกรม
import { Application } from "stimulus"
import HelloController from "./controllers/hello_controller"
const application = Application.start()
application.register("hello", HelloController)คอมไพล์และรวมไฟล์ JavaScript
รันคำสั่งสำหรับคอมไพล์และรวมไฟล์ JavaScript
$ npm run build
หรือ
rollup -c rollup.config.js