Công bố TypeScript 7.0
(devblogs.microsoft.com)- TypeScript 7.0 là bản phát hành đã chuyển toolchain sang mã native dựa trên Go, mang lại tốc độ nhanh hơn 8~12 lần trong các lần build toàn bộ của dự án lớn
tscmới vẫn được cài qua góitypescripttrên npm như trước, còn hỗ trợ cho trình soạn thảo hoạt động qua language server dựa trên LSP trên VS Code, Visual Studio, WebStorm và các công cụ khác- Thời gian build đã giảm mạnh trên các codebase như
vscode,sentry,bluesky,playwright,tldraw, và trong một số môi trường, tổng mức dùng bộ nhớ cũng giảm xuống - TypeScript 7.0 hiện vẫn chưa có API lập trình ổn định, nên các công cụ nhúng TypeScript như
typescript-eslint, Vue, MDX, Astro, Svelte, kiểm tra kiểu template của Angular cần chạy song song với TypeScript 6.0 - Có các giá trị mặc định mới và tùy chọn đã bị loại bỏ, nên việc áp dụng trước các thay đổi của TypeScript 6.0 sẽ giúp quá trình chuyển đổi thuận lợi hơn; TypeScript 7.1 dự kiến sẽ cung cấp API mới
TypeScript native dựa trên Go
- TypeScript 7.0 là bản port native của toolchain TypeScript, sử dụng codebase mới được viết bằng Go
- Việc port được thực hiện theo hướng giữ tối đa cấu trúc và logic của codebase hiện có để đảm bảo tính nhất quán của kết quả và khả năng tương thích giữa hai compiler
- Codebase mới cho kết quả nhanh hơn khoảng 8~12 lần trong các lần build toàn bộ nhờ tốc độ của mã native, đa luồng dựa trên bộ nhớ dùng chung và nhiều tối ưu hóa khác
- Việc cài đặt vẫn có thể thực hiện qua npm như trước
npm install -D typescript
- Sau khi cài đặt, có thể dùng file thực thi
tscmới trong workspace và chạy bằngnpx tsc
Rút ngắn vòng phản hồi khi phát triển
- TypeScript tham gia vào nhiều giai đoạn trong quá trình phát triển như tải trình soạn thảo, tìm tất cả tham chiếu, tự động hoàn thành, chẩn đoán,
tsc, chế độ--watchvà hơn thế nữa - TypeScript 7 giảm thời gian chờ trong toàn bộ quá trình này, giúp vòng phản hồi ngắn hơn
- Trên codebase của VS Code, thời gian từ lúc mở file có lỗi đến khi lỗi đầu tiên xuất hiện đã giảm từ khoảng 17.5 giây xuống còn dưới 1.3 giây, nhanh hơn hơn 13 lần
- Hỗ trợ trình soạn thảo dựa trên LSP, và language server mới tận dụng đa luồng để xử lý nhanh các yêu cầu đồng thời
- Người dùng VS Code có thể cài tiện ích mở rộng dành riêng cho TypeScript 7, và trong vài tuần tới, bản thân VS Code cũng dự kiến sẽ tích hợp hỗ trợ TypeScript 7
- Phiên bản mới nhất của Visual Studio sẽ tự động kích hoạt TypeScript 7 tùy theo workspace
Hiệu năng build và kết quả bộ nhớ
- Thời gian build toàn bộ khi so sánh TypeScript 6 và 7 trên các codebase mã nguồn mở lớn như sau
| Codebase | TypeScript 6 | TypeScript 7 | Mức tăng tốc |
|---|---|---|---|
| vscode | 125.7 giây | 10.6 giây | 11.9 lần |
| sentry | 139.8 giây | 15.7 giây | 8.9 lần |
| bluesky | 24.3 giây | 2.8 giây | 8.7 lần |
| playwright | 12.8 giây | 1.47 giây | 8.7 lần |
| tldraw | 11.2 giây | 1.46 giây | 7.7 lần |
- Trong cùng các lần build đó, TypeScript 7 nhìn chung cũng có tổng mức dùng bộ nhớ thấp hơn
| Codebase | TypeScript 6 | TypeScript 7 | Thay đổi bộ nhớ |
|---|---|---|---|
| vscode | 5.2GB | 4.2GB | -18% |
| sentry | 4.9GB | 4.6GB | -6% |
| bluesky | 1.8GB | 1.3GB | -26% |
| playwright | 1.0GB | 0.9GB | -11% |
| tldraw | 0.6GB | 0.5GB | -15% |
Kiểm chứng trên codebase thực tế và phản hồi từ các nhóm
- Dự án TypeScript chạy hàng chục nghìn bài kiểm thử được tích lũy suốt hơn 10 năm trên mọi commit của nhánh
main - Ngoài các bài kiểm thử này, TypeScript 7 còn được kiểm chứng trên codebase thực tế của các nhóm lớn cả nội bộ lẫn bên ngoài
- Trong nội bộ Microsoft, các nhóm Loop, Office, PowerBI, Teams, Xbox đã kiểm chứng TypeScript 7
- Bên ngoài, Bloomberg, Canva, Figma, Google, Lattice, Linear, Miro, Notion, Sentry, Slack, Vanta, Vercel, VoidZero và nhiều đơn vị khác đã thử nghiệm trên codebase của họ và gửi phản hồi
- Language server mới giảm hơn 80% số lệnh language server thất bại và giảm hơn 60% số lần server bị crash so với TypeScript 6.0
- Phản hồi thực tế từ các nhóm bao gồm các trường hợp sau
- Slack cho biết thời gian merge queue đã giảm 40% với TypeScript 7, và thời gian kiểm tra kiểu trong CI giảm từ khoảng 7.5 phút xuống 1.25 phút
- Vanta ghi nhận mức tăng tốc build lên đến 9 lần trên một trong các dự án lớn của họ
- Nhóm Microsoft News Services tiết kiệm 400 giờ chờ build CI mỗi tháng
- Canva cho biết thời gian để lỗi đầu tiên xuất hiện trong trình soạn thảo đã giảm từ khoảng 58 giây xuống 4.8 giây
Chạy song song với TypeScript 6.0
- TypeScript 7.0 hiện chưa bao gồm API
- TypeScript 7.1 dự kiến sẽ cung cấp một API mới và khác biệt
- Trước thời điểm đó, có thể chạy song song TypeScript 6.0 và 7.0 cho các công cụ cần truy cập lập trình vào compiler
- Gói tương thích mới
@typescript/typescript6cung cấp file thực thitsc6và tái xuất API của TypeScript 6.0 - Với các công cụ như
typescript-eslinttrực tiếp importtypescriptdưới dạng peer dependency, npm alias được khuyến nghị
npm install -D typescript@npm:@typescript/typescript6
- Để dùng đồng thời API của TypeScript 6 và
tsccủa TypeScript 7, có thể đặt alias như sau
{
"devDependencies": {
"@typescript/native": "npm:typescript@^7.0.2",
"typescript": "npm:@typescript/typescript6@^6.0.2"
}
}
- Gói
@typescript/native-previewtrước đây đã cung cấp các bản build nightly của codebase mới trong TypeScript 7, và từng đạt hơn 8.5 triệu lượt tải mỗi tuần - Trong thời gian tới, các bản build nightly sẽ được tiếp tục cung cấp qua thẻ
nextcủa góitypescripttiêu chuẩn
npm install -D typescript@next
Tùy chọn kiểm soát song song hóa
-
TypeScript 7.0 chạy song song nhiều giai đoạn như parsing, kiểm tra kiểu và emit
-
Parsing và emit dễ chạy độc lập theo từng file, nên có thể mở rộng trên codebase lớn với chi phí overhead tương đối thấp
-
Các cờ thử nghiệm mới
--checkers,--builders,--singleThreadeddùng để điều chỉnh hành vi song song hóa -
--checkers- TypeScript 7.0 tạo ra một số lượng cố định worker kiểm tra kiểu, và luôn chia công việc theo cùng một cách trên cùng tập tin đầu vào để cho ra kết quả nhất quán
- Số worker kiểm tra kiểu mặc định là 4, và có thể điều chỉnh bằng
--checkers - Kết quả trên cùng một máy khi dùng
--checkers 8như sau
Codebase TypeScript 6 TypeScript 7 --checkers 8Mức tăng tốc vscode 125.7 giây 7.51 giây 16.7 lần sentry 139.8 giây 12.08 giây 11.6 lần bluesky 24.3 giây 2.01 giây 12.1 lần playwright 12.8 giây 1.16 giây 11 lần tldraw 11.2 giây 1.06 giây 10.6 lần -
Tăng
--checkerscó thể giúp tăng tốc build bằng cách tận dụng nhiều lõi CPU hơn, nhưng thường đi kèm mức sử dụng bộ nhớ tăng lên- Trên các CI runner có ít lõi CPU và ít bộ nhớ, có thể giảm giá trị này để tránh overhead không cần thiết
--checkers 1về cơ bản biến việc kiểm tra kiểu thành đơn luồng và loại bỏ công việc trùng lặp- Trong một số trường hợp hiếm, việc thay đổi số lượng
--checkerscó thể làm lộ ra kết quả phụ thuộc thứ tự, vì vậy việc chỉ định số checker cố định trên toàn bộ môi trường build có thể hữu ích
-
--builders--builderskiểm soát số lượng project reference builder có thể chạy đồng thời khi thực thi--build- Điều này có thể đặc biệt hữu ích trong các monorepo có nhiều project
- Tăng giá trị có thể giúp build nhanh hơn nhưng cũng có thể làm tăng mức sử dụng bộ nhớ
- Có hiệu ứng nhân với
--checkers, nên--checkers 4 --builders 4có thể khiến tối đa 16 trình kiểm tra kiểu chạy đồng thời - Khác với
--checkers, thay đổi số lượng--builderskhông nên tạo ra kết quả khác - Build project reference về cơ bản bị giới hạn bởi đồ thị phụ thuộc của project
-
--singleThreaded--singleThreadedkhiến toàn bộ compiler chạy trên một luồng duy nhất- Có thể hữu ích khi debug, so sánh hiệu năng giữa TypeScript 6 và 7, điều phối build song song từ bên ngoài, hoặc trong môi trường có tài nguyên rất hạn chế
- Cờ này không chỉ giới hạn số lượng worker kiểm tra kiểu ở mức 1 mà còn khiến việc parse và emit cũng được thực hiện trên một luồng duy nhất
Chế độ --watch mới
- TypeScript 7 đã làm lại hoàn toàn chế độ
--watch --watchmới cung cấp khả năng theo dõi tệp đa nền tảng hiệu quả và ổn định dựa trên file-watcher của Parcel bundler- Thư viện chuẩn Go không có API theo dõi tệp tích hợp sẵn, và các thư viện bên thứ ba đã được xem xét đều có vấn đề về độ ổn định, hiệu năng, hỗ trợ đa nền tảng và tích hợp công cụ build
- Cách tiếp cận polling thuần túy hoạt động trên nhiều hệ điều hành, nhưng chi phí tính toán cao đối với các project lớn có nhiều phụ thuộc
node_modules - Nhóm TypeScript đã port
@parcel/watcher, vốn đã được dùng trong VS Code, sang Go và sử dụng shim assembly tối thiểu để tránh phụ thuộc vào toolchain C++ - Watcher này là một package độc lập và mang lại cải thiện về mức sử dụng tài nguyên trên nhiều nền tảng trong chế độ
--watchcủa TypeScript 7
Thay đổi về mặc định và tương thích trong TypeScript 6.0
- TypeScript 7.0 được xây dựng để tương thích với hành vi kiểm tra kiểu và dòng lệnh của TypeScript 6.0
- Mã biên dịch sạch bằng TypeScript 6.0 khi bật cờ
stableTypeOrderingvà không đặtignoreDeprecationsthì cũng phải biên dịch y như vậy trong TypeScript 7.0 - TypeScript 7.0 áp dụng các giá trị mặc định mới của TypeScript 6.0, và sẽ phát sinh hard error đối với các cờ và cú pháp đã bị deprecated trong TypeScript 6.0
- Những thay đổi chính về giá trị mặc định cấu hình như sau
- Giá trị mặc định của
strictlàtrue - Giá trị mặc định của
modulelàesnext - Giá trị mặc định của
targetlà phiên bản ECMAScript ổn định hiện tại ngay trướcesnext - Giá trị mặc định của
noUncheckedSideEffectImportslàtrue - Giá trị mặc định của
libReplacementlàfalse - Giá trị mặc định của
stableTypeOrderinglàtruevà không thể tắt - Giá trị mặc định của
rootDirlà./ - Giá trị mặc định của
typeslà[], và có thể khôi phục hành vi trước đây bằng["*"]
- Giá trị mặc định của
- Thay đổi ở
rootDirvàtypesđược xem là những thay đổi có thể gây bất ngờ nhất- Các project có
tsconfig.jsonnằm ngoài thư mục mã nguồn nhưsrccần chỉ định rõrootDirđể giữ nguyên cấu trúc thư mục hiện có - Các project phụ thuộc vào một số khai báo global cụ thể cần ghi rõ các package
@typescần thiết trongtypes
- Các project có
{
"compilerOptions": {
"rootDir": "./src"
},
"include": ["./src"]
}
{
"compilerOptions": {
"types": ["node", "jest"]
}
}
Hành vi đã bị loại bỏ hoặc trở thành hard error
- Trong TypeScript 7.0, nhiều tùy chọn và cú pháp đã bị deprecated trong TypeScript 6.0 không còn được hỗ trợ nữa
- Các mục chính gồm có
- Không hỗ trợ
target: es5 - Không hỗ trợ
downlevelIteration - Không hỗ trợ
moduleResolution: node/node10, khuyến nghị dùngnodenextvàbundler - Không hỗ trợ
module: amd, umd, systemjs, none, khuyến nghị dùngesnexthoặcpreservecùng với bundler hoặc cơ chế phân giải module dựa trên trình duyệt - Không hỗ trợ
baseUrl, và có thể cập nhậtpathsbằng đường dẫn tương đối theo gốc project thay chobaseUrl - Không hỗ trợ
moduleResolution: classic, khuyến nghị dùngbundlerhoặcnodenext - Không thể đặt
esModuleInteropvàallowSyntheticDefaultImportsthànhfalse alwaysStrictđược xem nhưtruevà không thể đặt thànhfalse- Không thể dùng từ khóa
moduletrong khai báo namespace - Không thể dùng từ khóa
assertstrong import, cần dùngwithđể phù hợp với thay đổi cú pháp import attribute của ECMAScript - Chỉ thị
/// <reference no-default-lib />không còn được tôn trọng dướiskipDefaultLibCheck - Nếu thư mục hiện tại có
tsconfig.json, build bằng dòng lệnh sẽ không thể nhận đường dẫn tệp và cần chỉ định rõ--ignoreConfig
- Không hỗ trợ
Thay đổi về template literal type và hỗ trợ JavaScript
- TypeScript 7.0 xử lý Unicode code point tự nhiên hơn trong suy luận template literal type
type HeadTail<S> = S extends `${infer Head}${infer Tail}` ? [Head, Tail] : never;
type Result = HeadTail<"😀abc">;
// 7.0: ["😀", "abc"]
// trước đây: ["\ud83d", "\ude00abc"]
- Trước đây, theo hành vi indexing UTF-16 của JavaScript,
"😀"bị tách thành hai phần của surrogate pair - Hành vi mới phù hợp hơn với trực giác coi
"😀"là một đơn vị, giống nhưfor...ofhay[...str] - Điều này có thể là breaking change đối với các thao tác chuỗi ở cấp kiểu vốn cố ý mô hình hóa UTF-16 code unit
- Hỗ trợ JavaScript cũng được làm lại để nhất quán hơn với cách phân tích tệp TypeScript
- Không thể dùng value ở vị trí type, và phải dùng
typeof someValue @enumkhông còn được xử lý đặc biệt- Không thể dùng dấu
?đơn lẻ làm type, cần dùngany @classkhông biến function thành constructor, cần dùng khai báoclass- Không hỗ trợ postfix
! - Tên type phải được định nghĩa bên trong thẻ
@typedef - Không còn hỗ trợ cú pháp hàm kiểu Closure, cần dùng cú pháp rút gọn của TypeScript
- Không thể dùng value ở vị trí type, và phải dùng
- Một số mẫu JavaScript như aliasing
thisvà gán lại toàn bộprototypecủa function cũng không còn được xử lý đặc biệt nữa - Khác biệt giữa TypeScript 6.0 và 7.0 được tổng hợp chi tiết hơn trong
CHANGES.md
Tính năng và giới hạn của trình soạn thảo
- TypeScript 7.0 bổ sung nhiều tính năng trình soạn thảo đã bị thiếu kể từ bản beta
- Bao gồm tự động import, hover mở rộng được, inlay hint, code lens, go-to-source-definition, JSX linked editing, tag completion, v.v.
- Các tính năng bị thiếu trong bản beta của TypeScript 7.0 như semantic highlighting, “sort imports”, “remove unused imports”, v.v. cũng đã được đưa vào
- Để nâng cao chất lượng language server, nhóm đã tái xây dựng hạ tầng kiểm thử và chẩn đoán, đồng thời có thể thực hiện fuzz test trên các codebase TypeScript·JavaScript lớn trên GitHub
Các hạn chế hiện tại của quy trình làm việc ngôn ngữ tích hợp
- Các workflow sử dụng Vue, MDX, Astro, Svelte, v.v. nhiều khả năng vẫn chưa thể tận dụng TypeScript 7
- Các kiểu kiểm tra type cho template đặc thù như template Angular cũng nhiều khả năng chưa thể dùng TypeScript 7
- Lý do chính là TypeScript 7 vẫn chưa cung cấp API lập trình ổn định
- Các công cụ nhúng TypeScript vào compiler và language service riêng của mình như Volar hiện vẫn buộc phải phụ thuộc vào TypeScript 6.0
- Nhóm TypeScript xem đây là hạn chế mang tính thời điểm và có kế hoạch phối hợp với các maintainer của những dự án đó để đảm bảo hỗ trợ TypeScript 7
- Trước thời điểm đó, nhóm khuyến nghị dùng TypeScript 7 trong những kịch bản không cần language server plugin
- Các dự án Angular có thể dùng
tsccủa TypeScript 7 trong CLI để phát hiện lỗi toàn dự án nhanh hơn, đồng thời tiếp tục dùng TypeScript 6.0 cho hỗ trợ trong trình soạn thảo - Vue, MDX, Astro, Svelte, v.v. sẽ vẫn cần tiếp tục dùng TypeScript 6.0 trong thời gian tới
- Trong VS Code, có thể quay lại TypeScript 6.0 bằng lệnh “Disable TypeScript 7 Language Server”
Kế hoạch sắp tới
- Việc phát hành TypeScript 7.0 là một cột mốc quan trọng của bản native port mà dự án TypeScript đã tập trung phát triển suốt hơn 1 năm
- Sau 7.0, nhóm dự kiến quay lại phát triển tính năng mới, cải thiện khả năng sử dụng, tối ưu hiệu năng thêm nữa và triển khai API mới cho hệ sinh thái
- Tương tự giai đoạn trước TypeScript 7.0, dự kiến sẽ phát hành bản tính năng mới mỗi 3~4 tháng
- TypeScript 7.1 được lên kế hoạch để lấp đầy các khoảng trống và cung cấp API mới nhằm hỗ trợ cộng đồng chuyển đổi
2 bình luận
Ý kiến trên Hacker News
Theo benchmark nội bộ, mức cải thiện tốc độ của TypeScript 7 như sau
Thật ấn tượng khi nhóm vừa migrate một cách có trách nhiệm vừa đạt được kết quả như vậy. Mong Bun nhìn vào mà học hỏi. Điều tôi tò mò là việc này sẽ ảnh hưởng thế nào đến các công cụ tầng dưới cần build codebase TypeScript như tsdown hay esbuild, và liệu có thể dùng TS 7 cùng với tsdown hiện tại không
--isolatedDeclarationshay không; nếu không thì cứ cài song song TypeScript 6 như hướng dẫn trong bài blogTrước đây từng có thời người ta tranh luận rằng type không đáng với công sức bỏ ra. Điều hay nhất của TypeScript trước hết là nó đã đại chúng hóa type
Ví dụ tôi từng nghe nhiều lần những câu kiểu “Python không dùng được vì không có type”, nhưng nói vậy là vô lý. Python là ngôn ngữ strong typed, đồng thời chỉ là ngôn ngữ dynamically typed mà thôi.
Cũng có những ngôn ngữ thật sự không có type, hoặc thường được gọi là “stringly typed”. AREXX mà tôi từng nghịch hồi nhỏ thì mọi giá trị đều là chuỗi dù trông giống số, và hầu hết công cụ Unix CLI như sed cũng có thể xem là như vậy. Nhưng phần lớn tranh luận về type xoay quanh các ngôn ngữ dynamic typed như Python, và tôi hầu như chưa thấy ai nói rằng ngôn ngữ weak typed hoặc không có type là tốt cho dự án lớn. Ngược lại, tôi nghe nhiều người gọi nhầm Python là “không có type” rồi nói không thể dùng cho dự án lớn, điều này khá khó hiểu với tôi khi thực tế tôi đang xây các dự án lớn bằng Python
Trước đây, phần lớn trải nghiệm với type là C++/Java, đặc biệt C++ thì khó mà là ví dụ tốt cho thứ gì ngoài cách tạo ra một ngôn ngữ quá phức tạp. Một khi thấy type được áp dụng tốt, việc thuyết phục sẽ dễ hơn nhiều
Điều thật sự ấn tượng ở đây là một đội ngũ tuyệt vời đã đồng thời duy trì hai codebase riêng biệt cho type system tiên tiến nhất mà nhân loại biết đến. Cũng rất mong bản viết lại bằng Rust
Rust sẽ tốn thời gian phát triển lâu hơn nhiều. Rust có thể nhanh hơn Go 20%, nhưng mức cải thiện từ TypeScript sang Go đã đủ lớn rồi. Với vscode, có thể Rust cho 14x thay vì 11x của Go, nhưng chỉ Go thôi cũng đã đủ tạo ra khác biệt rất lớn
Tôi không có ý hạ thấp type system của TypeScript; thực tế đây là một công trình rất thú vị
Sau vài năm dùng TypeScript, việc phải tự thêm type annotation trong Python và lôi các tính năng ngôn ngữ cơ bản như
abcvào trở nên thật sự phiền phứcThú vị đấy, nhưng giờ Node đã native strip type annotation của TypeScript nên tôi hầu như không chạy TSC nữa. Tôi chỉ chạy khi cần xem output tĩnh của compiler để kiểm tra những phần tạo ra breaking change lớn mà chưa cập nhật kịp
Cả code frontend chạy trên browser cũng dựa vào cơ chế strip type của Node
Thật vui khi cú pháp type của JSDoc tiếp tục được quan tâm. Đây là cách tôi thích nhất để dùng TypeScript trong các dự án cá nhân. Một số thay đổi cú pháp có thể sẽ hơi phiền khi cập nhật, nhưng phần lớn có vẻ là theo hướng tốt hơn
[1] https://learn.microsoft.com/en-us/dotnet/csharp/language-ref...
Nỗi đau lớn của TypeScript là khó điều chỉnh phạm vi cấu hình tsconfig như
libvàtypescho một phần của dự ánDự án là web app, nhưng vì
vite.config.ts, Playwright và unit test nên phía công cụ IDE lại có type của Node lọt vào. Ngay cả khi thêm Node API vào component React thìtsccũng không phàn nàn.Hiện tại, để cô lập thư viện DOM và thư viện Node, cần một mớ spaghetti project references, rất nhiều file
tsconfig.jsonvà file đầu ratsbuildinfo; việc dùng project references mà vẫn tránh xuất type cũng rất phiềnNgay cả với ứng dụng đơn lẻ, tôi cũng thích dùng nx, và chuyển mã dùng chung sang “library”. Tôi dùng các library không build, và với dự án lớn thì khá ổn
Hiện vẫn chưa có TypeScript compiler API, nhưng nghe nói đang được làm nên rất đáng mong đợi
Nhìn vào biểu đồ cho thấy mức dùng bộ nhớ giảm và hiệu năng tăng mạnh, tôi lại nghĩ có lẽ phía server nên dùng Go thay vì TypeScript
Và tôi cũng không rõ vì sao ngày nay vẫn có người bắt đầu dự án mới bằng TS/JS/Python trong khi đã có các lựa chọn khác
Chúc mừng đội ngũ TypeScript. Tôi có nhiều điều muốn viết thành bài dài hoặc nói qua audio, nhưng nói ngắn gọn thì hệ sinh thái JavaScript/TypeScript khá giống làm việc với gỗ
Bạn có thể làm ra đồ kiểu Ikea, bằng gỗ ván ép laminate rẻ tiền. Nếu ví với code thì đó sẽ là một ứng dụng vibe coding không có gì độc đáo.
Ngược lại, cũng có thể làm đồ nội thất thủ công cao cấp hoặc nhà cao tầng bằng gỗ. Kiểu như dùng gỗ non rồi bằng kỹ thuật ghép nối tùy chỉnh và ép lớp để tạo ra dầm chịu lửa. Trong hệ sinh thái JavaScript/TypeScript cũng có thể dùng AI như một máy công cụ mạnh mẽ, nhưng vẫn tạo ra kết quả cao cấp với tinh thần thủ công. Nếu có can đảm tạo ra thứ gì đó và chạy nó, thì cứ đón nhận hệ sinh thái TypeScript/JavaScript
Các ý kiến trên Lobste.rs
Tôi hiểu lý do, nhưng việc chuyển từ compiler tự host sang một compiler không tự host khá thú vị
Vì thông thường hầu như luôn đi theo hướng ngược lại, nên đây là một xu hướng hiếm thấy
Tự host tạo áp lực mạnh khiến ngôn ngữ tiến hóa theo hướng trở thành một ngôn ngữ viết compiler tốt hơn, nhưng điều đó không phải lúc nào cũng là hướng đúng
Dù không code bằng TypeScript, bản thân VSCode được viết bằng TypeScript, nên tôi tò mò liệu cải tiến này có ảnh hưởng đến tốc độ VSCode không
Hay nó chỉ ảnh hưởng đến extension ngôn ngữ TypeScript
Thứ nhanh hơn ở đây chỉ là compiler nhận mã TypeScript và chuyển thành JavaScript; quá trình này diễn ra trong pipeline build trước khi Microsoft phân phối file thực thi VSCode
Ngoại lệ tiềm năng có thể là server LSP TypeScript cũng nhanh hơn, vì nó thực sự parse mã TypeScript trong lúc chạy. Tuy nhiên, điều này tách biệt với việc VSCode được viết bằng TypeScript
tsccó nguyên tắc là không nên động vào mã đang xử lý ngoài mức tối thiểu như loại bỏ kiểu, nên có khá nhiều thứ bị đánh dấu WONTFIXVì vậy tôi dự đoán đặc tính hiệu năng của các công cụ làm bằng TypeScript gần như sẽ không thay đổi
Đây là một mẹo nhỏ cá nhân tôi rút ra. Dự án hiện tại tôi phụ trách dùng TS 5, nhưng đúng như dự đoán, tôi không muốn dùng nó trong nvim
Vì vậy trước tiên tôi cài TS 7 bằng mise, rồi tạo một symlink
tsgotrongnode_modules/.bintrỏ tới TS được cài bằng miseVì nvim-lspconfig vẫn dùng tên file
tsgocũ từ thời technical preview, nên nvim sẽ chạy TS 7 đã cài thay vì TS cục bộ