Sử dụng CoffeeScript trong ứng dụng Rails và Node.js

CoffeeScript và Ruby on Rails

Ruby on Rails (Rails) là một framework web tuân thủ hai nguyên tắc cốt lõi: Convention over Configuration (Ưu tiên quy ước hơn cấu hình) và DRY (Don’t Repeat Yourself – Không lặp lại chính mình). Những nguyên tắc này giúp giảm thiểu mã样板 và tăng tốc độ phát triển.

Kể từ phiên bản 3.1, Rails tích hợp sẵn Asset Pipeline, hỗ trợ tiền xử lý các tài nguyên như JavaScript, CSS thông qua hệ thống preprocessor. Trong đó, CoffeeScript được hỗ trợ mặc định — mọi file có đuôi .js.coffee sẽ tự động được biên dịch sang JavaScript trước khi gửi đến trình duyệt.

Cấu trúc ứng dụng Rails với CoffeeScript

Khi tạo controller mới bằng lệnh:

rails generate controller Tasks

Rails sẽ tự động tạo file app/assets/javascripts/tasks.js.coffee. Nội dung trong file này sẽ được tự động nhúng vào layout nếu bạn sử dụng <%= javascript_include_tag "application" %> trong file app/views/layouts/application.html.erb.

Ví dụ: Xử lý AJAX với CoffeeScript trong Rails

Giả sử bạn có form tạo task với remote: true:

<%= form_with model: @task, remote: true do |f| %>
  <%= f.text_field :name %>
<% end %>

Controller xử lý:

def create
  @task = Task.create(task_params)
end

private

def task_params
  params.require(:task).permit(:name)
end

Tạo file view phản hồi dạng JavaScript: app/views/tasks/create.js.coffee

$('#task-list').append "<li>#{@task.name}</li>"
$('#task_name').val('')

Lưu ý: Rails tự động render file .js.coffee này làm phản hồi cho request AJAX.

CoffeeScript và Node.js

Node.js là nền tảng sự kiện không đồng bộ, rất phù hợp để xây dựng ứng dụng thời gian thực. CoffeeScript có thể chạy trực tiếp trên Node.js nhờ module coffee-script.

Cài đặt và chạy

Cài CoffeeScript toàn cục:

npm install -g coffee-script

Tạo file server.coffee:

http = require 'http'

server = http.createServer (req, res) ->
  res.writeHead 200, { 'Content-Type': 'text/plain' }
  res.end 'Hello from CoffeeScript!'

server.listen 3000
console.log 'Server running at http://localhost:3000/'

Chạy bằng lệnh:

coffee server.coffee

Kết hợp với Express và Socket.IO

Cài các gói cần thiết:

npm install express socket.io coffee-script connect-assets jade

Tạo file app.coffee:

express = require 'express'
http = require 'http'
socketIO = require 'socket.io'

app = express()
server = http.createServer(app)
io = socketIO(server)

app.set 'view engine', 'jade'
app.use express.static('public')

app.get '/', (req, res) -> res.render 'index'

# Xử lý WebSocket
io.on 'connection', (socket) ->
  console.log 'Client connected'

  socket.on 'addTask', (task) ->
    io.emit 'taskAdded', task

server.listen 3000

Phía client (assets/js/app.coffee):

socket = io()

$ ->
  $('#add-btn').on 'click', ->
    task = { name: $('#task-input').val() }
    socket.emit 'addTask', task

  socket.on 'taskAdded', (task) ->
    $('#task-list').append "<li>#{task.name}</li>"

Với connect-assets, bạn chỉ cần dùng helper != js('app') trong Jade để nhúng file đã được biên dịch.

Xử lý trạng thái cộng tác thời gian thực

Sử dụng khái niệm "room" trong Socket.IO để phân nhóm người dùng:

socket.on 'joinRoom', (roomName) ->
  socket.join(roomName)
  socket.room = roomName

socket.on 'newItem', (item) ->
  io.to(socket.room).emit 'itemAdded', item

Phía client đồng bộ dữ liệu khi tham gia phòng:

socket.on 'syncItems', (items) ->
  localStorage.clear()
  for item in items
    localStorage.setItem item.id, JSON.stringify(item)
  renderList()

Thẻ: CoffeeScript Rails Node.js Express Socket.IO

Đăng vào ngày 17 tháng 7 lúc 10:28