- Node.js đã được cải tiến để chạy trực tiếp các tệp TypeScript
- Giờ đây có thể chạy ngay các tệp
.tsmà không cần cấu hình bổ sung hay transpile - Nhà phát triển có thể nâng cao hiệu quả làm việc mà không cần tsconfig.json hay cài thêm bundler riêng
- Tính năng này đã được chính thức tích hợp từ Node.js v22.18.0 (LTS)
- Kỳ vọng sẽ làm mờ ranh giới giữa phát triển JavaScript và TypeScript
Hỗ trợ chạy trực tiếp TypeScript trong Node.js
- Trong phiên bản gần đây v22.18.0 (LTS), Node.js đã giới thiệu tính năng có thể chạy trực tiếp các tệp TypeScript (.ts) mà không cần cấu hình hay công cụ riêng
- Trước đây, để chạy mã TypeScript cần có transpiler bên ngoài hoặc bundler như ts-node, esbuild, Babel, nhưng nay Node.js có thể tự nhận diện và chạy mã TypeScript mà không cần các công cụ đó
- Với tính năng này, nhà phát triển có thể chạy trực tiếp tệp
.tstrên Node.js mà không cần tệp cấu hình tsconfig.json hay thư viện bổ sung - Năng suất và sự thuận tiện trong phát triển sẽ tăng đáng kể trong các tình huống như tạo prototype, phát triển thử nghiệm, chạy script
- Dự kiến sẽ mang lại hiệu quả như tăng cường khả năng liên kết giữa các dự án JavaScript và TypeScript, đồng thời giảm rào cản gia nhập cho nhà phát triển mới
Các thay đổi đáng chú ý khác
- esm: triển khai
import.meta.main - fs: cải thiện xử lý sự kiện fs dựa trên AsyncIterator
- permission: hỗ trợ truyền cờ mô hình quyền khi chạy tiến trình con
- sqlite: thêm tùy chọn
readBigInts - src/permission: hỗ trợ
permission.has(addon) - url: thêm API
fileURLToPathBuffer - watch: thêm cờ
--watch-kill-signal - worker: cải tiến đối tượng
Workerthành async disposable
Cập nhật liên quan đến commit và tài liệu
- Bao gồm việc loại bỏ mã không cần thiết, chỉnh lý môi trường build và toolchain, nâng cấp lên npm 10.9.3
- Chỉnh sửa các chỉ số ổn định chi tiết và số RFC trong tài liệu như
globals.md,child_process.md,http2 - Bổ sung nhiều bài kiểm thử và áp dụng các bản sửa lỗi
Tệp phát hành
- Cung cấp trình cài đặt và tệp nhị phân cho Windows, macOS (Intel/Apple Silicon), Linux (x64, ARM, PPC, s390x, AIX)
- Có thể tải mã nguồn và toàn bộ tệp phát hành từ trang phát hành chính thức của Node.js
- Tài liệu API đã được cập nhật theo v22.18.0
7 bình luận
Đúng là nhẹ cả người... Mong nó sớm phổ biến.
Có vẻ sẽ ổn cho việc chạy các script đơn giản, nhưng vì có quá nhiều hạn chế với các dự án thực tế nên chắc cũng không có mấy dịp để dùng.
Còn phải chỉnh cả phần mở rộng và đường dẫn cho khớp vì lỗi ERR_MODULE_NOT_FOUND/ERR_UNSUPPORTED_DIR_IMPORT,
và cũng không dùng được những tính năng cần hỗ trợ build TypeScript với thiết lập
emitDecoratorMetadatanhư NestJS nên...Vậy là
--experimental-strip-typesđược áp dụng mặc định à?Dù sao thì tôi cũng không dùng
enum, nên theo tiêu chí của tôi chỉ riêng việc loại bỏ kiểu cũng đã đủ để chạy rất ổn rồi.Sẽ tiện hơn rất nhiều!
Không thể kìm được cú thích.
Mình đã nghĩ chỉ với cờ
--no-experimental-strip-typesthôi cũng đã đủ tốt rồi.Có vẻ còn tốt hơn nữa.
Ý kiến trên Hacker News
node:testtrong Node.js, giờ tôi nghĩ Node.js gần như đã trở thành lựa chọn mặc định đủ sức thuyết phục trong hầu hết các trường hợp. Việc chạy bằng tsx từng là một cải thiện rất lớn về trải nghiệm, nhưng vẫn chưa hoàn hảo. Các công cụ như zod, ts-rest và trpc đang chủ yếu giải quyết việc khẳng định kiểu lúc runtime ở biên, và dạo gần đây phát triển full-stack Typescript thực sự đã trở nên rất dễ dàng.ts, và còn tích hợp sẵn một test runner mặc định khá tốt (có hỗ trợ--watch). Các package tích hợp cũng đang ngày càng tốt hơn. Ví dụ nhưnode:fs/promises, nhờ top-level await mà làm các tác vụ vòng lặp bất đồng bộ cũng dễ hơn nhiều. Đã mất rất lâu để thuyết phục mọi người tiếp cận theo hướng thực tế, nhưng giờ thì đúng là đã rất dễ chịu.ts. Còn trpc và ts-rest thì tôi nghĩ là bài toán hoàn toàn khác. Cả hai đều dùng được, nhưng trong production tôi tránh trpc vì tôi không thể thực sự sở hữu URL API của mình, cũng không thể quản lý và loại bỏ dần các URL cũ một cách tự nhiên. Với ts-rest, tôi thường vẫn thích tự chia sẻ zod và type để tự quản lý trực tiếp từng cặp request/response của API. Và mỗi lần thấy một công cụ rõ ràng là RPC như trpc mà lại có-resttrong tên là tôi thấy hơi khó chịu.mjsnữa không). Tôi đã rời xa hệ sinh thái một thời gian nên muốn biết từ đó đến nay đã có gì thay đổinode_modules(liên quan: tài liệu chính thức của node.js). Vậy thì các dependency của dự án sẽ ra sao, tôi khá thắc mắc. Tôi đã viết một thư viện cho mô hình dữ liệu bằng Typescript, và muốn import nó vào app của mình ở nguyên trạng Typescript. Tôi muốn biết quy tắc này chỉ áp dụng cho package npm hay áp dụng cho mọi dependency. Ở đây có cơ hội khá lớn. Tôi đã làm một runtime dựa trên golang để thực thi typescript (chính xác hơn là toàn bộ JS), và sobek mà đội grafana đang dùng có lẽ cũng chỉ cần thêm chức năng strip type là được. Tôi cảm thấy chỉ cần xuất hiện một runtime mặc định chấp nhận hoàn toàn Typescript thì Node.js sẽ thực sự mang tính cách mạng. Không cần transpiler, không cần typescript-go, cũng không cần rust (dù rust thì vẫn hơi cần 😉), chỉ cần một hệ thống có parser tốt theo dõi source map và type trong chế độ debug là đủ. Dù sao thì tôi cũng muốn dành sự ghi nhận và cảm ơn tới đội Node cùng tất cả những người đóng góp. Có cảm giác Node là tiêu chuẩn để tất cả chúng ta đi theo. API nhúng cũng đơn giản và dễ dùng, nên khi tạo bản standalone cũng rất tiện"private"node_modulesrecursivecủaopendirbị bỏ qua nữa. Tôi đang ở thế chờ Bun bắt kịp, nhưng đến giờ nó vẫn chưa có vẻ sẵn sàng cho áp dụng thực tế trong các dự án lớn. Các tính năng riêng của bun thoạt nhìn có vẻ hay nhưng vào thực chiến thì chưa đủ. Tài liệu cũng chưa đạt chất lượng như Node.jslocalAddressbị bỏ qua trong kết nối TCPEventEmitter(tạm khắc phục một phần bằng eventemitter2)node_modulesrồi cài lạiTôi đã thử dùng tính năng TS và test runner của chính Node, nhưng hiện vẫn chưa tốt bằng Bun. Trong thời gian tới, cứ khi nào cần những tính năng như vậy thì tôi vẫn dùng Bun. Trong hệ sinh thái Node, tôi đã học được rằng thay vì all-in vào một thứ, tốt hơn là kết hợp các công cụ chuyên cho từng việc.
Bun.js: dùng cho runtime Node, chạy TS và test. Tôi đã thử nhiều cách như TSX, TS-Node, chính Node, v.v.
NPM: dùng để chạy script tooling
PNPM: dùng để cài dependency. (Tôi thấy tốt nhất so với npm, yarn, bun)
Biome.js: dùng để lint. Tốt hơn bất kỳ công cụ lint nào tôi từng dùng
import { stripTypeScriptTypes } from 'node:module') cũng đã được expose. Khi phát triển một web app đơn giản không có dependency frontend, có thể viết toàn bộ bằng typescript rồi khi phục vụ script frontend thì chỉ cần bỏ type đi là được (dự án ví dụ)tsc, cách này khá hợp với tôi--watchcủa tsx mà có thể chạy server trực tiếp từ mã nguồn TS và tự khởi động lại khi có thay đổi. Sắp tới có lẽ chỉ với nodemon và tính năng tích hợp của Node cũng có thể tạo ra môi trường tương tự. Nếu muốn typecheck ngay trong runtime thì phải có hỗ trợ ở cấp độ v8, mà như vậy gần như là viết lại toàn bộenumra thì có trường hợp thực tế nào mọi người vẫn dùng không?