TypeScript 7 và Project Corsa: Compiler viết lại bằng Go, nhanh gấp 10 lần
Posted on: 4/27/2026 3:17:01 PM
Bạn đã bao giờ chờ 78 giây mỗi lần build một dự án TypeScript lớn? Hay editor lag vài giây mỗi lần gợi ý code? Đó là thực tế mà hàng triệu developer đối mặt hàng ngày với trình biên dịch tsc viết bằng JavaScript. TypeScript 7.0 — tên mã Project Corsa — thay đổi hoàn toàn cuộc chơi: compiler được viết lại bằng Go, nhanh gấp 10 lần, bộ nhớ giảm một nửa, và hỗ trợ parallelism thực sự.
1. Tại sao viết lại bằng Go?
TypeScript compiler (tsc) ban đầu được viết bằng chính TypeScript — một quyết định hợp lý vào năm 2012 khi dự án còn nhỏ. Tuy nhiên sau 12 năm, với codebase ngày càng phức tạp và dự án người dùng ngày càng lớn, JavaScript/Node.js bộc lộ hai điểm nghẽn nghiêm trọng:
- Single-threaded: Node.js chạy trên event loop đơn luồng. Worker threads tồn tại nhưng không chia sẻ bộ nhớ hiệu quả — mỗi worker phải serialize/deserialize dữ liệu qua
postMessage, tạo overhead khổng lồ cho cấu trúc phức tạp như AST và type graph. - Garbage collection overhead: V8 GC xử lý tốt web request ngắn, nhưng với compiler giữ hàng triệu node AST trong bộ nhớ suốt quá trình biên dịch, GC pause trở thành bottleneck.
Microsoft đã cân nhắc nhiều ngôn ngữ thay thế. Đây là lý do Go thắng cuộc:
| Tiêu chí | Go | Rust | C++ |
|---|---|---|---|
| Pattern matching với codebase TS gốc | Rất cao — struct, interface, error handling tương đồng | Trung bình — ownership model khác biệt | Thấp — memory management phức tạp |
| Garbage collection | GC tự động, phù hợp cấu trúc liên kết phức tạp (AST, type graph, symbol table) | Không GC — phải tự quản lý lifetime | Không GC — manual memory |
| Concurrency | Goroutines — lightweight, shared memory | Threads + async — mạnh nhưng phức tạp | Threads — cần sync primitives |
| Tốc độ dịch file-by-file | Nhanh — structural translation 1:1 | Chậm — cần redesign ownership | Chậm — cần redesign memory |
File-by-file translation
Thay vì viết lại từ đầu, đội ngũ TypeScript dịch từng file một từ TS sang Go, giữ nguyên cấu trúc logic. Điều này đảm bảo hành vi nhất quán và dễ so sánh khi có bug — mỗi file Go tương ứng trực tiếp với file TS gốc.
2. Kiến trúc compiler mới
Compiler mới (tên nội bộ tsgo, sẽ đổi thành tsc khi stable) giữ nguyên pipeline cơ bản nhưng khai thác parallelism ở mọi giai đoạn có thể:
graph LR
subgraph "Source Files"
F1["file1.ts"]
F2["file2.ts"]
F3["file3.ts"]
FN["...fileN.ts"]
end
subgraph "Parallel Parsing"
P1["Parser
Goroutine 1"]
P2["Parser
Goroutine 2"]
P3["Parser
Goroutine N"]
end
subgraph "Type Checking (Worker Pool)"
TC1["Checker 1
Files 1..K"]
TC2["Checker 2
Files K+1..2K"]
TC3["Checker N
Files 2K+1..3K"]
end
subgraph "Parallel Emit"
E1["Emit JS 1"]
E2["Emit JS 2"]
E3["Emit JS N"]
end
F1 --> P1
F2 --> P2
F3 --> P3
FN --> P3
P1 --> TC1
P2 --> TC2
P3 --> TC3
TC1 --> E1
TC2 --> E2
TC3 --> E3
style P1 fill:#e94560,stroke:#fff,color:#fff
style P2 fill:#e94560,stroke:#fff,color:#fff
style P3 fill:#e94560,stroke:#fff,color:#fff
style TC1 fill:#2c3e50,stroke:#fff,color:#fff
style TC2 fill:#2c3e50,stroke:#fff,color:#fff
style TC3 fill:#2c3e50,stroke:#fff,color:#fff
style E1 fill:#4CAF50,stroke:#fff,color:#fff
style E2 fill:#4CAF50,stroke:#fff,color:#fff
style E3 fill:#4CAF50,stroke:#fff,color:#fff
Pipeline biên dịch của tsgo — parsing và emit chạy song song hoàn toàn, type checking dùng worker pool
2.1 Parallel Parsing
Mỗi source file được parse độc lập trong một goroutine riêng. Vì parsing không phụ thuộc vào type information từ file khác, đây là bước dễ parallelize nhất. Kết quả là AST được tạo ra đồng thời cho tất cả file.
2.2 Deterministic Type Checking
Type checking là giai đoạn phức tạp nhất — các type có thể tham chiếu chéo giữa file. tsgo giải quyết bằng deterministic worker pool: file được phân chia cố định cho từng worker (không dynamic scheduling), đảm bảo kết quả luôn giống nhau bất kể chạy bao nhiêu lần.
# Cấu hình số type-checker workers
npx tsgo --checkers 4 # Mặc định: 4 workers
npx tsgo --checkers 8 # Tăng cho máy nhiều CPU
npx tsgo --singleThreaded # Debug mode — 1 thread, deterministic
npx tsgo --builders 2 # Song song giữa các project trong monorepo
2.3 Parallel Emit
Giai đoạn cuối — sinh file .js và .d.ts — cũng chạy song song. Mỗi file được emit độc lập trong goroutine riêng.
Nguồn gốc tốc độ 10x
Khoảng 50% tốc độ đến từ việc Go là ngôn ngữ compiled, native execution nhanh hơn V8 JIT. 50% còn lại đến từ parallelism thực sự qua goroutines với shared memory — điều mà Node.js worker threads không thể đạt được hiệu quả tương đương.
3. Benchmark thực tế
Microsoft công bố benchmark trên các dự án open-source lớn, chạy trên cùng phần cứng:
| Dự án | Số dòng code | tsc (TS 6.0) | tsgo (TS 7.0) | Speedup |
|---|---|---|---|---|
| VS Code | ~1.5M LOC | 78s | 7.5s | 10.4x |
| Sentry | ~800K LOC | 133s | 16s | 8.3x |
| Playwright | ~200K LOC | 11s | 1.1s | 10x |
| TypeORM | ~80K LOC | 4s | 0.3s | 13.3x |
Ngoài tốc độ build, editor experience cũng cải thiện vượt bậc:
4. Breaking changes quan trọng
TypeScript 7 không chỉ nhanh hơn — nó cũng mạnh tay dọn dẹp technical debt. Đây là những thay đổi cần lưu ý:
4.1 Defaults mới
| Option | TS 6 (mặc định cũ) | TS 7 (mặc định mới) |
|---|---|---|
strict | false (tùy chọn) | true |
module | "commonjs" | "esnext" |
types | Auto-include @types/* | [] (phải khai báo) |
noUncheckedSideEffectImports | false | true |
esModuleInterop | Tùy chọn | Luôn bật, không tắt được |
4.2 Tính năng bị loại bỏ hoàn toàn
target: "es5"— Không còn hỗ trợ emit ES5. Tối thiểu là ES2018+.--outFile— Concatenation-based bundling bị xóa. Dùng bundler (Vite, Webpack, esbuild).moduleResolution: "node"— Phải chuyển sang"nodenext"hoặc"bundler".- Legacy module systems: AMD, UMD, SystemJS không còn được hỗ trợ.
- Custom transformers / compiler plugins: API chưa ổn định, dự kiến TypeScript 7.1.
Cẩn thận với @types auto-inclusion
TS 7 mặc định types: [] — nghĩa là @types/node, @types/jest, v.v. sẽ không tự động được include. Bạn phải khai báo rõ trong tsconfig.json: "types": ["node", "jest"]. Nếu không, sẽ thấy lỗi "Cannot find name 'process'" hoặc tương tự.
5. Cài đặt và thử nghiệm
Bạn có thể thử tsgo ngay hôm nay mà không ảnh hưởng dự án hiện tại:
# Cài đặt native preview
npm install -D @typescript/native-preview@beta
# Chạy type-check (không emit) — an toàn nhất để test
npx tsgo --noEmit
# Chạy với tsconfig cụ thể
npx tsgo --project ./src/tsconfig.json
# So sánh thời gian với tsc hiện tại
time npx tsc --noEmit
time npx tsgo --noEmit
Trong VS Code, cài extension "TypeScript Native Preview" từ Marketplace, sau đó chạy command:
TypeScript Native Preview: Enable (Experimental)
6. Chiến lược migration từ TS 5/6 lên TS 7
Đừng nhảy thẳng lên TS 7 — hãy migration theo lộ trình an toàn:
graph TD
A["Bước 1: Nâng lên TS 6.0
(bridge release)"] --> B["Bước 2: Thêm CI job
tsgo --noEmit (non-blocking)"]
B --> C["Bước 3: Fix warnings
và deprecation"]
C --> D["Bước 4: Chuyển CI
sang blocking tsgo"]
D --> E["Bước 5: Audit tooling
eslint, bundler, test"]
E --> F["Bước 6: TS 7 stable
Thay thế tsc hoàn toàn"]
style A fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style B fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style C fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style D fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style E fill:#f8f9fa,stroke:#e94560,color:#2c3e50
style F fill:#e94560,stroke:#fff,color:#fff
Lộ trình migration an toàn — TS 6 là bridge release giúp phát hiện breaking changes sớm
Bước 1: Nâng lên TypeScript 6.0
TS 6 là bridge release — nó cảnh báo tất cả các tính năng sẽ bị loại bỏ trong TS 7 nhưng chưa thực sự xóa. Đây là bước quan trọng nhất để phát hiện vấn đề sớm.
Bước 2-3: Thêm CI job non-blocking
Thêm job tsgo --noEmit vào CI pipeline nhưng không block merge. Thu thập danh sách lỗi, fix dần. Khi lỗi về 0 thì chuyển sang blocking.
Bước 4-5: Audit tooling
Kiểm tra các dependency:
- Bundlers (Vite, Webpack, esbuild, Rollup): Hầu như không ảnh hưởng — chúng dùng parser riêng.
- typescript-eslint: Cần alias
typescript@npm:@typescript/typescript6tạm thời cho đến khi hỗ trợ chính thức. - Biome v2: Thay thế ESLint không phụ thuộc TypeScript — lựa chọn tốt để tránh vấn đề tương thích.
7. Tính năng editor hiện có và sắp tới
Tại thời điểm Beta (tháng 4/2026), tsgo hỗ trợ các tính năng editor sau:
| Tính năng | Trạng thái | Ghi chú |
|---|---|---|
| Error diagnostics | ✓ Hoạt động | Đầy đủ |
| Hover information | ✓ Hoạt động | Type info on hover |
| Go-to-definition | ✓ Hoạt động | Nhảy đến định nghĩa |
| Completions (cơ bản) | ✓ Hoạt động | Chưa có auto-imports |
| Auto-imports | ◯ Đang phát triển | Dự kiến trước stable |
| Find all references | ◯ Đang phát triển | |
| Rename symbol | ◯ Đang phát triển | |
| Signature help | ◯ Đang phát triển | |
--build mode | ◯ Đang phát triển | Quan trọng cho monorepo |
--declaration emit | ◯ Đang phát triển | Cần cho library authors |
LSP chuẩn thay cho TSServer
tsgo sử dụng Language Server Protocol (LSP) chuẩn thay vì TSServer format riêng của TypeScript cũ. Điều này nghĩa là mọi editor hỗ trợ LSP (VS Code, Neovim, JetBrains, Helix...) đều có thể tích hợp — không còn phụ thuộc vào plugin TypeScript riêng.
8. Tác động đến hệ sinh thái
8.1 Frontend frameworks
Với Vue.js, React, Angular — compiler mới không ảnh hưởng trực tiếp đến runtime code. Tuy nhiên:
- DX cải thiện rõ rệt: Hot reload nhanh hơn, code completion phản hồi tức thì, CI pipeline build nhanh 10x.
- Monorepo benefits: Dự án Nx/Turborepo với hàng chục packages sẽ thấy cải thiện lớn nhất nhờ
--builderssong song.
8.2 Backend (.NET + TypeScript)
Trong kiến trúc full-stack với ASP.NET Core backend + TypeScript frontend:
- CI pipeline tổng thể nhanh hơn đáng kể — TypeScript build không còn là bottleneck.
- Docker multi-stage build: stage build TypeScript giảm từ phút xuống giây.
8.3 Tooling ecosystem
graph LR
subgraph "Không ảnh hưởng"
V["Vite / Rollup"]
W["Webpack"]
E["esbuild"]
SWC["SWC"]
end
subgraph "Cần cập nhật"
ESL["typescript-eslint
(alias tạm thời)"]
JB["JetBrains IDE
(plugin update)"]
end
subgraph "Thay thế tốt"
B["Biome v2
(không phụ thuộc TS)"]
end
style V fill:#4CAF50,stroke:#fff,color:#fff
style W fill:#4CAF50,stroke:#fff,color:#fff
style E fill:#4CAF50,stroke:#fff,color:#fff
style SWC fill:#4CAF50,stroke:#fff,color:#fff
style ESL fill:#ff9800,stroke:#fff,color:#fff
style JB fill:#ff9800,stroke:#fff,color:#fff
style B fill:#2c3e50,stroke:#fff,color:#fff
Mức độ ảnh hưởng của TS 7 đến các công cụ trong ecosystem
9. Timeline phát triển
@typescript/native-preview, chạy được tsgo --noEmit.--build mode, --declaration emit, full editor features. tsgo đổi tên thành tsc trong package chính.Kết luận
TypeScript 7 / Project Corsa là thay đổi lớn nhất trong lịch sử TypeScript — không phải ở cú pháp hay type system, mà ở nền tảng kỹ thuật. Compiler viết lại bằng Go mang đến tốc độ 10x và parallelism thực sự, giải quyết pain point lớn nhất mà developer TypeScript đối mặt hàng ngày.
Với 99.6% test compatibility và lộ trình migration rõ ràng qua TS 6 bridge release, bạn có thể bắt đầu thử nghiệm tsgo --noEmit ngay hôm nay mà không rủi ro. Khi stable ra mắt vào Q3/2026, đây sẽ là upgrade "miễn phí" lớn nhất cho mọi dự án TypeScript — từ startup nhỏ đến monorepo triệu dòng code.
Tham khảo:
WebTransport — Giao thức real-time thế hệ mới đã sẵn sàng trên mọi trình duyệt
Supabase — Nền tảng Backend mã nguồn mở thay thế Firebase
Disclaimer: The opinions expressed in this blog are solely my own and do not reflect the views or opinions of my employer or any affiliated organizations. The content provided is for informational and educational purposes only and should not be taken as professional advice. While I strive to provide accurate and up-to-date information, I make no warranties or guarantees about the completeness, reliability, or accuracy of the content. Readers are encouraged to verify the information and seek independent advice as needed. I disclaim any liability for decisions or actions taken based on the content of this blog.