create-vite ile React uygulaması oluşturma
React en yaygın kullanılan JavaScript frontend kütüphanesidir.
Bu eğitimde, Deno ile basit bir React uygulaması oluşturacağız. Uygulama, bir grup dinozorun listesini gösterecek. Birine tıkladığınızda, daha fazla ayrıntıyı içeren bir dinozor sayfasına gideceksiniz. Bitmiş uygulama depolarını GitHub'da görebilirsiniz.

Vite ve Deno ile bir React uygulaması oluşturma
Bu eğitimde, create-vite kullanarak Deno ve React uygulamasını hızlıca başlatacağız. Vite, modern web projeleri için bir yapı aracı ve geliştirme sunucusudur.
Vite, React ve Deno ile iyi bir uyum sağlar, ES modüllerini kullanarak React bileşenlerini doğrudan içe aktarmanıza olanak tanır.
Terminalinizde, TypeScript şablonunu kullanarak Vite ile yeni bir React uygulaması oluşturmak için aşağıdaki komutu çalıştırın:
deno run -A npm:create-vite@latest --template react-ts
İstendiğinde, uygulamanıza bir ad verin ve yeni oluşturulan proje dizinine cd yapın. Daha sonra bağımlılıkları yüklemek için aşağıdaki komutu çalıştırın:
deno install
Artık yeni React uygulamanızı başlatmak için aşağıdakini çalıştırabilirsiniz:
deno task dev
Bu, Vite sunucusunu başlatacaktır; tarayıcıda uygulamanızı görmek için çıktıda sağlanan localhost bağlantısına tıklayın. Eğer
VSCode için Deno uzantısını yüklediyseniz, editör kodda bazı hataları vurguladığını görebilirsiniz.
Bu, Vite tarafından oluşturulan uygulamanın Node göz önünde bulundurularak tasarlandığı ve Deno'nun kullanmadığı bazı varsayımları (örneğin, 'gevşek içe aktarımlar' - dosya uzantısız modülleri içe aktarma) kullandığı içindir. — Deno uzantısını devre dışı bırakın veya
deno.json dosyası ile React uygulaması oluşturma eğitiminideneyin.
Bir backend ekleyin
Sonraki adım, bir backend API eklemektir. Çok basit bir dinozor bilgileri döndüren API oluşturacağız.
Yeni projenizin kök dizininde bir api klasörü oluşturun. O klasörde, sunucuyu çalıştıracak bir main.ts dosyası ve kodlanmış dinozor verilerini içerecek bir data.json dosyası oluşturun.
Aşağıdakilerdeki json dosyasını api/data.json dosyasına kopyalayın ve yapıştırın.
Dinozor bilgilerini döndüren yollarla basit bir API sunucusu oluşturacağız. oak middleware framework'ünü ve cors middleware'ini kullanarak
CORS desteği ekleyeceğiz.
Projenize gerekli bağımlılıkları eklemek için deno add komutunu kullanın:
deno add jsr:@oak/oak jsr:@tajpouria/cors
Sonra, api/main.ts dosyasını gerekli modülleri içe aktarmak ve bazı yollar tanımlamak için yeni bir Router örneği oluşturacak şekilde güncelleyin:
import { Application, Router } from "@oak/oak";
import { oakCors } from "@tajpouria/cors";
import data from "./data.json" with { type: "json" };
const router = new Router();
Bundan sonra aynı dosyada, iki yol tanımlayacağız. Bir /api/dinosaurs yoluyla tüm dinozorları dönecek ve diğeri /:dinosaur yolu ile URL'deki isme bağlı olarak belirli bir dinozoru dönecek:
router.get("/api/dinosaurs", (context) => {
context.response.body = data;
});
router.get("/api/dinosaurs/:dinosaur", (context) => {
if (!context?.params?.dinosaur) {
context.response.body = "Dinozor adı verilmedi.";
}
const dinosaur = data.find((item) =>
item.name.toLowerCase() === context.params.dinosaur.toLowerCase()
);
context.response.body = dinosaur ?? "Dinozor bulunamadı.";
});
Son olarak, aynı dosyanın en altında yeni bir Application örneği oluşturun ve tanımladığımız yolları uygulamaya eklemek için app.use(router.routes()) kullanarak sunucuyu 8000 portunda dinlemeye başlayın:
const app = new Application();
app.use(oakCors());
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8000 });
API sunucusunu deno run --allow-env --allow-net api/main.ts komutunu çalıştırarak başlatabilirsiniz. Bu komutu arka planda çalıştırmak için bir görev oluşturacağız ve geliştirme görevini, hem React uygulamasını hem de API sunucusunu çalıştıracak şekilde güncelleyeceğiz.
package.json dosyanızda scripts bölümünü aşağıdaki gibi güncelleyin:
{
"scripts": {
"dev": "deno task dev:api & deno task dev:vite",
"dev:api": "deno run --allow-env --allow-net api/main.ts",
"dev:vite": "deno run -A npm:vite",
// ...
}
Artık deno task dev komutunu çalıştırırsanız ve localhost:8000/api/dinosaurs adresini tarayıcınızda ziyaret ederseniz, tüm dinozorların JSON yanıtını görmelisiniz.
Giriş noktasını güncelleyin
React uygulamasının giriş noktası src/main.tsx dosyasındadır. Bizimki çok temel olacak:
import ReactDOM from "react-dom/client";
import App from "./App";
import "./index.css";
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
<App />,
);
Bir yönlendirici ekle
Uygulama iki yolu olacak: / ve /:dinosaur.
Biraz yönlendirme mantığı oluşturmak için react-router-dom kullanacağız, böylece projenize react-router-dom bağımlılığını eklememiz gerekecek. Proje kök dizininde aşağıdakileri çalıştırın:
deno add npm:react-router-dom
/src/App.tsx dosyasını güncelleyerek react-router-dom kütüphanesinden BrowserRouter bileşenini içe aktarın ve iki yolu tanımlayın:
import { BrowserRouter, Route, Routes } from "react-router-dom";
import Index from "./pages/index";
import Dinosaur from "./pages/Dinosaur";
import "./App.css";
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Index />} />
<Route path="/:selectedDinosaur" element={<Dinosaur />} />
</Routes>
</BrowserRouter>
);
}
export default App;
API isteklerini iletmek için proxy ayarı
Vite, uygulamayı 5173 portunda sunacakken, API'miz 8000 portunda çalışıyor. Bu nedenle, yönlendiricinin api/ yollarına ulaşabilmesi için bir proxy ayarlamamız gerekecek. vite.config.ts dosyasını aşağıdaki ile yapılandırmak için yeniden yazın:
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
server: {
proxy: {
"/api": {
target: "http://localhost:8000",
changeOrigin: true,
},
},
},
});
Sayfaları oluşturun
İki sayfa oluşturacağız: Index ve Dinosaur. Index sayfası tüm dinozorları listeleyecek ve Dinosaur sayfası belirli bir dinozorun ayrıntılarını gösterecek.
src dizininde bir pages klasörü oluşturun ve o klasörde iki dosya oluşturun: index.tsx ve Dinosaur.tsx.
Türler
Her iki sayfa da API'den bekledikleri veri şeklinin tanımı için Dino türünü kullanacak, bu yüzden src dizininde bir types.ts dosyası oluşturalım:
export type Dino = { name: string; description: string };
index.tsx
Bu sayfa, API'den dinozor listesini alacak ve bağlantı olarak görüntüleyecek:
import { useEffect, useState } from "react";
import { Link } from "react-router-dom";
import { Dino } from "../types.ts";
export default function Index() {
const [dinosaurs, setDinosaurs] = useState<Dino[]>([]);
useEffect(() => {
(async () => {
const response = await fetch(`/api/dinosaurs/`);
const allDinosaurs = await response.json() as Dino[];
setDinosaurs(allDinosaurs);
})();
}, []);
return (
<main>
<h1>Dinozor uygulamasına hoş geldiniz</h1>
<p>Aşağıdaki dinozorlardan birine tıklayarak daha fazla bilgi edinin.</p>
{dinosaurs.map((dinosaur: Dino) => {
return (
<Link
to={`/${dinosaur.name.toLowerCase()}`}
key={dinosaur.name}
className="dinosaur"
>
{dinosaur.name}
</Link>
);
})}
</main>
);
}
Dinosaur.tsx
Bu sayfa, API'den belirli bir dinozorun ayrıntılarını alacak ve bir paragraf içinde görüntüleyecek:
import { useEffect, useState } from "react";
import { Link, useParams } from "react-router-dom";
import { Dino } from "../types";
export default function Dinosaur() {
const { selectedDinosaur } = useParams();
const [dinosaur, setDino] = useState<Dino>({ name: "", description: "" });
useEffect(() => {
(async () => {
const resp = await fetch(`/api/dinosaurs/${selectedDinosaur}`);
const dino = await resp.json() as Dino;
setDino(dino);
})();
}, [selectedDinosaur]);
return (
<div>
<h1>{dinosaur.name}</h1>
<p>{dinosaur.description}</p>
<Link to="/">🠠 Tüm dinozorlara geri dön</Link>
</div>
);
}
Dinozor listesinin stilini ayarlama
Ana sayfada dinozorların listesini gösterdiğimiz için, temel bir biçimlendirme yapalım. Aşağıdakileri src/App.css dosyasının en altına ekleyin:
.dinosaur {
display: block;
}
Uygulamayı çalıştırma
Uygulamayı çalıştırmak için daha önce oluşturduğunuz görevi kullanın:
deno task dev
Tarayıcınızda yerel Vite sunucusuna (localhost:5173) gidin ve tıklanabilir dinozorların listesi ile her birinin ayrıntılarına ulaşabileceğinizi görmelisiniz.

Oluşturma ve dağıtım
Bu aşamada uygulama Vite geliştirme sunucusu tarafından sunulmaktadır. Uygulamayı üretimde sunmak için Vite ile uygulamayı oluşturabilir ve ardından oluşturulan dosyaları Deno ile sunabilirsiniz.
Bunu yapmak için API sunucusunu oluşturulan dosyaları sunacak şekilde güncellememiz gerekecek.
api dizininizde yeni bir util klasörü ve routeStaticFilesFrom.ts adında yeni bir dosya oluşturun ve aşağıdaki kodu ekleyin:
import { Next } from "jsr:@oak/oak/middleware";
import { Context } from "jsr:@oak/oak/context";
// Statik site yollarını yapılandırın, böylece Vite yapı çıktısını ve public klasörünü sunabiliriz.
export default function routeStaticFilesFrom(staticPaths: string[]) {
return async (context: Context<Record<string, object>>, next: Next) => {
for (const path of staticPaths) {
try {
await context.send({ root: path, index: "index.html" });
return;
} catch {
continue;
}
}
await next();
};
}
Bu middleware, staticPaths dizisinde sağlanan yollardan statik dosyaları sunmaya çalışacaktır. Dosya bulunamazsa, zincirdeki sonraki middleware'i çağıracaktır. Artık api/main.ts dosyasını bu middleware'i kullanacak şekilde güncelleyebiliriz:
import { Application, Router } from "@oak/oak";
import { oakCors } from "@tajpouria/cors";
import data from "./data.json" with { type: "json" };
import routeStaticFilesFrom from "./util/routeStaticFilesFrom.ts";
const router = new Router();
router.get("/api/dinosaurs", (context) => {
context.response.body = data;
});
router.get("/api/dinosaurs/:dinosaur", (context) => {
if (!context?.params?.dinosaur) {
context.response.body = "Dinozor adı verilmedi.";
}
const dinosaur = data.find((item) =>
item.name.toLowerCase() === context.params.dinosaur.toLowerCase()
);
context.response.body = dinosaur ? dinosaur : "Dinozor bulunamadı.";
});
const app = new Application();
app.use(oakCors());
app.use(router.routes());
app.use(router.allowedMethods());
app.use(routeStaticFilesFrom([
`${Deno.cwd()}/dist`,
`${Deno.cwd()}/public`,
]));
await app.listen({ port: 8000 });
package.json dosyanıza, uygulamanızı Vite ile oluşturup ardından API sunucusunu çalıştıracak bir serve betiği ekleyin:
{
"scripts": {
// ...
"serve": "deno task build && deno task dev:api",
}
Artık uygulamanızı Deno ile çalıştırmak için aşağıdaki komutu çalıştırabilirsiniz:
deno task serve
Tarayıcınızda localhost:8000 adresini ziyaret ettiğinizde, uygulamanın çalıştığını görmelisiniz!
🦕 Artık Vite ve Deno ile bir React uygulaması oluşturabilir ve geliştirebilirsiniz! Hızlı web uygulamaları inşa etmeye hazırsınız. Bu keskin araçları keşfetmenin tadını çıkarmanızı umuyoruz, neler oluşturduğunuzu görmek için sabırsızlanıyoruz!