DokumentasiPahami modelnya

Konsep inti

Kata-kata yang digunakan dokumen lainnya - rute, halaman, tampilan, komponen, penangan, titik akhir - masing-masing dalam satu baris, dengan tautan ke halaman yang lebih dalam. Baru mengenal Nexy? Mulailah dengan Apa itu Nexy?.

Cara membaca dokumen ini

Tingkat Pertanyaan yang dijawabnya Mulailah dengan
Arsitektur aplikasi lapisan mana yang menjawab permintaan, dan apa yang ditolaknya Cara kerja Nexy
Struktur aplikasi di mana kode itu berada, dan menjadi apa sebuah file Struktur proyek
Presentasi dan rendering apa yang dilihat pembaca, dan siapa yang menghasilkan HTML Penayangan, Perenderan
Interaksi aplikasi apa yang dilakukan pembaca, dan apa tanggapannya Tindakan

Level dibaca dalam urutan itu satu kali. Setelah itu, halaman yang Anda perlukan adalah pencarian, bukan kursus.

Arsitektur aplikasi

Tiga cara untuk memutuskan kode mana yang menjawab URL. Itu adalah alternatif, bukan lapisan:

  • Perutean berbasis file (FBR): file di bawah src/routes/ adalah rute. Standarnya.
  • Router modular: pengontrol dan modul di bawah src/apps/, dideklarasikan dengan dekorator, untuk basis kode bergaya NestJS.
  • Router khusus: FastAPI APIRouter yang sudah ada yang disertakan dalam aplikasi.

Pilihannya adalah satu baris kelas NexyConfig di nexyconfig.py.

Perutean berbasis file tidak memerlukan baris: tanpa useRouter, Nexy membaca src/routes/.

nexyconfig.py
from nexy.core.models import NexyConfigModel  class NexyConfig(NexyConfigModel):    pass  # file-based: no useRouter, the files of src/routes/ are the routes

Router modular adalah modul root src/apps/:

nexyconfig.py
from nexy.core.models import NexyConfigModel from src.apps.app_module import AppModule  class NexyConfig(NexyConfigModel):    useRouter = AppModule  # modular: the root module of src/apps/

Router khusus adalah APIRouter yang sudah Anda miliki:

nexyconfig.py
from nexy.core.models import NexyConfigModel from src.legacy import api  # an APIRouter you already have  class NexyConfig(NexyConfigModel):    useRouter = api  # custom: your router, included as it is

Memilih salah satu dari ketiganya adalah satu keputusan. Memilih kerangka kerja frontend adalah hal lain yang terpisah: lihat Memilih router dan Tampilan.

Struktur aplikasi

Lima gagasan yang berasal dari pembaca Next.js biasanya digabungkan menjadi satu. Keduanya bukanlah hal yang sama, dan perbedaannya menjelaskan sebagian besar pertanyaan "mengapa laman saya tidak dirender".

Gagasan Apa itu Apa yang bukan
Rute pola URL, dihasilkan oleh jalur file satu file: satu file dapat menjawab beberapa URL ([slug])
Halaman file rute yang merender tampilan: .nexy, .md, .mdx, .tsx, .vue, .svelte titik akhir: ia menjawab dokumen, bukan data
Lihat apa yang menghasilkan isi halaman: Jinja2 dan Python, Markdown, atau komponen klien sebuah rute: tampilan yang sama dapat menyajikan beberapa halaman
Komponen bagian yang dapat digunakan kembali yang diimpor halaman sebuah rute: dalam mode server, sebuah komponen tidak pernah dilayani sendiri
Pengendali rute fungsi file rute .py, dinamai menurut metode HTTP (GET, POST, …) halaman: ia mengembalikan JSON, file atau Response
Titik akhir pasangan (URL, metode) yang dijawab oleh penangan seorang penangan: satu file dapat menjawab beberapa titik akhir

Dalam satu kalimat: halaman adalah file rute, tampilan adalah apa yang merendernya, komponen adalah apa yang digunakan kembali oleh halaman, penangan menjawab titik akhir.

Kelimanya dalam satu proyek kecil:

src/
routes/
blog/[slug].nexya route (/blog/{slug}) whose file is a page
api/posts.pya route whose handlers answer two endpoints
components/
Like.tsxa component: never served on its own
src/rute/blog/[siput].nexy
---from "@/components/Like.tsx" import Like slug: prop[str]---<h1>{{ slug }}</h1><Like post="{{ slug }}" />

Frontmatter dan template di bawahnya adalah tampilan halaman; Like adalah komponen yang digunakan kembali.

src/routes/api/posts.py
async def GET():  # the endpoint GET /api/posts    return {"posts": []}  async def POST():  # the endpoint POST /api/posts    return {"created": True}

Pada router modular, rute adalah jalur pengontrol, dan penangan adalah salah satu metodenya, dinamai berdasarkan kata kerja HTTP:

src/
apps/
app_module.pythe root module: lists the controllers
posts_controller.py a route (/api/posts) whose handlers answer two endpoints
components/
Like.tsxa component: never served on its own
src/apps/posts_controller.py
from nexy.decorators import Controller  @Controller("/api/posts")class PostsController:    async def get(self) -> dict:  # the endpoint GET /api/posts        return {"posts": []}     async def post(self) -> dict:  # the endpoint POST /api/posts        return {"created": True}
src/apps/app_module.py
from nexy.decorators import Module from .posts_controller import PostsController  @Module()class AppModule:    controllers = [PostsController]

Halaman tetap berupa file src/routes/, atau tampilan yang dikembalikan pengontrol dengan useViews.

Dengan router khusus, rute adalah jalur APIRouter Anda, dan pengendali adalah fungsi yang didaftarkan oleh dekoratornya:

src/legacy.py
from fastapi import APIRouter api = APIRouter()  @api.get("/api/posts")  # the endpoint GET /api/postsasync def list_posts():    return {"posts": []}  @api.post("/api/posts")  # the endpoint POST /api/postsasync def create_post():    return {"created": True}

Halaman masih berupa file src/routes/: halaman .nexy menjawab di sebelah rute yang disertakan.

Dua kata lagi yang muncul kembali di mana-mana:

  • Layout: file layout.* yang membungkus halaman di bawah foldernya; yang root memiliki dokumen HTML. Lihat Tata Letak.
  • Ketergantungan: fungsi yang dijalankan sebelum penangan, diterapkan per rute atau per folder. Lihat Ketergantungan.

Presentasi dan rendering

Dua keputusan independen, yang sering membingungkan:

  • Format memutuskan file mana yang merender halaman: Tampilan.
  • Mode memutuskan siapa yang memproduksi HTML dan kapan: Perenderan.
Gagasan Satu baris
Modus pelayan server merender halaman .nexy dan .md; komponennya adalah pulau (mode)
Modus klien useCSR = True: file kerangka adalah rutenya, dan navigasi terjadi di browser
SSR, ISR, CSR, kepulauan empat mode rendering, ditentukan per halaman kecuali CSR, yaitu per proyek (perenderan)
Hidrasi browser yang melampirkan kerangka kerja ke HTML yang sudah dikirim server (pulau)
Alat peraga nilai yang diberikan induk ke komponen, dideklarasikan name: prop[type] dalam file .nexy (berkas .nexy)

Halaman mode server dengan satu pulau: server merender halaman, browser menghidrasi grafik hanya ketika grafik digulir hingga terlihat.

src/rute/penjualan.nexy
---from "@/components/Chart.tsx" import Chart---<h1>Sales</h1><Chart directive="client:visible" />

Pulau masuk dalam tampilan, dan pengontrol mengembalikan tampilan:

src/apps/sales_view.nexy
---from "@/components/Chart.tsx" import Chart---<h1>Sales</h1><Chart directive="client:visible" />
src/apps/sales_controller.py
from nexy.decorators import Controllerfrom nexy.hooks import useViews  @Controller("/sales")class SalesController:    async def get(self):        return useViews("src/apps/sales_view.nexy")

Interaksi aplikasi

Gagasan Satu baris
Tindakan fungsi Python yang ditandai @Action, berfungsi sebagai POST, dapat dipanggil dari formulir atau sebagai fungsi yang diketik (tindakan)
Formulir formulir HTML yang diposkan ke suatu Tindakan, dengan kesalahan validasi kembali ke halaman (tindakan)
Navigasi tautan yang mengambil terlebih dahulu, dan kait yang membaca jalur, kueri, cookie, dan sesi (kait)
Pengambilan data dilakukan oleh halaman atau penangan yang memerlukannya; Nexy tidak mengirimkan lapisan data klien (handler)

Tindakan dan formulir yang diposkan ke dalamnya, yang berfungsi sebelum skrip apa pun dimuat:

src/actions/newsletter.py
from nexy.decorators import Action  @Actionasync def subscribe(email: str) -> bool:    return True
src/rute/index.nexy
<form method="post" action="{{ __actions_path['subscribe'] }}">  <input name="email" type="email">  <button type="submit">Subscribe</button></form>
src/apps/home_view.nexy
<form method="post" action="{{ __actions_path['subscribe'] }}">  <input name="email" type="email">  <button type="submit">Subscribe</button></form>

Apa yang Nexy tidak lakukan

Otentikasi, otorisasi, database, internasionalisasi, pekerjaan latar belakang, email, pembayaran dan pencarian adalah tanggung jawab aplikasi Anda, bukan kerangka kerja. Nexy memberikan poin ekstensi dan mengatakan di mana harus memasang masing-masing poin: lihat Apa yang diserahkan Nexy kepada Anda.

Otentikasi, misalnya, dihubungkan ke ketergantungan folder yang dilindunginya. Nexy menjalankannya sebelum setiap rute di bawah; siapa penggunanya tetap menjadi keputusan Anda:

src/routes/akun/dependensi.py
from nexy import unauthorizedfrom nexy.http import Request  def require_login(request: Request) -> None:    if not request.session.get("user"):        unauthorized(scheme="Bearer")  dependencies = [require_login]

Otentikasi, misalnya, dihubungkan ke pelindung pada pengontrol yang dilindunginya. Nexy menjalankannya sebelum setiap penangan kelas; siapa penggunanya tetap menjadi keputusan Anda:

src/apps/account_controller.py
from nexy import unauthorizedfrom nexy.decorators import Controller, UseGuardfrom nexy.http import Request  def require_login(request: Request) -> None:    if not request.session.get("user"):        unauthorized(scheme="Bearer")  @Controller("/account")@UseGuard(require_login)class AccountController:    async def get(self) -> dict:        return {"ok": True}

Otentikasi, misalnya, dihubungkan ke ketergantungan router yang dilindunginya, seperti pada FastAPI; siapa penggunanya tetap menjadi keputusan Anda:

src/akun.py
from fastapi import APIRouter, Depends from nexy import unauthorizedfrom nexy.http import Request  def require_login(request: Request) -> None:    if not request.session.get("user"):        unauthorized(scheme="Bearer")  api = APIRouter(prefix="/account", dependencies=[Depends(require_login)])

Alasannya bukan karena minimalisme itu sendiri: kerangka kerja yang memilih ORM atau perpustakaan autentikasi Anda telah memutuskan sesuatu yang hanya dapat diputuskan oleh aplikasi Anda.

Langkah selanjutnya

  • Struktur proyek: setiap folder dan file proyek
  • Glosarium: kata-kata yang sama, dalam satu indeks abjad
  • Cara kerja Nexy: lapisannya, siapa yang membuat apa, dan apa yang Nexy serahkan kepada Anda

Sunting di GitHub

Enter membuka hasil, Esc menutup.