- Node.js ได้รับการปรับปรุงให้สามารถ รันไฟล์ TypeScript ได้โดยตรง
- ตอนนี้สามารถรันไฟล์
.tsได้ทันทีโดยไม่ต้องมี การตั้งค่าเพิ่มเติม หรือการทรานส์ไพล์ - นักพัฒนาสามารถเพิ่มประสิทธิภาพการทำงานได้โดยไม่ต้องใช้ tsconfig.json หรือติดตั้งบันเดลเลอร์แยกต่างหาก
- ฟีเจอร์นี้ถูกรวมเข้าอย่างเป็นทางการตั้งแต่ Node.js เวอร์ชัน v22.18.0 (LTS)
- คาดว่าจะช่วย ลดเส้นแบ่ง ระหว่างการพัฒนา JavaScript และ TypeScript
การรองรับการรัน TypeScript โดยตรงของ Node.js
- เมื่อไม่นานมานี้ Node.js ได้เพิ่ม ความสามารถในการรันไฟล์ TypeScript (.ts) ได้โดยตรงในเวอร์ชัน v22.18.0 (LTS) โดยไม่ต้องพึ่งการตั้งค่าหรือเครื่องมือแยก
- เดิมทีการรันโค้ด TypeScript ต้องใช้ ทรานส์ไพลเลอร์ภายนอก หรือ บันเดลเลอร์ เช่น ts-node, esbuild, Babel แต่ตอนนี้ Node.js สามารถรู้จำและรันโค้ด TypeScript ได้ด้วยตัวเองโดยไม่ต้องใช้เครื่องมือเหล่านั้น
- ด้วยฟีเจอร์นี้ นักพัฒนาสามารถรันไฟล์
.tsบน Node.js ได้ทันทีโดยไม่ต้องมี ไฟล์ตั้งค่า tsconfig.json หรือไลบรารีเพิ่มเติม - ช่วยเพิ่ม ประสิทธิภาพการทำงาน และ ความสะดวกในการพัฒนา อย่างมากในงานอย่างการทำต้นแบบ การพัฒนาเชิงทดลอง และการรันสคริปต์
- คาดว่าจะช่วยเสริม การเชื่อมโยงกัน ระหว่างโปรเจกต์ JavaScript และ TypeScript รวมถึงลดอุปสรรคในการเริ่มต้นสำหรับนักพัฒนาหน้าใหม่
การเปลี่ยนแปลงอื่นที่น่าสนใจ
- esm: เพิ่มการใช้งาน
import.meta.main - fs: ปรับปรุงการจัดการอีเวนต์ fs บนพื้นฐาน AsyncIterator
- permission: รองรับการส่งต่อ permission model flag เมื่อรันซับโปรเซส
- sqlite: เพิ่มตัวเลือก
readBigInts - src/permission: รองรับ
permission.has(addon) - url: เพิ่ม API
fileURLToPathBuffer - watch: เพิ่มแฟลก
--watch-kill-signal - worker: ปรับปรุงอ็อบเจ็กต์
Workerให้เป็น async disposable
การอัปเดตด้านคอมมิตและเอกสาร
- รวมถึงการลบโค้ดที่ไม่จำเป็น การจัดระเบียบสภาพแวดล้อมบิลด์และทูลเชน และการอัปเกรดเป็น npm 10.9.3
- แก้ไขรายละเอียดตัวชี้วัดเสถียรภาพและหมายเลข RFC ในเอกสาร เช่น
globals.md,child_process.md,http2 - เพิ่มการทดสอบจำนวนมากและรวมการแก้ไขบั๊กไว้แล้ว
ไฟล์เผยแพร่
- มีไฟล์ติดตั้งและไบนารีสำหรับ Windows, macOS(Intel/Apple Silicon), Linux(x64, ARM, PPC, s390x, AIX)
- สามารถดาวน์โหลดซอร์สโค้ดและไฟล์รีลีสทั้งหมดได้จากหน้าดาวน์โหลดอย่างเป็นทางการของ Node.js
- เอกสาร API ได้รับการอัปเดตตาม v22.18.0
7 ความคิดเห็น
โอ้ โล่งอกไปที... หวังว่ามันจะได้รับความนิยมอย่างรวดเร็ว
น่าจะโอเคสำหรับการรันสคริปต์ง่าย ๆ แต่สำหรับโปรเจ็กต์จริงมีข้อจำกัดเยอะ เลยดูเหมือนจะไม่ค่อยมีโอกาสได้ใช้งานเท่าไร
ยังต้องปรับนามสกุลไฟล์หรือพาธให้ตรงด้วยเพราะมีข้อผิดพลาดอย่าง ERR_MODULE_NOT_FOUND/ERR_UNSUPPORTED_DIR_IMPORT
และฟีเจอร์ที่ต้องอาศัยการรองรับการบิลด์ TypeScript ผ่านการตั้งค่า
emitDecoratorMetadataอย่างเช่น NestJS ก็ใช้ไม่ได้ด้วย...--experimental-strip-typesถูกเปิดใช้เป็นค่าเริ่มต้นเลยใช่ไหม?ยังไงผมก็ไม่ได้ใช้
enumอยู่แล้ว ดังนั้นสำหรับผม แค่ทำงานแบบลบ type ออกก็เพียงพอและรันได้ดีมากแล้วสะดวกขึ้นมากเลยนะ!
กลั้นความกดไลก์ไว้ไม่ไหวเลยครับ
เดิมก็คิดว่าแค่มีแฟลก
--no-experimental-strip-typesก็ดีพอแล้วแต่ดูเหมือนว่าจะดียิ่งกว่านั้นอีกครับ
ความคิดเห็นใน Hacker News
node:testใน Node.js ตอนนี้ผมคิดว่า Node.js แทบจะเป็นตัวเลือกเริ่มต้นที่น่าเชื่อที่สุดในเกือบทุกกรณีแล้ว การรันด้วย tsx เคยช่วยยกระดับคุณภาพชีวิตได้มาก แต่ก็ยังไม่สมบูรณ์อยู่ดี เรื่องการยืนยันชนิดข้อมูลตอนรันไทม์ที่ edge ก็ถูกแก้ไปเป็นส่วนใหญ่ด้วยเครื่องมืออย่าง zod, ts-rest และ trpc ทุกวันนี้การพัฒนาแบบฟูลสแตกด้วย Typescript ง่ายมากจริง ๆ.tsได้ตรง ๆ และยังมี test runner พื้นฐานที่ดีติดมาให้ด้วย (รองรับ--watch) แพ็กเกจที่มีมาในตัวก็ดีขึ้นเรื่อย ๆ อย่างnode:fs/promisesพอมี top-level await แล้ว งานพวก async loop ก็ง่ายขึ้นเยอะ กว่าจะทำให้ทุกคนยอมรับแนวทางที่ใช้งานได้จริงแบบนี้ได้ก็ใช้เวลานาน แต่ตอนนี้ประสบการณ์มันลื่นมากแล้ว.tsส่วน trpc กับ ts-rest ผมว่ามันเป็นคนละปัญหากัน ใช้ทั้งคู่ได้ แต่ในโปรดักชันผมเลี่ยง trpc เพราะผมไม่สามารถเป็นเจ้าของ URL ของ API ได้เอง และจัดการกับ URL เก่า ๆ รวมถึงการเลิกใช้อย่างเป็นธรรมชาติไม่ได้ ส่วน ts-rest ปกติผมก็มักจะเลือกแชร์ zod กับ type แล้วดูแลคู่ request/response ของ API เองมากกว่า แล้วทุกครั้งที่ trpc เป็นเครื่องมือแบบ RPC ชัด ๆ แต่ชื่อดันมี-restก็ยังขัดใจอยู่ดี.mjsอยู่ไหม) ผมห่างจาก ecosystem นี้ไปพักหนึ่ง เลยอยากรู้ว่าหลังจากนั้นมีอะไรเปลี่ยนไปบ้างnode_modules(เกี่ยวข้อง: เอกสารทางการของ node.js). ถ้าอย่างนั้น dependency ของโปรเจกต์จะเป็นยังไง ผมเขียนไลบรารีสำหรับ data model ด้วย Typescript แล้วอยาก import เข้ามาในแอปทั้งแบบ Typescript เลย เลยสงสัยว่ากฎนี้ใช้เฉพาะกับแพ็กเกจ npm หรือใช้กับ dependency ทุกแบบกันแน่ ตรงนี้ยังมีโอกาสอยู่ ผมทำ runtime สำหรับรัน typescript (จริง ๆ คือ JS โดยรวม) ที่เขียนด้วย golang และ sobek ที่ทีม grafana ใช้ก็ดูเหมือนจะเหลือแค่เพิ่มความสามารถ type strip ก็พอ ผมรู้สึกว่าถ้ามี runtime ที่ยึด Typescript เป็นค่าเริ่มต้นแบบเต็มตัวออกมาสักตัว Node.js จะถูกผลักดันไปอีกขั้นจริง ๆ ไม่ต้องมีทั้ง transpiler, typescript-go หรือ rust (แต่ rust ก็ยังนิดหน่อย😉) ขอแค่มี parser ที่ดีและระบบที่ตาม source map กับ type ได้ในโหมดดีบักก็น่าจะพอ อย่างไรก็ดี ต้องขอชื่นชมและขอบคุณทีม Node กับผู้มีส่วนร่วมทุกคน เพราะ Node ที่เป็นมาตรฐานทำให้เหมือนพวกเราทุกคนได้เดินตามไปด้วย API สำหรับ embedding ก็เรียบง่ายและใช้งานสะอาดดี เลยสะดวกเวลาทำตัว standalone"private"เลยnode_modulesrecursiveในopendirถูกเพิกเฉย เป็นต้น ผมกำลังรอให้ Bun ไล่ตามให้ทัน แต่ตอนนี้ยังไม่รู้สึกว่าพร้อมสำหรับใช้งานจริงในโปรเจกต์ใหญ่ ฟีเจอร์เฉพาะของ bun ตอนแรกก็ดูน่าสนใจ แต่พอใช้จริงยังรู้สึกไม่ถึงขั้น เอกสารก็ยังไม่คุณภาพเท่า Node.jslocalAddressในการเชื่อมต่อ TCP ถูกมองข้ามnode_modulesแล้วติดตั้งใหม่ผมลองใช้ฟีเจอร์ TS และ test runner ของ Node เองแล้ว แต่ก็ยังไม่ดีเท่า Bun ตอนนี้เวลาจะใช้ฟีเจอร์พวกนี้ผมก็ยังใช้ Bun อยู่ จากการอยู่ใน ecosystem ของ Node ผมได้เรียนรู้ว่าการจับคู่เครื่องมือที่แต่ละตัวถนัดเข้าด้วยกัน ดีกว่าทุ่มทั้งหมดให้ตัวเดียว
Bun.js: ใช้เป็น Node runtime สำหรับรัน TS และการทดสอบ ลองมาหลายแบบแล้วทั้ง TSX, TS-Node, ตัว Node เอง ฯลฯ
NPM: ใช้รันสคริปต์สำหรับ tooling
PNPM: ใช้ติดตั้ง dependency (รู้สึกว่าดีที่สุดเมื่อเทียบกับ npm, yarn, bun)
Biome.js: ใช้ linting ดีที่สุดในบรรดาเครื่องมือ lint ที่ผมเคยใช้มา
import { stripTypeScriptTypes } from 'node:module') ออกมาให้ใช้ด้วย ถ้าจะทำเว็บแอปเล็ก ๆ ที่ไม่มี frontend dependency จะเขียนทั้งระบบเป็น typescript แล้วเสิร์ฟสคริปต์ฝั่ง frontend โดยลบเฉพาะ type ออกก็ได้ (ตัวอย่างโปรเจกต์)tscก็เข้าท่าดีสำหรับผม--watchของ tsx ให้รันเซิร์ฟเวอร์จากซอร์ส TS ตรง ๆ แล้วรีสตาร์ตอัตโนมัติเมื่อมีการเปลี่ยนแปลง ต่อไปก็น่าจะทำสภาพแวดล้อมคล้ายกันได้ด้วย nodemon กับฟีเจอร์ที่มีมาใน Node เอง ถ้าจะให้มี type checking ใน runtime เลยจริง ๆ คงต้องรองรับระดับ v8 ซึ่งแทบจะเท่ากับเขียนใหม่ทั้งชุดenumแล้ว มีกรณีใช้งานจริงอะไรอีกที่คนใช้กัน?