डिप्लॉय करना
text build --adapter static, bun, vercel या cloudflare से डिप्लॉय करें, या प्रॉक्सी के पीछे text start चलाएं।
text build एक पोर्टेबल dist/ बनाता है। एडैप्टर इसे उस आउटपुट में बदलता है जिसकी प्लेटफ़ॉर्म को ज़रूरत होती है।
एडैप्टर
text build --adapter <name>| एडैप्टर | आउटपुट | कहां चलता है |
|---|---|---|
| (कोई नहीं) | dist/ + dist/.text/server | text start (Node) |
static | dist/ | कोई भी स्टैटिक होस्ट |
bun | dist/server.js | bun dist/server.js |
vercel | .vercel/output | Vercel (Build Output API v3) |
cloudflare | dist/ + _worker.js | Cloudflare Pages |
एडैप्टर TEXTJS_ADAPTER से भी मिल सकता है। जब text build Vercel (VERCEL=1) या Cloudflare Pages (CF_PAGES=1) पर चलता है, तो उससे मेल खाने वाला एडैप्टर अपने आप चुना जाता है।
सर्वर एडैप्टर (bun, vercel और cloudflare) वही पाइपलाइन चलाते हैं जो text start चलाता है: मिडलवेयर, rewrites, रूट कैश के साथ रूट हैंडलर, स्टैटिक एसेट, फिर पेज URL के लिए कंसोल डॉक्यूमेंट। इसके बजाय curl जैसे टर्मिनल क्लाइंट को पेज का पहला फ़्रेम ANSI टेक्स्ट के रूप में मिलता है। vercel और cloudflare पर यह सिर्फ़ स्टैटिक पेजों के लिए है (curl और टर्मिनल क्लाइंट देखें)। सर्वर एडैप्टर /assets/ के अंतर्गत हैश वाली फ़ाइलों को Cache-Control: public, max-age=31536000, immutable के साथ सर्व करते हैं।
स्टैटिक
text build --adapter staticइसे बिना सर्वर वाले होस्ट के लिए इस्तेमाल करें, जैसे GitHub Pages, S3 या CDN। dynamic = "force-static" या revalidate वाले GET रूट हैंडलर की प्रीरेंडरिंग करके फ़ाइलें बनाई जाती हैं: app/api/feed.json/route.ts से dist/api/feed.json बनता है। index.html की एक कॉपी 404.html में लिखी जाती है ताकि डीप लिंक कंसोल ऐप खोलें। स्टैटिक होस्ट curl और ब्राउज़र में फ़र्क नहीं कर सकते, इसलिए curl को HTML पेज मिलता है।
अगर ऐप को सर्वर की ज़रूरत है, तो बिल्ड हर कारण की सूची देकर फ़ेल हो जाता है: middleware.ts, सर्वर पर रेंडर किए गए रूट, डायनामिक रूट हैंडलर, डायनामिक सेगमेंट वाले रूट हैंडलर या GET के अलावा अन्य मेथड। इसके बजाय होस्ट पर rewrites कॉन्फ़िगर करें।
Bun
text build --adapter bunPORT=8080 bun dist/server.jsbun एडैप्टर एक ही स्वयंपूर्ण सर्वर लिखता है जिसे रनटाइम पर node_modules की ज़रूरत नहीं होती। यह PORT (डिफ़ॉल्ट 3000) और HOSTNAME (डिफ़ॉल्ट 0.0.0.0) पढ़ता है, और कभी server.js या .text/ सर्व नहीं करता। यह लंबे समय तक चलने वाली प्रोसेस है, इसलिए text start की तरह यह सर्वर पर रेंडर किए गए रूट (export const runtime = "server") और उनके लाइव सेशन भी होस्ट करता है। इसे कंटेनर में इस्तेमाल करें:
FROM oven/bun:1COPY dist /appCMD ["bun", "/app/server.js"]Vercel
text build --adapter vercelvercel deploy --prebuiltया Vercel से जुड़ी Git रिपॉज़िटरी में पुश करें: बिल्ड text build चलाता है, Vercel का पता लगाता है और .vercel/output लिखता है।
| आउटपुट | सामग्री |
|---|---|
static/ | क्लाइंट बिल्ड (basePath के अंतर्गत) |
functions/_textjs/server.func | स्ट्रीमिंग के साथ हर रूट हैंडलर सर्व करने वाला एक Node.js 22 फ़ंक्शन |
functions/_middleware.func | Edge रूटिंग मिडलवेयर: middleware.ts, और हर ऐप के कैननिकल पाथ |
config.json | एसेट हेडर, मिडलवेयर मैचर, रीराइट, हैंडलर रूट और कंसोल डॉक्यूमेंट |
एज मिडलवेयर x-middleware-next / x-middleware-rewrite प्रोटोकॉल का इस्तेमाल करता है, इसलिए फ़ंक्शन या CDN तक पहुंचने से पहले Vercel के राउटर में हेडर ओवरराइड और रीराइट होते हैं। सभी मैचर एक ही रूट src पैटर्न साझा करते हैं। जिन रिक्वेस्ट को कोई मैचर कवर नहीं करता, वे मिडलवेयर को छोड़ देती हैं, सिवाय उन मामलों के जहां उनका पाथ कैननिकल रूप में न हो सकता है (परसेंट-एस्केप, URL पार्सर से एनकोड होने वाले कैरेक्टर, //, . या .. सेगमेंट, अंत में स्लैश)। फिर मिडलवेयर कैननिकल पाथ से मिलान करता है, has / missing जांचता है और रिक्वेस्ट को उस पाथ पर रीराइट करता है ताकि Vercel उसे उसी तरह रूट करे। बिना middleware.ts वाले ऐप को भी वही एज फ़ंक्शन मिलता है, जो सिर्फ़ रीराइट करता है। चूंकि हर बिल्ड में एक Edge फ़ंक्शन शामिल होता है, इसलिए लॉग-इन किए हुए Vercel अकाउंट से डिप्लॉय करें: अनाम डिप्लॉयमेंट (vercel deploy --temporary) Edge फ़ंक्शन स्वीकार नहीं करते।
हैंडलर फ़ंक्शन इंटरनल है। हर हैंडलर रूट उससे मेल खाने वाला पाथ x-textjs-path रिक्वेस्ट हेडर में उस फ़ंक्शन को भेजता है। मिडलवेयर से पहले और बाद में हर रिक्वेस्ट से वह हेडर हटा दिया जाता है, और एज मिडलवेयर कभी ऐसा हेडर (क्लाइंट से या middleware.ts से मिला हुआ) आगे नहीं भेजता, इसलिए सिर्फ़ हैंडलर रूट ही इसे सेट कर सकते हैं। /_textjs/* की रिक्वेस्ट मिडलवेयर और रीराइट से पहले और बाद में फ़ंक्शन चलाए बिना 404 लौटाती हैं। जनरेट किए गए रूट में मिलान के समय बड़े और छोटे अक्षरों का फ़र्क रखा जाता है, जैसे हर दूसरे होस्ट पर मैचर और रीराइट में होता है।
एडैप्टर के टेस्ट इस आउटपुट को Vercel के राउटर के लोकल इम्यूलेशन पर चलाते हैं। src मिलान, dest कैप्चर, हेडर ट्रांसफ़ॉर्म और status रूट के लिए इसके व्यवहार को असली डिप्लॉयमेंट पर जांचा गया था; Edge मिडलवेयर को नहीं जांचा गया था, क्योंकि इसे अनाम रूप से डिप्लॉय नहीं किया जा सकता।
Cloudflare Pages
text build --adapter cloudflarebunx wrangler pages dev dist --compatibility-flags=nodejs_compatbunx wrangler pages deploy distआउटपुट Pages के एडवांस्ड मोड का इस्तेमाल करता है:
| फ़ाइल | काम |
|---|---|
_worker.js | मिडलवेयर, रीराइट, रूट हैंडलर और कंसोल डॉक्यूमेंट |
_routes.json | हर रिक्वेस्ट वर्कर को भेजता है। मिडलवेयर या basePath न होने पर, /assets/* Pages के स्टैटिक CDN पर रहता है |
_headers | /assets/* के लिए इम्यूटेबल कैशिंग (आपकी फ़ाइल में जोड़ी जाती है) |
404.html | गुम फ़ाइलों के लिए Pages से ऐप के बजाय 404 लौटवाता है (अगर आपकी फ़ाइल मौजूद है तो उसे रखा जाता है) |
.text/ (सर्वर बंडल और बिल्ड मैनिफ़ेस्ट) को dist/ से हटा दिया जाता है, क्योंकि Pages डायरेक्टरी को ज्यों का त्यों पब्लिश करता है।
Pages प्रोजेक्ट में (सेटिंग → रनटाइम) या wrangler.toml फ़ाइल में nodejs_compat कम्पैटिबिलिटी फ़्लैग चालू करें; डेटा कैश AsyncLocalStorage का इस्तेमाल करता है। स्टैटिक फ़ाइलें ASSETS बाइंडिंग के ज़रिए सर्व होती हैं, और बैकग्राउंड रीवैलिडेशन ctx.waitUntil() का इस्तेमाल करता है।
मिडलवेयर होने पर हैश वाले एसेट समेत हर रिक्वेस्ट वर्कर चलाती है, ताकि मिडलवेयर हर वह पाथ देख सके जिससे किसी फ़ाइल तक पहुंचा जा सकता है। वर्कर चलाने वाली हर रिक्वेस्ट एक Functions इनवोकेशन होती है और आपके Workers रिक्वेस्ट कोटा में गिनी जाती है। पेज लोड के लिए इसमें डॉक्यूमेंट और उसके फ़ेच की गई हर फ़ाइल शामिल है (एक JavaScript बंडल वाले छोटे टेस्ट ऐप के लिए 2; ज़्यादा फ़ाइलों वाले ऐप के लिए ज़्यादा)। Workers Free प्लान पर, रोज़ का कोटा खत्म होने के बाद Pages वर्कर के बिना स्टैटिक फ़ाइलें सर्व करता है, जिससे मिडलवेयर छूट जाता है। अगर मिडलवेयर dist/ में किसी चीज़ की सुरक्षा करता है, तो सेटिंग → रनटाइम → फ़ेल ओपन / क्लोज़्ड को फ़ेल क्लोज़्ड पर सेट करें।
name = "my-console"pages_build_output_dir = "dist"compatibility_date = "2025-01-01"compatibility_flags = ["nodejs_compat"]अपग्रेड करना
@textjs/app के सुरक्षा फ़िक्स किसी डिप्लॉयमेंट तक तभी पहुंचते हैं जब आप उसे दोबारा बिल्ड और डिप्लॉय करते हैं:
- Vercel: नया
.vercel/outputडिप्लॉय करें। - Cloudflare Pages:
_worker.jsऔर_routes.jsonके साथ नयाdist/डिप्लॉय करें। - Bun: पूरा नया
dist/(server.js, एसेट और लाइव बंडल) डिप्लॉय करें और सर्वर रीस्टार्ट करें। text start:text buildचलाएं और रीस्टार्ट करें।
पुराने डिप्लॉयमेंट अपने URL पर उपलब्ध रहते हैं (उदाहरण के लिए, Vercel और Cloudflare Pages के प्रीव्यू URL)। उन्हें मिटाएं या प्लेटफ़ॉर्म की ऐक्सेस सुरक्षा के पीछे रखें।
सर्वर पर रेंडर किए गए रूट
सर्वर पर रेंडर किए गए रूट हर खुले टैब के लिए एक सेशन रखते हैं, इसलिए उन्हें लंबे समय तक चलने वाला सर्वर चाहिए: text start या bun एडैप्टर। जब कोई पेज runtime = "server" एक्सपोर्ट करता है, तो static, vercel और cloudflare एडैप्टर TX030 के साथ बिल्ड फ़ेल कर देते हैं।
प्रॉक्सी के पीछे
text start कमांड 127.0.0.1 से बाइंड होती है और लूपबैक से बाइंड रहने पर सिर्फ़ localhost, *.localhost और IP-पते वाले होस्ट को जवाब देती है (DNS-रीबाइंडिंग सुरक्षा)। दूसरे होस्ट को TX028 के साथ 403 मिलता है। पब्लिक सेटिंग text.config.ts फ़ाइल में रखें:
import { defineConfig } from "@textjs/app";export default defineConfig({ server: { origin: "https://console.example.com", // request.url always uses it (or TEXTJS_ORIGIN) trustProxy: true, // read X-Forwarded-Host / -Proto from your proxy (or TRUST_PROXY=1) allowedHosts: [".example.com"], },});origin या trustProxy के बिना, request.url को वैलिडेट किए गए Host हेडर से http पर बनाया जाता है।
सीमाएं
text.config.tsफ़ाइल मेंproxyसिर्फ़text devऔरtext startमें चलता है; एडैप्टर इसे शामिल नहीं करते।rewritesका इस्तेमाल करें, जिसे हर सर्वर एडैप्टर सपोर्ट करता है।- हर सर्वरलेस इंस्टेंस का अपना इन-मेमोरी कैश होता है। कैशिंग देखें।
- रॉ रेगुलर-एक्सप्रेशन ग्रुप इस्तेमाल करने वाले
rewritesको यथासंभव Vercel रूट में बदला जाता है; नाम वाले पैरामीटर (:slug,:path*) का रूपांतरण सटीक होता है।