Có gì mới trong Text.js
Tệp này ghi lại mọi thay đổi đáng chú ý của Text.js.
Đã thêm
- textjs.org: các bản tiếng Tây Ban Nha, tiếng Pháp, tiếng Đức, tiếng Bồ Đào Nha Brazil, tiếng Hàn, tiếng Trung giản thể và phồn thể đã qua giai đoạn bản nháp tại textjs.org/es, /fr, /de, /pt-br, /ko, /zh-cn và /zh-tw. Bộ chọn ngôn ngữ ở chân trang và nút chọn theo ngôn ngữ trình duyệt cung cấp các ngôn ngữ này, như với tiếng Nhật. Công cụ tìm kiếm lập chỉ mục các trang đã dịch và liên kết từng trang với bản tiếng Anh tương ứng.
- textjs.org: các bản tiếng Ý, tiếng Nga, tiếng Thổ Nhĩ Kỳ, tiếng Ba Lan, tiếng Indonesia, tiếng Việt và tiếng Hindi đã qua giai đoạn bản nháp tại textjs.org/it, /ru, /tr, /pl, /id, /vi và /hi. Bộ chọn ngôn ngữ ở chân trang và nút chọn theo ngôn ngữ trình duyệt cung cấp các ngôn ngữ này, như với các ngôn ngữ khác. Công cụ tìm kiếm lập chỉ mục các trang đã dịch và liên kết từng trang với bản tiếng Anh tương ứng.
Đã thay đổi
@textjs/react:<FocusPad>và<ViewportControl>dùng bộ phông--monocủa trang cho nhãn monospace khi trang có định nghĩa bộ phông này, và dùng Geist Mono làm phông dự phòng như trước. Trang có nhãn tiếng Ả Rập hoặc tiếng Do Thái có thể thêm phông chữ cho hệ chữ tương ứng vào--mono.
Đã sửa
- textjs.org: trên điện thoại, mã nội tuyến dài hơn dòng sẽ xuống dòng thay vì làm trang rộng ra. textjs.org/docs/internationalization từng rộng quá 92 px trên màn hình 390 px.
Đã thêm
@textjs/react:<FocusPad messages>thay thế bất kỳ chuỗi có sẵn nào của vùng focus cho các trang web đã dịch. Nó bao gồm mọi dòng, nhãn cho trình đọc màn hình và bộ điều chỉnh kích thước console.<TextCanvas>và<ViewportControl>cũng nhậnmessages.<ViewportControl>chỉ dùng các khóa của bộ điều chỉnh kích thước. Những chuỗi chứa một giá trị, chẳng hạn “Sau đó nhấp vào đây và nhấn ↑ ↓.”, là các hàm trả về cả câu.defaultFocusPadMessageschứa văn bản tiếng Anh. Xem Dịch vùng focus.@textjs/react: trên các trang từ phải sang trái, vùng focus giữ các phím như ⌘ ⌥ J và kích thước console như 120×36 theo chiều từ trái sang phải, đồng thời phản chiếu bộ điều chỉnh kích thước và thanh bước. Trên các trang tiếng Trung và tiếng Nhật, nó bỏ khoảng trắng giữa hai câu; tiếng Hàn vẫn giữ khoảng trắng.- textjs.org: textjs.org/ja đã qua giai đoạn bản nháp. Bộ chọn ngôn ngữ ở chân trang mở cùng trang đó bằng tiếng Anh hoặc tiếng Nhật. Trình duyệt đặt ngôn ngữ tiếng Nhật có nút Đọc bằng tiếng Nhật, còn trình duyệt tiếng Anh trên textjs.org/ja có nút Đọc bằng tiếng Anh. Nút ngừng xuất hiện sau khi bạn chọn ngôn ngữ hoặc đóng nút. Công cụ tìm kiếm lập chỉ mục các trang đã dịch sang tiếng Nhật và ghép từng trang với phiên bản tiếng Anh tương ứng.
- textjs.org: trên textjs.org/ja, vùng focus dùng tiếng Nhật trên mọi trang, bao gồm cả nhãn bên dưới các phím của từng bản demo.
Đã thay đổi
@textjs/core: console của Chromium và Firefox xóa đầu ra sprite động ở mức 16 MB thay vì 4 MB, nên textjs.org/doom hiển thị “Đã xóa console” khoảng mỗi 19 giây thay vì mỗi 4,5 giây. Safari và sprite vẽ bằng nửa khối▀vẫn giữ mức 4 MB. Heap đỉnh của trang trên textjs.org/doom tăng từ 10,8 MB lên khoảng 12–13 MB.- textjs.org: mỗi trang tài liệu chỉ tải Markdown của chính nó thay vì toàn bộ 33 trang, nên trang tài liệu tiếng Anh tải ít hơn 43–47 KB JavaScript (gzip) và trang tài liệu /ja ít hơn 60–64 KB. Di chuột lên hoặc focus vào liên kết đến trang tài liệu khác sẽ tải trước trang đó, nên trang vẫn mở ngay.
Đã sửa
- textjs.org/ja: tìm kiếm ⌘K hiển thị tiêu đề mục tài liệu tiếng Nhật và đối chiếu truy vấn tiếng Nhật với chúng. Trước đây, nó liệt kê tiêu đề mục tiếng Anh dưới tiêu đề trang tiếng Nhật. Tên tiếng Anh vẫn tìm được trang:
routingtìm thấy ルーティング vàopen the consoletìm thấy コンソールを開く. - textjs.org: ví dụ tài liệu chạy trong console của bạn lại hiển thị thay đổi trong bản xem trước trên trang tại textjs.org/ja, và với ví dụ Văn bản hai chiều trên textjs.org/docs/internationalization. Dòng phía trên ví dụ trong console giờ ghi “▼ Tài liệu › Bộ đếm” thay vì “▼ Tài liệu › Giới thiệu › Bộ đếm”.
Đã thêm
- textjs.org/doom phát hiệu ứng âm thanh của Doom, với cơ chế phân bố âm thanh stereo và suy giảm theo khoảng cách của chính Doom. Âm thanh bắt đầu khi bạn nhấp hoặc nhấn phím lần đầu trên trang, tạm dừng cùng trò chơi và tuân theo Sfx Volume trong menu Options → Sound Volume của Doom. Không có nhạc.
Đã thay đổi
@textjs/react,@textjs/app: gợi ý focus (“Nhấp vào trang để dùng bàn phím”) là thanh màu hổ phách với chữ đen đậm trong mọi theme. Trước đây, nó dùng màu đảo ngược của theme. Mỗi lần xuất hiện, nó nhấp nháy 4 lần trong khoảng 6 giây, rồi giữ màu hổ phách. Nó không nhấp nháy khi bật giảm chuyển động. Mỗi chu kỳ nhấp nháy ghi thêm tối đa 8 frame console.- textjs.org: Doom chuyển đến textjs.org/doom. textjs.org/playground/doom chuyển hướng đến đó.
Đã sửa
@textjs/core,@textjs/react: bảng Vấn đề của Chrome không còn báo “Phần tử trường biểu mẫu phải có thuộc tính id hoặc name” trên mọi trang.<textarea>ẩn nhận bàn phím có têntextjs-input, và<select>kích thước console củaViewportControl(cũng nằm trongsizeControlcủaFocusPad) cóidvà têntextjs-console-size.<textarea>nhận bàn phím cũng từ chối 1Password, LastPass, Bitwarden và Dashlane.- textjs.org: tiêu đề console trên textjs.org/doom ghi “Text.js / doom” thay vì “Text.js / playground / doom”.
- textjs.org/doom: cửa sổ hẹp không còn để sót dấu “·” sau “Xem mã nguồn”.
- textjs.org: trong cửa sổ hẹp, bộ chọn demo của Playground mờ dần ở mép còn demo để cuộn đến, thay vì cắt ngang từ của demo cuối.
- textjs.org/doom chạy ở tốc độ 35 tic mỗi giây của Doom. Trong màn chơi, nó từng chạy nhanh gấp 3,8× trên màn hình 60 Hz (131 tic mỗi giây) và 5,5× ở 120 Hz (192), vì trang nhầm các lần đọc đồng hồ bổ sung của Doom khi vẽ màn chơi là vòng lặp chờ bận, và đẩy đồng hồ Doom tiến một tic ở mỗi frame hoạt ảnh và callback bộ hẹn giờ.
Đã thêm
@textjs/react:<Image renderMode="halfblock">vẽ nửa khối▀ở mọi nơi, như<Image>trong 1.3.@textjs/core/experimental:drawPixelsnhậnencoding: "rgba"để tạo sprite không mất dữ liệu với alpha mềm và hơn 256 màu, cùng hàmfallbackvẽ các ô ở nơi không thể hiển thị sprite.@textjs/app: curl, Wget, HTTPie và xh nhận frame đầu tiên của trang dưới dạng văn bản ANSI truecolor thay vì trang HTML, trêntext dev,text startvà các adapterbun,vercel,cloudflare.text buildprerender frame cho trang tĩnh.text startvàbunrender trang động và trang được render phía máy chủ theo yêu cầu, đồng thời trả về trang không tìm thấy của ứng dụng cùng mã404cho đường dẫn không xác định. Frame mặc định là 80 × 24. Đổi kích thước hoặc tắt frame bằngansitrongtext.config.tshoặcexport const ansitrong trang. Adapterstaticphục vụ trang HTML cho curl. Xem curl và ứng dụng khách terminal.@textjs/app/ansixuấtwantsAnsivàansiResponsecho máy chủ không dùngtext starthoặc adapter, và@textjs/reactxuấtframeToAnsi.- textjs.org: bản nháp tiếng Nhật tại textjs.org/ja, bắt đầu với tài liệu Giới thiệu, Cài đặt, Định tuyến và giao diện trang. Đoạn chưa dịch hiển thị bằng tiếng Anh. Bản này chưa được lập chỉ mục hoặc đưa vào bộ chọn ngôn ngữ.
Đã thay đổi
@textjs/react:<Image>giờ vẽ sprite pixel trong console Chromium và Firefox, với tối đa 8 × 16 pixel mỗi ô cho pixel art và 4 × 8 cho ảnh chụp. Điều này cố ý phá vỡ cam kết của chính sách hỗ trợ rằng các frame trông giống nhau giữa những bản phát hành minor. TruyềnrenderMode="halfblock"để giữ nửa khối của 1.3. Safari, terminal (bao gồmtext run), đầu ra ANSI và văn bản thuần, cùng trang được render phía máy chủ (runtime = "server") vẫn vẽ nửa khối.@textjs/app: script và kiểm tra thời gian hoạt động tải trang bằng curl, Wget, HTTPie hoặc xh giờ nhận văn bản ANSI. Để tiếp tục nhận HTML, gửiAccept: text/html, hoặc đặtansi: falsetrongtext.config.ts.@textjs/app: component máy chủ bất đồng bộ không còn chạy khitext buildprerender shell của trang. Chúng hiển thị nội dung dự phòng<Suspense>như trước, nhưng không bắt đầu yêu cầu dữ liệu lúc build.@textjs/app: trình phát frame cho trang được render phía máy chủ nhỏ hơn 3 KB, còn 22,4 KB gzip thay vì 25,4 KB choexamples/dashboard. Nó không còn kèm phương thức vẽ củaCellBuffer, viền hộp hoặc xử lý cắt ngắn văn bản.
Đã sửa
@textjs/core: biểu đồ và chỉ báo xoay giữ đúng lưới trên Windows 10. Phông console của nó là Consolas, không có các khối một phần tám ▁▂▃▅▆▇, góc phần tư, braille, ▶ hay ✓, và ký tự dự phòng khiến các dòng vượt mép phải frame.CssConsoleDrivergiờ đo một lần để xác định ký tự nào trong số này bị phông console vẽ lệch hơn một phần năm ô, rồi vẽ chúng bằng ký tự gần nhất mà Consolas có:_▄▌█cho phần tám, nửa khối cho góc phần tư và braille,►◄√×cho mũi tên, dấu tích và dấu chéo. Phông chứa các ký tự vừa ô, như Cascadia Mono trên Windows 11 và Menlo trên macOS, vẽ bản gốc.measureText: falsetắt cơ chế này.@textjs/core: không còn đường dọc mảnh 1 px giữa các nền liền kề trong Chrome và Edge DevTools, như bên cạnh “tài khoản” và “số lượng” trên textjs.org/coffee. Chromium căn từng span%ctheo pixel thiết bị riêng biệt và có thể khiến pixel nơi hai span gặp nhau không thuộc span nào.CssConsoleDrivergiờ kéo dài nền span thêm 1 px bên dưới phần tử liền kề không trong suốt bên phải (padding-right:1px;margin-right:-1px). Frame của Firefox và Safari không đổi.@textjs/core: sprite<Image>trong Chrome và Edge tuân theo cùng quy tắc 1 px như văn bản. Văn bản bên trái sprite trong suốt không còn vẽ dải nền rộng 1 px phủ lên mép trái sprite, và sprite khép kín với văn bản không trong suốt bên phải, bao gồm văn bản đảo màu. Sprite đứng một mình trên các dòng của nó giờ chạm mép phải frame, như dòng văn bản bên trên và bên dưới.@textjs/react:<ConsoleMirror>vẽ ảnh chụp cạnh văn bản bằng nửa khối, giống console, thay vì hiển thị ảnh.
Đã thêm
@textjs/react/experimentalxuất<Pixels>cho framebuffer trực tiếp vàuseKeyStatecho phím đang giữ;@textjs/core/experimentalxuấtdrawPixels. Chúng có thể thay đổi trong bản phát hành minor.- textjs.org/playground/doom: chơi phần shareware của Doom trong console DevTools.
@textjs/react,@textjs/app: khi trang không có focus, dòng cuối frame console ghi “Nhấp vào trang để dùng bàn phím”, để người nhấp vào ứng dụng trong console biết vì sao phím ngừng hoạt động. Nó xuất hiện khi ứng dụng có handleruseInputhoặcusePastehoặc đích focus, chỉ trong console trình duyệt, bao gồm trên route được render phía máy chủ. Bản sao nội tuyến và bản xem trước VS Code không hiển thị nó. Tắt bằngfocusHint: falsetrongtext.config.tshoặccreateConsoleRoot.@textjs/react:usePageFocus()trả về trạng thái trang có focus hay không. Để tự quyết định khi nào ứng dụng cần bàn phím, đặtfocusHint: falsevà render<FocusHint active={…}>.useInput(handler, { ambient: true })đánh dấu phím tắt luôn hoạt động nhưng tự nó không làm hiện gợi ý.
Đã thay đổi
@textjs/core: khi sprite<Pixels>chuyển động,ConsoleRenderergom keyframe mỗi 51 ms trong Chromium, điều tiết frame về 33 ms trong Safari và xóa đầu ra đã nối thêm trongCssConsoleDriverở mức 4 MB (SPRITE_MAX_BYTES). Sprite tĩnh và ứng dụng chỉ có văn bản giữ nhịp hiện tại cùng giới hạn xóa 300 frame.
Đã thêm
@textjs/core:bindTextSink(element, onText)đọc văn bản mà IME hoặc phím chết đã chốt từ textarea hoặc input ẩn, một lần mỗi lần chốt và không bao giờ giữa lúc soạn.engine.bindTextSink(element)kết nối textarea bạn tự render vớiInputEngine. Cả hai trả về hàm gỡ các bộ lắng nghe.@textjs/app:POST /__textjs/inputchấp nhận{ type: "text", text }cho văn bản từ IME và phím chết.InputMessagevàparseInputMessagetrong@textjs/app/frame-protocolbao gồm kiểu này.
Đã thay đổi
@textjs/app: middleware và route handler nhận đường dẫn chuẩn hóa./docs/và/docs//introđến dưới dạng/docsvà/docs/intro, nên middleware chuyển hướng để thêm dấu gạch chéo cuối giờ chuyển hướng vô tận. Xóa chuyển hướng đó. Phân đoạn động không thể chứa dấu gạch chéo đã mã hóa:/files/a%2Fbtrả về400.@textjs/app: khi có middleware,--adapter cloudflaregửi mọi yêu cầu đến worker, bao gồm tài nguyên có hash, và khi cóbasePath, nó cũng gửi yêu cầu bên ngoài đường dẫn cơ sở. Mỗi yêu cầu chạy worker là một lần gọi Functions và tính vào hạn mức yêu cầu Workers của bạn. Trên gói Workers Free, đặt dự án Pages thành đóng khi lỗi (Cài đặt → Môi trường chạy → Mở / đóng khi lỗi), nếu không Pages sẽ phục vụ tệp của bạn mà không qua middleware khi hết hạn mức hằng ngày.
Đã sửa
- IME tiếng Trung, tiếng Nhật, tiếng Hàn và phím chết hoạt động trong console nội tuyến của textjs.org. Console từng xóa textarea giữa lúc soạn, khiến ứng dụng nhận chữ cái thô hoặc ký tự sai.
<FocusPad>giữ focus bàn phím trên ứng dụng sau khi nhấp. Trước đây nó bỏ focus ngay, khiến IME tiếng Trung, tiếng Nhật và tiếng Hàn không thể soạn văn bản.- Phím chết không tổ hợp (Windows và Linux không có IME) đến được ứng dụng khi textarea ẩn có focus. Trên US-International,
'rồiecho raévà'rồitcho ra't.InputEnginetừng chặn sự kiện keydown hoàn tất phím chết, nên trình duyệt không chèn gì.DeadKeyTrackertrong@textjs/corecho sự kiện keydown đó đi qua, và bản xem trước VS Code cũng dùng nó. - Bản xem trước VS Code chuyển văn bản từ IME và phím chết mà trước đây nó bỏ qua, đồng thời không còn chuyển phím chết hoặc lần nhấn phím soạn IME đến ứng dụng. Với máy chủ
text devtừ@textjs/app1.1.0 trở về trước, nó gửi văn bản dưới dạng lần nhấn phím hoặc thao tác dán. @textjs/core:InputEngine.handleTextInputbỏ qua văn bản khishouldCapturetrả vềfalse, như đầu vào phím và dán đã làm.text devđóng gói trước@textjs/app/live-stubvà@textjs/app/live-player. Ứng dụng có trangruntime = "server"chỉ tìm thấy chúng sau lần tải trang đầu tiên, nên Vite đóng gói chúng lại giữa lúc tải, gây lỗi 404 cho chunk cũ và lỗi “Lời gọi hook không hợp lệ” do hai bản React.- Biểu đồ và chỉ báo xoay vừa frame trên Windows. Consolas không có các khối ▁▂▃▅▆▇, góc phần tư, braille, ▶ hay ✓, nên Windows vẽ chúng bằng phông dự phòng rộng tới 1,8 ô và các dòng biểu đồ vượt mép phải frame. Danh sách phông console giờ là
"SF Mono",Menlo,"Cascadia Mono",Consolas,monospace, và Windows 11 vẽ toàn bộ frame bằng Cascadia Mono.<ConsoleMirror>, bản xem trước VS Code và chế độ xem frame của tiện ích DevTools cũng đặt Cascadia Mono trước Consolas. @textjs/opencode: dưới Node trên Windows, cầu nối tìm thấy OpenCode cài bằngnpm i -g opencode-ai. Node không thể khởi động shimopencode.cmdcủa npm bằng tên, nên cầu nối hoạt động như thể chưa cài OpenCode. Giờ nó tìm trongPATHvới từng phần mở rộngPATHEXTvà chạy shim.cmdquacmd.exe. Dưới Bun (bunx), nó đã hoạt động từ trước.text buildhoạt động trên Windows. Trước đây nó thất bại với mọi mẫu, báoCould not resolve entry module "virtual:textjs/api"hoặc không có thông báo lỗi.text buildin lỗi khi prerender shell console hoặc build route được render phía máy chủ thất bại. Trước đây, nó thoát với mã 1 sau dòng “Build thất bại” của Vite mà không nêu lý do.text devtrên Windows render lại route được render phía máy chủ khi bạn sửa tệp, và tải lại trình duyệt khi trang thay đổi giá trị xuấtruntime.text devtrên Windows không còn chạymiddleware.tscho tệp nguồn mà Vite phục vụ dưới dạng module, như/app/page.tsx, nên chuyển hướng xác thực không còn làm hỏng ứng dụng khách phát triển.text runvàtext mcphoạt động khi đường dẫn dự án chứa tên ngắn Windows 8.3, nhưC:\Users\RUNNER~1. Trước đây chúng hiển thị “Lỗi ứng dụng” vì CLI và ứng dụng tải@textjs/apphai lần.dist/build trên Windows phục vụ được trang đã prerender trên Linux và macOS. Manifest route trực tiếp từng lưu đường dẫn bằng dấu gạch chéo ngược.text buildhoạt động khi tùy chọnvitetrongtext.config.tsđặtbuild.rollupOptions.input. Đầu vào này từng thay thế các entry của gói API, route được render phía máy chủ và adapter, khiến build thất bại.text devthoát khi bạn dừng nó trong những giây đầu sau khi tải trang, vàserver.close()hoàn tất. Đóng Vite trong khi nó tối ưu dependency mới phát hiện từng không bao giờ hoàn tất (vitejs/vite#22934).
Bảo mật
@textjs/app1.1.0 trở về trước cho phép yêu cầu bỏ quamiddleware.tsbằng cách viết đường dẫn được bảo vệ theo cách khác, như/ad%6din,/api//adminhoặc/admin%2Fx. Middleware đối chiếu đường dẫn như đã gửi, trong khi trang, route handler và tệp tĩnh được tra cứu sau khi giải mã (hai lần với route handler). Điều này ảnh hưởng đếntext dev,text startvà bản build--adapter bun,vercel,cloudflare. Bản build tĩnh không thể dùng middleware và không bị ảnh hưởng. Nâng cấp lên 1.2.0, rồi build và triển khai lại:.vercel/outputcho Vercel,dist/cho Cloudflare Pages và toàn bộdist/cho Bun (khởi động lại máy chủ). Xóa hoặc bảo vệ các bản triển khai cũ vẫn truy cập được qua URL riêng.- Mỗi host giờ xác định một pathname chuẩn hóa cho mỗi yêu cầu và dùng nó cho matcher,
request.nextUrlvà mọi lần tra cứu. Nó giải mã chuỗi escape phần trăm rồi mã hóa lại đường dẫn theo cáchnew URL()ghi, xử lý phân đoạn.và.., đồng thời bỏ dấu gạch chéo lặp và ở cuối. Đường dẫn có%2F,%5Choặc mã hóa phần trăm không hợp lệ nhận400.text dev,text startvà adapter Bun chỉ phục vụ tệp tĩnh theo đúng tên, nên trên macOS và Windows,/ADMIN/report.txtkhông còn phục vụpublic/admin/report.txt. - Matcher, nguồn rewrite, phân đoạn route và
basePathđược so sánh theo cùng dạng mã hóa như đường dẫn yêu cầu, nênmatcher: "/café/:path*"và"/caf%c3%a9/:path*"bảo vệ/caf%C3%A9, còn"/ops%40corp/:path*"bảo vệ/ops@corp. Middleware không có matcher không chạy ngoàibasePath. Matcher có dấu gạch chéo cuối, như/admin/, khớp với/admin, và điều kiệnhostbỏ qua dấu chấm cuối tên host. - Phiên trực tiếp cho route
runtime = "server"không render trang mà middleware đã rewrite sang đường dẫn hoặc truy vấn khác, như rewrite từ/restrictedsang/login, hoặc đã trả lời bằng trạng thái lỗi nhưNextResponse.next({ status: 403 }). --adapter vercel: hàm route handler nhận đường dẫn trong header yêu cầu mà chỉ route được tạo mới đặt, nên/api/x/%252e%252e/adminkhông còn đến/api/admin, và không cách viết nào của/_textjs/*chạy được hàm. Route được tạo đối chiếu có phân biệt chữ hoa chữ thường, nên/LEGACY/xkhông còn khớp rewrite cho/legacy/:path*mà middleware chưa từng kiểm tra. Mọi đường dẫn có thể chưa chuẩn hóa, bao gồm ký tự thô như{, đều đi qua edge middleware, giờ đi kèm mọi bản build Vercel và rewrite yêu cầu về đường dẫn chuẩn hóa.--adapter cloudflare: tệp tĩnh được tra cứu bằng đường dẫn đã mã hóa, nên/x/%252e%252e/admin/report.txtkhông còn phục vụ/admin/report.txt. Khi cóbasePath, tệp bên ngoài nó không còn được phục vụ mà không qua worker.text devkhông phục vụ tệppublic/dưới/public/…hoặc/@fs/…, nguồn chỉ dành cho máy chủ nhưmiddleware.tsvàtext.config.tsvới kiểu chữ hoa chữ thường khác, dưới đường dẫn/@fs/đã mã hóa, dưới dạng yêu cầu module không có phần mở rộng (/text.config?import) hoặc qua rewrite cấu hình, hay route handler ngoàibasePath.
Đã thêm
- Text.js render trong console Firefox và Safari.
CssConsoleDriverphát hiện trình duyệt bằng kiểm tra tính năng CSS. Ở nơi span%cgiữ dạng nội tuyến, nó ghi chiều cao dòng 14 px không có margin, tắt ngắt dòng mềm và dùng màn cheline-height: 100vh. - Kích thước thích ứng chừa chỗ cho cột liên kết nguồn của Firefox. Safari đặt Menlo đầu danh sách phông: trang của nó không thể dùng SF Mono do người dùng cài, dù Web Inspector có thể dùng phông đó để vẽ.
- Truyền
browser: "chromium" | "firefox" | "safari"vàocreateConsoleRoot,ConsoleRendererhoặcCssConsoleDriverđể chọn console. - Shell đã prerender mang CSS cho cả hai loại console.
<FocusPad>hiển thị phím tắt console cho trình duyệt của người truy cập: ⌘⌥K hoặc Ctrl+Shift+K trong Firefox, và ⌘⌥C trong Safari kèm ghi chú bật “Hiển thị tính năng cho nhà phát triển web”.<FocusPad>đã prerender render phím tắt của mọi trình duyệt. Đặtdata-browser(firefoxhoặcsafari) vàdata-os(mac) trên<html>trước lần vẽ đầu để chỉ hiện phím tắt của người truy cập; nếu thiếu, nó hiện phím tắt Chrome cho Windows và Linux cho đến khi hydrate.
Đã sửa
- ⌘⌥K và Ctrl+Shift+K (phím tắt console Firefox) đi qua đến trình duyệt thay vì đến ứng dụng.
- Kích thước thích ứng học chiều cao thanh công cụ trình duyệt dưới 60 px (của Safari và Firefox) khi DevTools đóng, để console gắn dưới cùng có đủ mọi dòng vừa chỗ.
<FocusPad>dùng chiều cao đã học để nhận biết DevTools có đang gắn hay không. <FocusPad>ghi phím tắt Windows và Linux trong trạng thái nhấp làCtrl+Shift+J.
Bảo mật
@textjs/opencode: cầu nối in mã ghép nối khi khởi động, và textjs.org/opencode yêu cầu mã này ở lần kết nối đầu. Cho đến khi trang gửi mã, cầu nối trả về428và không chuyển gì đến OpenCode, kể cả với origin được phép. Mỗi mã dùng cho một lần chạy cầu nối, token trả về chỉ hoạt động từ origin đã ghép nối, và mười mã sai sẽ khóa ghép nối cho đến khi cầu nối khởi động lại.@textjs/opencode: bản triển khai xem trước Cloudflare Pages của textjs.org không còn được cho phép mặc định. Truyền--allow-originđể dùng một bản.- textjs.org/opencode từ chối cầu nối từ
@textjs/opencode1.0.x. Chạybunx @textjs/opencode@latest proxy. - textjs.org gửi Content-Security-Policy,
Strict-Transport-Security,Cross-Origin-Opener-PolicyvàCross-Origin-Resource-Policy. Trang OpenCode chỉ kết nối đến máy chủ trên127.0.0.1hoặclocalhost.
- Text.js render trong console Firefox và Safari.
Đã thêm
- OpenCode Lite: xem diff từng tệp, duyệt lịch sử prompt, cấu hình phím tắt leader và quản lý tài khoản nhà cung cấp cùng máy chủ MCP. Sandbox có ngăn terminal chạy theo kịch bản.
- OpenCode Lite: gõ
/để tìm lệnh hoặc@để đính kèm tệp dự án. Tab mở thư mục trong menu tệp. Phiên đã kết nối tìm trong dự án trên máy chủ; sandbox tìm trong kho mã ví dụ. - textjs.org/coffee: demo terminal.shop theo kích thước console như ứng dụng SSH, với layout nhỏ, vừa, lớn và thông báo “terminal của bạn quá nhỏ” khi dưới 20 × 10. Tài khoản bổ sung phương thức thanh toán, hồ sơ có tên chỉnh sửa được và thay đổi lịch hằng tuần cho gói đăng ký. Khi đã đăng xuất, giỏ hàng và phần câu hỏi thường gặp, giới thiệu, thông tin gỡ lỗi của tài khoản mở mà không cần đăng nhập.
Hiệu năng
@textjs/react:BoxvàTexttruyền scene prop đã lọc trước cho reconciler thay vì sao chép đối tượng prop khi mount và cập nhật.@textjs/core:SceneNode.getTextModel()bỏ qua duyệt cây nội tuyến trên nút lá<Text>chỉ có một chuỗi và tái sử dụng bộ đệmrunOfkiểuUint16Arrayđã điền số 0 trong bộ nhớ đệm.CssConsoleDriverquét các ô BMP liên tiếp có cùng kiểu trong vòng lặp bên trong, vàConsoleRendererbỏ quacountYogaNodes()trên frame không đổi.- textjs.org: route và tab đồng hành console tách thành chunk JS và CSS theo từng route. Ảnh cửa hàng được mã hóa lại từ bản gốc
photos/final, và ảnh sản phẩm phụ tải khi di chuột lên hoặc đổi slide.
Đã sửa
<ViewportControl>dùngminWidththeo pixel thay vì20chvà liệt kê phông dự phòng khớp thông số kích thước cùng<FocusPad>, nên bộ chọn kích thước giữ nguyên chiều rộng khiGeist Monotải.
Đã thêm
@textjs/opencode: cầu nối textjs.org/opencode thành gói riêng không có dependency. Chạybunx @textjs/opencode proxy(hoặcnpx) để khởi động mà không cài Vite, React và MCP SDK.text proxyvẫn hoạt động và chạy cùng cầu nối.
Đã thay đổi
- Gói framework và CLI giờ là
@textjs/app, đổi tên từ@textjs/nextđể tên không gợi ý tích hợp Next.js chính thức.@textjs/nextđã ngừng khuyến nghị sử dụng để thay bằng@textjs/appvà không có bản phát hành mới. Để chuyển đổi, chạybun remove @textjs/next && bun add @textjs/appvà thay@textjs/nextbằng@textjs/apptrong import, bao gồm đường dẫn con như@textjs/app/link. CLI vẫn làtext, và mẫu create-text-app phụ thuộc vào@textjs/app. - Nút dạng viên
[▼]trong console và trình kiểm tra có tên Dev Overlay, và tiêu đề trình kiểm tra ghi▼ Dev Overlay · Turbolog. Text.js DevTools chỉ là tên tiện ích Chrome.<TextDevOverlay>và các prop không đổi. - Route handler xuất
dynamic = "error"thất bại vớiTX031. Text.js từng coi nó là"force-static"mà không kiểm tra handler có đọc yêu cầu hay không, vốn là ý nghĩa của giá trị này trong Next.js. Dùng"force-static".
Đã sửa
text starttrả lờiHostbị chặn bằngTX028, nhưtext dev. Mỗi máy chủ nêu tên thiết lập nó đọc:vite.server.allowedHostschotext devvàserver.allowedHostschotext start.- textjs.org: chương Triển khai trong Học không còn hướng dẫn thêm rewrite
vercel.json. Trên Vercel và Cloudflare Pages,text buildtự ghiindex.htmldự phòng. Ví dụ rewrite giờ dùng_redirectscủa Netlify. eslint-plugin-textjs:route-handler-exportscho phép xuấtdynamicvàrevalidatetrongroute.ts, vàvalid-route-modulekiểm tra giá trịdynamicở đó.
Đã thêm
- textjs.org: video chương Học đang phát chuyển sang trình phát nhỏ ở góc khi bạn cuộn qua nó. Nút Phụ đề dưới mỗi video bật hoặc tắt phụ đề và nhớ lựa chọn.
<TextDevOverlay>nhận proppill,shortcutvàshell, để ứng dụng không có App Router có thể mount trình kiểm tra với phím và bộ điều khiển theme riêng.<FocusPad>nhậnbanner, hiển thị ở dòng đầu thông báo (ví dụ logo chữ của ứng dụng) và phía trên thông báo trên thiết bị cảm ứng.
Đã thay đổi
- textjs.org: bộ chọn Playground liệt kê Bảng tổng quan, Truyền luồng, Rắn săn mồi, OpenCode và Cà phê (terminal.shop). Mỗi demo có URL riêng: OpenCode ở
/opencodevà terminal.shop ở/coffee, với logo chữ đứng đầu thông báo. Bộ đếm và Biểu mẫu chuyển khỏi Playground; tài liệu vẫn chạy cả hai làm ví dụ trực tiếp. <FocusPad>có layout mới. Mỗi trạng thái hiển thị thanh tiến trình ba phần, tiêu đề, một phần tử lớn và một dòng văn bản. Trước khi console mở, phần tử lớn là phím tắt DevTools. Khi chờ nhấp, nó là con trỏ. Khi hoạt động, nó làhintscủa ứng dụng dưới dạng phím sáng lên khi nhận phím, còn phím không có gợi ý hiển thị bên dưới. Nhãn bước, huy hiệu “Trực tiếp” riêng và dòng “Xem console.” đã bị bỏ. Các dòng hiện dần khi đổi trạng thái, không bao giờ ở lần vẽ đầu, và chuyển động tắt dướiprefers-reduced-motion. Văn bản phụ đạt độ tương phản WCAG AA ở cả hai chế độ hiển thị, và bộ chọn kích thước console hiện vòng focus khi truy cập bằng bàn phím.- textjs.org: Playground dùng layout
<FocusPad>mới. Demo hiện tại trong bộ chọn có bề mặt như các phím, trường lệnh OpenCode có góc và cỡ chữ khớp trường URL, ghi chú terminal.shop chiếm hai dòng thay vì ba, “Xem mã nguồn” nằm trên đường cơ sở của bộ điều khiển kích thước, và văn bản mờ trong vùng focus đạt độ tương phản AA.
Đã sửa
text devphục vụ đường dẫnproxyqua proxy cho mọi yêu cầu.fetch()gửiAccept: */*, nên máy chủ phát triển từng trả lời chúng bằng HTML của ứng dụng trước, và mẫu opencode thất bại ở lần chạy đầu với “Token '<' không mong đợi”.text devkhông còn tải bản React thứ hai khi quá trình quét dependency của Vite đọc tệp chỉ dành cho máy chủ. Quá trình quét kích hoạt kiểm tra import chỉ dành cho máy chủ, in dấu vết ngăn xếp rồi báo “Lời gọi hook không hợp lệ” trong console, và làm hỏng Fast Refresh.text devxử lý URL trang có chuỗi truy vấn, như/?demo. Vite từng coi chúng là thư mục dự án và theo dõi toàn bộ ổ đĩa, nên trên Linux trang không bao giờ tải.- create-text-app: nút dạng viên phát triển không còn che gợi ý phím đầu trên màn hình đầu của mọi mẫu, tên dự án mặc định là
my-appđể khớp tài liệu, các mẫu vượt qua cấu hình khuyến nghị củaeslint-plugin-textjs, và README dashboard giải thích bản build--adapter static. <FocusPad>và<ViewportControl>chỉ đặt viền bằng thuộc tính dạng đầy đủ. React từng cảnh báo “Cập nhật thuộc tính kiểu trong lúc render lại (border)” khi phát triển mỗi lần gợi ý phím lóe sáng.- Văn bản là mục cuối trong dòng giờ giữ vị trí khi ngắn lại. Sau
<Spacer>, nó từng nằm nguyên chỗ mà văn bản dài nhất để lại, và phần tử cùng cấp bị co để vừa dòng tràn vẫn giữ trạng thái co. <FocusPad>thay thế các bước, phụ đề và dòng phím khiactionhoặchintsđổi, nên chuyển demo trong cùng vùng focus không bị báo là dịch chuyển layout.@textjs/react/testingtải Yoga khi được import, nên kiểm thử có thể tạo stub chofetchtrước lầnrender()đầu.
Bản phát hành ổn định đầu tiên.
▼ Text.js 1.0.0 (Turbolog).Đã thay đổi
- Thay đổi không tương thích: gói framework và CLI giờ là
@textjs/next(textjsđã có người dùng trên npm). Cập nhật import từtextjssang@textjs/next. - Cầu nối OpenCode là
bunx @textjs/app proxyvà chạy từ bất kỳ thư mục nào. - Console mặc định vừa bảng DevTools đang gắn (gắn dưới, trái hoặc phải, thu phóng trang, thanh công cụ xuống dòng). DevTools tách rời dùng kích thước dự phòng
120×36. Vùng focus có thêm bộ điều khiển kích thước.
Đã thêm
useKeymapvới màn hình trợ giúp?tự động, gợi ý phím và bảng lệnhCtrl+K.- Component dữ liệu:
List(ảo hóa),Table,Tree. - Biểu đồ:
LineChart,BarChart,Sparkline,ProgressBar, cùngGradientvàImage. - Điều khiển:
Button,Checkbox,Switch,RadioGroup,Slider,Dialog,Confirmvà thông báo toast. - Layout:
Center,Stack,Grid,SplitPane,FocusScope. - Hook cho bộ hẹn giờ, hoạt ảnh, đo lường, điểm ngắt, lưu trữ và bộ nhớ tạm.
- Văn bản từ phải sang trái. Text.js triển khai Thuật toán hai chiều Unicode (UAX #9, Unicode 18.0) và vượt qua toàn bộ 770.241 trường hợp
BidiTest.txtvà 91.707 trường hợpBidiCharacterTest.txt. Chữ Ả Rập có xử lý hình dạng, và<Text dir>cô lập một span. - Mã lỗi
TX###ổn định. Lỗi framework mang mã và liên kết đếnhttps://textjs.org/errors/<code>. @textjs/react/testingđể render component thành văn bản trong kiểm thử.@textjs/react/terminalvàtext run, render ứng dụng App Router trong terminal thật.text mcp, phục vụ ứng dụng qua Model Context Protocol để tác nhân lập trình có thể điều hướng, nhấn phím và đọc frame mà không cần trình duyệt.- Tiện ích Text.js DevTools, bảng cạnh Bảng điều khiển với cây component, trình kiểm tra frame và dòng thời gian.
eslint-plugin-textjsvà tiện ích VS Code với bản xem trước trực tiếp.apps/terminal-shop: cửa hàng terminal.shop trong console, dùng API thật (mặc định là sandbox phát triển, môi trường production khóa hai lớp).- textjs.org: Học, khóa học 10 chương chạy trong console. Prerender lúc build cùng hydration, phông tự lưu trữ khớp thông số kích thước, route
.htmlkhông có dấu gạch chéo cuối và trang tài liệu mới có bản xem trước trực tiếp.
Hiệu năng
- Phá khóa pha điều tiết DevTools sau khi xóa. Sau frame có thao tác xóa, trình render chờ một lần 110 ms để frame sau đi vào luồng xử lý tức thời của DevTools. Độ trễ hiển thị p50 giảm từ 63 ms xuống 10 ms.
- Vẽ lại một phần theo dải thay đổi: chỉ vẽ lại dải dòng bị thay đổi tác động.
- Hash từng dòng lưu trong bộ nhớ đệm, ID kiểu dạng số nguyên và frame nhàn rỗi không cấp phát bộ nhớ.
- Không có bộ hẹn giờ nhàn rỗi khi trang ẩn hoặc mất focus.
Đã sửa
- Không còn span lớp vẽ rỗng ảo ở chỗ ngắt dòng, và không còn màn che kép.
- Màn che nằm trên dòng riêng, nên liên kết nguồn DevTools (
VM12:1) không bao giờ làm dòng 0 xuống dòng. - Chỉ báo xoay mặc định vừa chính xác từng ô (Menlo không có ký tự braille). Biến thể
braillecần bật chủ động. text buildtrên Node không còn đóng gói bản phát triển của React.- textjs.org: dịch chuyển layout tích lũy là 0 trên mọi route. Playground và OpenCode dùng chung một layout vùng focus.
- textjs.org: thanh bên tài liệu và Học giữ ghim ở cuối trang dài.
- textjs.org: tab tệp, khối mã và bảng văn bản chỉ cuộn ngang, nên iOS Safari không bao giờ chiếm thao tác vuốt dọc trang.
- textjs.org:
scrollbar-gutter: stablechỉ áp dụng cho thiết bị dùng chuột. Trên iOS Safari, nó từng làm lần cuộn đầu bị nhảy. - textjs.org: đã tắt neo cuộn. Trên iOS Safari, nó từng ghim phần đầu trang dưới tiêu đề cố định.
- Thay đổi không tương thích: gói framework và CLI giờ là
Frame không chớp và render phía máy chủ.
Đã thay đổi
- Các frame được nối thêm thay vì gọi
console.clear()+console.log()cho mỗi frame. DevTools xóa đồng bộ nhưng giới hạn vẽ thông báo mới theo chu kỳ 50 ms, nên thao tác xóa khiến console trống trong 70,6% lần vẽ của DevTools ở 15 fps và 81,1% ở 60 fps. Một span màn che có độ rộng bằng không ở đầu ẩn các frame trước đó. Console chỉ bị xóa ở frame đầu tiên, sauinvalidate(), khi nhàn rỗi sau khi đã xếp chồng 100 frame, hoặc khi đạt 300 frame. - Các frame xuất ra cách nhau ít nhất 66 ms (khoảng 15 fps). Frame nhanh hơn khởi động lại chu kỳ giới hạn của DevTools và bị bỏ: ở 60 fps, DevTools vẽ 67 trong số 295 frame xuất ra.
- Playground và OpenCode là các vùng focus toàn màn hình.
Hiệu năng
- CSS của span chỉ dùng thuộc tính longhand, giảm số thuộc tính DevTools sao chép vào mỗi dòng từ khoảng 33 xuống khoảng 7. Màu hex và các dải trống chỉ dùng nền làm khóa.
- Phân tích Markdown tăng dần và ghi nhớ các dòng
Markdown,CodevàDiff. - Xử lý prop của host trong một lượt, cập nhật prop thưa và không tính lại layout Yoga khi kích thước văn bản không thể thay đổi.
- Một frame streaming giảm từ 0,79 ms xuống 0,14 ms, một nhịp spinner từ 0,90 ms xuống 0,056 ms. Đầu ra giống hệt từng bit.
Đã thêm
- Render phía máy chủ. Trang export
runtime = "server"render trên máy chủ, bao gồm componentasync function, và truyền các thay đổi của ô theo từng dòng qua server-sent events đến trình phát frame có kích thước khoảng 19 kB gzip. - Prerender từng phần.
text buildchèn trực tiếp frame đầu tiên của mỗi route tĩnh vào HTML của route đó, để console vẽ trước khi bất kỳ mô-đun nào tải. middleware.ts, cấu hình phân đoạn route (dynamic,revalidate) vàtextjs/cache(unstable_cache,revalidateTag,revalidatePath).text build --adapter static|bun|vercel|cloudflare.bench/devtools: bộ công cụ điều khiển frontend DevTools thật và đo các lần vẽ trống, frame bị bỏ, độ trễ hiển thị và CPU của DevTools.
Đã sửa
- DevTools không còn biến văn bản
path:line,//host:portvàdata:thành liên kết. - Cầu nối OpenCode tìm daemon được quản lý (cổng tạm thời, xác thực cơ bản), gửi header CSRF khi ghi và báo lỗi trong một dòng.
- Các frame được nối thêm thay vì gọi
Đã thay đổi
- Đầu vào rời rạc (một lần nhấn phím, một lần dán) render đồng bộ trong cùng tác vụ thay vì chờ frame hoạt ảnh tiếp theo.
- TUI OpenCode tinh gọn khớp với bản thật.
- Rà soát toàn bộ textjs.org cho thiết bị di động và khả năng thích ứng kích thước màn hình.
Đã thêm
@textjs/font: trình phân tích và render phông chữ FIGlet với 17 phông chữ đi kèm, dành cho<FigletText>và<AsciiFont>. Đầu ra khớp với 273 mẫu tham chiếu ghi lại từ tệp nhị phânfiglet2.2.5.text proxy: cầu nối CORS cục bộ để textjs.org giao tiếp với máy chủ OpenCode của bạn.
Đã thêm
apps/opencode-console: ứng dụng khách OpenCode có kết nối, render trongconsole.log, với bản demo dự phòng khi không có máy chủ chạy.- Mẫu
opencodechocreate-text-app. - textjs.org: trang giới thiệu mới, bảng đồng hành console trực tiếp, Playground, trang OpenCode và tài liệu.
- Quy trình triển khai GitHub Pages có tạo route tĩnh.
Cột mốc đầu tiên.
Đã thêm
@textjs/core:CellBuffertrên mảng định kiểu phẳng, layout Yoga WASM, đo văn bản bằngIntl.Segmentervà driver mã hóa độ dài chuỗi%c. Một lệnhconsole.logcho mỗi frame có thay đổi và không có lệnh nào khi nhàn rỗi.@textjs/react: reconciler React 19, component PascalCase (Box,Text,ScrollBox,Input,Textarea,Select,Tabs,Code,Markdown,Diff,Modal,Spinnervà nhiều component khác), tiện íchclassNamekiểu Tailwind ở cấp ô, theme và DOMFocusPad.textjs: App Router dựa trên hệ thống tệp (layout,page,loading,error,not-found, phân đoạn động, route handler),text dev,text build,text startvà trình kiểm tra[▼]trong console.create-text-appvới các mẫustartervàdashboard.