curl and Terminal Clients

curl, Wget, HTTPie and xh get a page's first frame as truecolor ANSI text. Configure its size or turn it off.

Terminal HTTP istemcileri, HTML belgesi yerine sayfanın ilk karesini gerçek renkli ANSI metni olarak alır. Herhangi bir yapılandırma yapmanız gerekmez.

curl https://my-app.example.com/about

Kare alan istekler

Şu koşulların tümü sağlandığında istek bir kare alır:

  • yöntem GET veya HEAD olmalıdır;
  • User-Agent, curl/, Wget/, wget2/, HTTPie/ veya xh/ ile başlamalıdır;
  • Accept başlığı bulunmamalı veya text/html içermemelidir.

Tarayıcılar, tarayıcı botları ve bağlantı önizlemeleri HTML sayfasını alır. curl ile HTML almak için bunu isteyin:

curl -H 'Accept: text/html' https://my-app.example.com/about

Kare, sayfanın sunulacağı noktada seçilir: ara katman, rewrites ve rota işleyicilerinden sonra; dosyalar veya son segmentinde nokta bulunan yollar için hiçbir zaman seçilmez. Ara katman yönlendirmeleri, 401 yanıtları, başlıklar ve yeniden yazımlar, tarayıcılarda olduğu gibi curl için de geçerlidir. /api/health yine kendi işleyicisini çalıştırır ve /robots.txt yine dosyayı sunar.

Karenin içeriği

Kare, ön render edilmiş bir kabukta olduğu gibi sayfanın ilk render çıktısıdır: hâlâ bekleyen her <Suspense> sınırı yedek içeriğini gösterir. Asenkron sunucu bileşenleri çalışmaz ve fetch() hiçbir zaman sonuçlanmaz; bu nedenle efektlerde yüklenen veriler yüklenme durumunda kalır.

  • Boyut: 80 × 24 hücre. Sabit viewport kullanan bir uygulama (viewport.responsive: false) bunun yerine viewport.width × viewport.height kullanır.
  • Renkler: Uygulamanın viewport.theme temasında 24 bit SGR kaçış kodları. Her satır bir sıfırlama koduyla, kare ise yeni satırla biter.
  • Durum: 200 veya eşleşen sayfa olmadığında ya da sayfa notFound() çağırdığında uygulamanın bulunamadı sayfasıyla birlikte 404. Render sırasında redirect() çağıran bir sayfa HTML sunar.

Yanıtlar, Vary: User-Agent, Accept ve Cache-Control: private, no-cache, no-store, max-age=0, must-revalidate başlıklarıyla text/plain; charset=utf-8 biçimindedir; böylece paylaşılan önbellekler hiçbir zaman bir kareyi saklayıp tarayıcıya sunmaz. curl isteğinin kare aldığı yoldaki HTML sayfası da aynı Vary başlığını taşır.

Desteklenen ortamlar

Barındırma ortamıStatik sayfalarDinamik sayfalar, bilinmeyen yollar
text devİstek üzerine renderİstek üzerine render
text start, buntext build ile ön renderİstek üzerine render
vercel, cloudflaretext build ile ön renderHTML sayfası
staticHTML sayfasıHTML sayfası

Sunucuda render edilen sayfalar için text start veya bun gerekir (bkz. Dağıtım).

Statik barındırma ortamları bir istemciye diğerinden farklı yanıt veremez; bu nedenle static adaptörü kareleri desteklemez. Vercel ve Cloudflare’da statik sayfaların kareleri derlemeyle birlikte gönderilir. vercel ve cloudflare adaptörleri bir renderer dağıtmadığından dinamik sayfalar ([id], force-dynamic) bu ortamlarda HTML sunar.

text start ve bun dist/server.js, kalan sayfaları istek üzerine .text/server/live.mjs ile render eder ve son 128 kareyi 10 saniye boyunca tutar. Her sunucu 10 saniyede en fazla 20 önbelleğe alınmamış sayfayı render eder. Bu sınır aşıldığında, bütçe yenilenene kadar curl HTML sayfasını alır. Örneğin bir sayfa modülü en üst düzeyde window okuduğu için sunucuda live.mjs yüklenemezse bu sayfalar HTML sunar.

text build, ön render edilmiş kareleri raporlar:

 ✓ Prerendering curl frames (5/5)

Yapılandırma

Uygulamanın tamamı için boyutu değiştirin veya kareleri kapatın:

text.config.tsts
import { defineConfig } from "@textjs/app";export default defineConfig({  ansi: { cols: 100, rows: 30 },  // ansi: false,});

Bir sayfa kendi boyutunu değiştirebilir veya terminallere de HTML sunabilir:

app/dashboard/page.tsxtsx
export const ansi = { cols: 120, rows: 40 };// export const ansi = false;

Boyutlar 1–500 hücre aralığıyla sınırlanır. text.config.ts dosyasında ansi: false ayarlandığında sayfa dışa aktarımları yok sayılır.

Düz HTTP

-L belirtmediğiniz sürece curl yönlendirmeleri izlemez. Vercel, http:// isteklerini https:// adreslerine yönlendirir; Cloudflare da Her zaman HTTPS kullan açıkken aynısını yapar, bu nedenle curl http://… kare yerine yönlendirmeyi yazdırır. https:// URL’lerini paylaşın.

Özel sunucular

@textjs/app/ansi, text start veya bir adaptör çalıştırmayan sunucular ve fonksiyonlar için algılama ve yanıt yardımcılarını dışa aktarır:

import { ansiResponse, wantsAnsi } from "@textjs/app/ansi";import { frameToAnsi } from "@textjs/react";if (wantsAnsi(request)) return ansiResponse(frameToAnsi(buffer, { theme: "geistDark" }), request.method);

wantsAnsi(request), Web Headers veya Node’un IncomingHttpHeaders türüyle (method, headers) biçimini de kabul eder. frameToAnsi(buffer, { theme }), render edilmiş bir CellBuffer nesnesini çerçevenin yaptığı gibi kodlar.

Bu sayfayı GitHub’da düzenle