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ự.

10x Tốc độ build nhanh hơn so với tsc cũ
50% Giảm bộ nhớ runtime khi biên dịch
99.6% Tương thích test cases hiện tại (19,926/20,000)
7.5s Build VS Code 1.5M dòng (từ 78s)

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íGoRustC++
Pattern matching với codebase TS gốcRất cao — struct, interface, error handling tương đồngTrung bình — ownership model khác biệtThấp — memory management phức tạp
Garbage collectionGC 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ý lifetimeKhông GC — manual memory
ConcurrencyGoroutines — lightweight, shared memoryThreads + async — mạnh nhưng phức tạpThreads — cần sync primitives
Tốc độ dịch file-by-fileNhanh — structural translation 1:1Chậm — cần redesign ownershipChậ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.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ự ánSố dòng codetsc (TS 6.0)tsgo (TS 7.0)Speedup
VS Code~1.5M LOC78s7.5s10.4x
Sentry~800K LOC133s16s8.3x
Playwright~200K LOC11s1.1s10x
TypeORM~80K LOC4s0.3s13.3x

Ngoài tốc độ build, editor experience cũng cải thiện vượt bậc:

1.2s VS Code khởi động TS language service (từ 9.6s)
~50% Giảm RAM khi editor đang phân tích project
<10KB Bundle base của tsgo binary

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

OptionTS 6 (mặc định cũ)TS 7 (mặc định mới)
strictfalse (tùy chọn)true
module"commonjs""esnext"
typesAuto-include @types/*[] (phải khai báo)
noUncheckedSideEffectImportsfalsetrue
esModuleInteropTùy chọnLuô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/typescript6 tạ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ăngTrạng tháiGhi chú
Error diagnostics✓ Hoạt độngĐầy đủ
Hover information✓ Hoạt độngType info on hover
Go-to-definition✓ Hoạt độngNhảy đến định nghĩa
Completions (cơ bản)✓ Hoạt độngChưa có auto-imports
Auto-imports◯ Đang phát triểnDự 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ểnQuan trọng cho monorepo
--declaration emit◯ Đang phát triểnCầ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ờ --builders song 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

Tháng 3/2025
Anders Hejlsberg công bố Project Corsa — TypeScript compiler sẽ được viết lại bằng Go. Cộng đồng phản ứng sôi nổi.
Tháng 5/2025
TypeScript Native Preview phát hành. Cài qua @typescript/native-preview, chạy được tsgo --noEmit.
Tháng 1/2026
TypeScript 7.0 phiên bản stable đầu tiên cho compiler core. JSX type-checking và JS/JSDoc support hoàn thiện.
Tháng 4/2026
TypeScript 7.0 Beta — production-ready cho CI và day-to-day workflows. Editor features (completions, go-to-def, hover) hoạt động.
Q3/2026 (dự kiến)
TypeScript 7.0 stable — --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: