こんにちは、ウェブ開発者の皆さん! 今日は、たった1つや2つではなく、9種類ものウェブフレームワークを一挙にご紹介します!🤯
まず最初に... なぜこんなことをしたかと言いますと、数々の国で暮らし、ソフトウェア開発界に革命を起こす野望を持つ MarsX - ローコードプラットフォーム の創設者兼CEO(6歳からです 🤯)である私にとっては日常業務だからです!
そういうわけで、これら各言語でシンプルなToDoリストアプリを作成しました。それぞれの経験を詳しくお伝えするために記事化してみました。
それでは早速登場人物たちを見ていきましょう:
- Next.js
- Ruby on Rails
- Python
- Django
- PHP
- Laravel
- Java Spring
- C# .NET
- Go Gin
- Swift Vapor
- Kotlin Ktor
- MarsX (bonus)
それぞれの言語・フレームワーク組み合わせでは 構築時間⏱️ ,ルーティング🚦 ,データベース連携💾 ,そして全体的なアーキテクチャ を取り上げます。 もちろん、コードも見せますよ...私のスパゲッティコードです :D
1) Next.js Code
import { useState } from 'react'
export default function TodoList() {
const [todos, setTodos] = useState([])
const [inputValue, setInputValue] = useState('')
const addTodo = () => {
if (inputValue) {
setTodos([...todos, inputValue])
setInputValue('')
}
}
return (
<div>
<h1>Todo List</h1>
<ul>
{todos.map((todo) => (
<li key={todo}>{todo}</li>
))}
</ul>
<form onSubmit={(e) => e.preventDefault()}>
<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<button onClick={() => addTodo()}>Add</button>
</form>
</div>
)
}
Next.jsはReactを簡単なセットアップで活用し、最初から素晴らしい開発体験が実現します!
セットアップ: 簡単!🍋 ルーティング: 内蔵された動的ルーティング。 データベース連携: Node.js に対応したデータベースであれば何でも使えます。
2) Ruby on Rails Code
# todo.rb
class Todo < ApplicationRecord
validates :title, presence: true
end
# todos_controller.rb
class TodosController < ApplicationController
before_action :set_todo, only: [:show, :edit, :update, :destroy]
def index
@todos = Todo.all.order(created_at: :desc)
end
def create
@todo = Todo.new(todo_params)
if @todo.save
redirect_to todos_path, notice: 'Todo was successfully created.'
else
render 'new'
end
end
private
def set_todo
@todo = Todo.find(params[:id])
end
def todo_params
params.require(:todo).permit(:title) # add additional parameters as needed.
end
end
# index.html.erb
<h1>Todos</h1>
<ul>
<% @todos.each do |t| %>
<li><%= t.title %></li>
<% end %>
</ul>
<%= form_for(@todo) do |f| %>
<%= f.text_field :title %>
<%= f.submit "Add" %>
<% end %>
Ruby on Rails は古典的なフレームワークであり、今でもお気に入りの一つです!
セットアップ:rails new コマンドでさっと始められる!🚀 データベース連携:ActiveRecordがサポートしてくれて簡単にデータベースを扱えます。 ルーティング:RESTful ルーティングが内蔵されておりシンプルです。
3) Python Django Code
# models.py
from django.db import models
class TodoItem(models.Model):
title = models.CharField(max_length=200)
completed = models.BooleanField(default=False)
def __str__(self):
return self.title
# views.py
from django.shortcuts import render
from .models import TodoItem
def todo_list(request):
todo_items = TodoItem.objects.all()
context = {
'todo_items': todo_items,
}
return render(request, 'todo/todo_list.html', context)
# urls.py (inside app folder)
from django.urls import path
from .views import todo_list
app_name = 'todo'
urlpatterns = [
path('', todo_list, name='list'),
]
# templates/todo/todo_list.html
{% extends "base.html" %}
{% block content %}
<h1>Todo List</h1>
<ul>
{% for item in todo_items %}
<li>{{ item.title }} - {{ item.completed }}</li>
{% endfor %}
</ul>
{% endblock %}
Python Django - 「締切り厳守の完全主義者向け」ウェブフレームワーク。期待通り優秀です。そして誰もがPython愛好家ですね?
セットアップ: django-admin startproject を使用してすぐに作業開始可能。 ルーティング:URL設定は他のフレームワークよりも複雑ですが、管理可能です。 データベース連携:ORM によりデータベース操作がスムーズに行えます⛵️。
4) PHP Laravel Code
// routes/web.php
Route::get('/', 'TodoController@index');
Route::post('/todos', 'TodoController@store');
// Todo model
class Todo extends Model {
protected $fillable = ['title'];
}
// Todo controller
class TodoController extends Controller {
public function index() {
$todos = Todo::all();
return view('todo.index', compact('todos'));
}
public function store(Request $request) {
$this->validate($request, [
'title' => 'required'
]);
Todo::create(['title' => request('title')]);
return redirect('/');
}
}
// resources/views/todo/index.blade.php
<form method="POST" action="/todos">
{{ csrf_field() }}
<label>Title:</label>
<input type="text" name="title">
<button type="submit">Add</button>
</form>
<ul>
@foreach ($todos as $todo)
<li>{{ $todo->title }}</li>
@endforeach
</ul>
Laravel では綺麗な文法と楽しい開発体験を提供しており、PHP 開発をエレガントにします!
セットアップ: Composer を使って簡単(composer create-project --prefer-dist laravel/laravel my_todo_app) ルーティング: web.php ファイルでシンプルなルート定義🗺️。 データベース連携: Eloquent ORM で全て整理整頓されます。
5) Java Spring Code
@RestController
@RequestMapping("/todos")
public class TodoController {
private final TodoRepository todoRepository;
public TodoController(TodoRepository todoRepository) {
this.todoRepository = todoRepository;
}
@GetMapping("/")
public List<Todo> getAllTodos() {
return this.todoRepository.findAll();
}
@PostMapping("/")
public ResponseEntity<Object> createTodo(@RequestBody Todo newTodo) {
try {
this.todoRepository.save(newTodo);
return ResponseEntity.ok().build();
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
}
@Entity
@Table(name = "todos")
public class Todo {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;
private String title;
private boolean completed;
}
Java Spring は堅牢なフレームワークと豊富な設定オプションで Java の力をウェブ開発に引き出します!
セットアップ:少し手間取るかもしれませんが、問題ありません。 ルーティング:注釈付きコントローラで簡単にルート設定ができます。 データベース連携:JPA がしっかりしたデータベースサポートを提供しています。
6) C# .NET Code
using System;
using System.Collections.Generic;
class Program {
static void Main(string[] args) {
List<string> todos = new List<string>();
Console.WriteLine("Todo list");
while (true) {
Console.Write("> ");
string input = Console.ReadLine();
if (input == "quit") {
break;
}
if (input.StartsWith("+")) {
string todo = input.Substring(1).Trim();
todos.Add(todo);
Console.WriteLine($"Added: {todo}");
} else if (input.StartsWith("-")) {
int indexToRemove = int.Parse(input.Substring(1).Trim()) - 1;
if (indexToRemove >= 0 && indexToRemove < todos.Count) {
string removedTodo = todos[indexToRemove];
todos.RemoveAt(indexToRemove);
Console.WriteLine($"Removed: {removedTodo}");
}
} else if (input == "") {
Console.WriteLine("Todos:");
for(int i=0; i<todos.Count; i++){
Console.WriteLine($"{i+1}: {todos[i]}");
}
}else{
//invalid command entered
}
}
}
}
C# .NET は抜群のパフォーマンスを発揮し、フルスタックのウェブアプリ開発に必要な機能が詰まっています。
セットアップ:Visual Studio か CLI ツールを使って、どちらでも簡単⛵️。 ルーティング:属性ベースのルーティングでコントローラー・メソッド上で直接定義🎯。 データベース連携: Entity Framework Core は強力でエコシステムとよく統合されています。
7)Go Gin Code
package main
import (
"github.com/gin-gonic/gin"
)
type Todo struct {
ID int `json:"id"`
Title string `json:"title"`
Completed bool `json:"completed"`
}
var todoList []Todo
func main() {
r := gin.Default()
// GET all todos
r.GET("/todos", func(c *gin.Context) {
c.JSON(200, todoList)
})
// POST a new todo
r.POST("/todos", func(c *gin.Context) {
var newTodo Todo
c.BindJSON(&newTodo)
// Generate unique ID for the new todo item
if len(todoList) == 0 {
newTodo.ID = 1
} else {
lastID := todoList[len(todoList)-1].ID
newTodo.ID = lastID + 1
}
// Append the newly created item to the list of todos.
todoList = append(todoList, newTodo)
c.JSON(201, gin.H{
"message": "New ToDo added successfully",
"todo": &newToDo,
})
})
r.Run(":8080")
}
GinはGo言語のシンプルさと速さを好む方に選択肢です。軽量でありながら多機能です!
セットアップ: go mod init を使用して簡単な設定🚀。 ルーティング: 数行程度のコードだけで簡単に路線設定! データベース連携: GORM がデータベース操作を楽しくします💾。
8) Swift Vapor Code
import Vapor
final class Todo: Content {
var id: Int?
var title: String
init(title: String) {
self.title = title
}
}
func routes(_ app: Application) throws {
// create a new todo item
app.post("todo") { req -> EventLoopFuture<Todo> in
let todo = try req.content.decode(Todo.self)
return todo.save(on: req.db).map { todo }
}
// get all todos from the database
app.get("todos") { req -> EventLoopFuture<[Todo]> in
return Todo.query(on: req.db).all()
}
}
Swift VaporではSwift のパフォーマンスをサーバーサイド開発に応用し、焼きたてりんごパイ 🍏 のように素晴らしい体験が得られます!
セットアップ:Xcode 設定時間も含めると少々手間取るかも知れません。 ルーティング:直感的で読みやすいルート定義です。 データベース連携:Fluent ORM は強力で表現豊かです。
9) Kotlin Ktor Code
data class Todo(val id: Int, val task: String)
val todos = mutableListOf<Todo>()
fun main() {
embeddedServer(Netty, port = 8080) {
install(ContentNegotiation) {
json()
}
routing {
get("/todos") {
call.respond(todos)
}
post("/todos") {
val todo = call.receive<Todo>()
todos.add(todo)
call.respond(HttpStatusCode.Created)
}
delete("/todos/{id}") {
val id = call.parameters["id"]?.toIntOrNull()
if (id == null || !todos.removeIf { it.id == id })
call.respond(HttpStatusCode.NotFound)
else
call.respond(HttpStatusCode.OK)
}
}
}.start(wait = true)
}
Ktor はJetBrains の言語イノベーション💡とシンプルさを組み合わせて、Kotlin を使ったウェブアプリ開発の手助けをします!
セットアップ: 最初に少し設定が必要だが、問題なく進めることが可能。 ルーティング: DSL を使用して綺麗でエレガント🎩なルート設定! データベース連携: Exposed ライブラリはデータベース操作がシンプルでパワフル⚙️。
10) MarsX (Bonus) 🚀 帽子をしっかりお持ち下さい!まったく新しいフレームワーク/言語ではToDoリスト作成も驚異の7分間しかかからず、私の祖母でも簡単に作れました!
ただし一つ注意点として - それはまだ非公開β版であり、待機リストに登録されるほどの戦いが予想されます。参加したい方はこちらから申し込んでください。
<schema>
<array name="todo">
<object>
<string name="title" />
</object>
</array>
</schema>
これで以上です! 同じアプリを作るために使用された9つの異なるフレームワーク - どれを選んでも、スタートアップがデカ・ユニコーン🦄へと成長することを願っています。ただし、賢明に選択してください。何故なら、選んだフレームワークは今後9年間あなたの人生を左右するからです😉。
ツイッターでフォローまたはご挨拶をお願いします:johnrushx
開発楽しみましょう!

