3 คะแนน โดย GN⁺ 2024-07-26 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

โมดูล: เพิ่ม --experimental-strip-types

  • สามารถรันไฟล์ TypeScript บน Node.js ได้

    • เมื่อตั้งค่าแฟล็ก --experimental-strip-types จะสามารถรันไฟล์ TypeScript ได้
    • Node.js จะแปลงซอร์สโค้ด TypeScript เป็นซอร์สโค้ด JavaScript
    • ในกระบวนการแปลงจะไม่มีการตรวจสอบชนิดข้อมูล และชนิดข้อมูลจะถูกลบออก
  • แรงจูงใจ

    • การทำให้สามารถรันไฟล์ TypeScript ได้โดยไม่ต้องพึ่งพา dependency หรือ loader ภายนอกเป็นสิ่งสำคัญ
    • ต้องการให้ผู้ใช้สามารถรัน node foo.ts ได้
  • ความหมายของการ strip type

    • การ strip type คือการลบ type ทั้งหมดออกและแปลงอินพุตให้เป็นโมดูล JavaScript
    • ตัวอย่าง: const foo: string = "foo"; จะถูกแปลงเป็น const foo = "foo";
  • เหตุผลที่เลือก @swc/wasm-typescript

    • เพราะมีความเรียบง่าย
    • เครื่องมืออื่นต้องเพิ่ม Rust หรือ Go แต่ @swc/wasm-typescript เป็นแพ็กเกจขนาดเล็กที่ต้องใช้เพียงไฟล์ wasm และ js
    • มีการใช้งานใน Deno ด้วย จึงเชื่อถือได้
  • ข้อจำกัด

    • ฟีเจอร์เฉพาะของ TypeScript เช่น enum, namespace เป็นต้น จะไม่ถูกแปลง
    • ไม่รองรับ import ที่ไม่มีนามสกุลไฟล์
  • แผนในอนาคต

    • อาจมีการนำไปใช้งานใน native layer
    • อาจเพิ่มการรองรับ source map

สรุปโดย GN⁺

  • อธิบายฟีเจอร์ใหม่ที่ช่วยให้สามารถรันไฟล์ TypeScript บน Node.js ได้
  • ทำให้สามารถแปลงและรันไฟล์ TypeScript เป็น JavaScript ได้ โดยไม่มีการตรวจสอบชนิดข้อมูล
  • สิ่งนี้ช่วยให้ผู้ใช้สามารถรันไฟล์ TypeScript ได้โดยไม่ต้องมี dependency ภายนอก ทำให้สภาพแวดล้อมการพัฒนาง่ายขึ้น
  • ฟีเจอร์นี้ถูกพัฒนาด้วย @swc/wasm-typescript และในอนาคตก็มีการพิจารณาการนำไปใช้งานใน native layer ด้วย
  • อาจเป็นประโยชน์กับโปรเจกต์ที่ใช้งาน TypeScript และ JavaScript ร่วมกัน

1 ความคิดเห็น

 
GN⁺ 2024-07-26
ความเห็นจาก Hacker News
  • การลบ type ของ TypeScript ออกนั้นเป็นไปไม่ได้หากไม่มีไวยากรณ์ของ TypeScript เอง การลบ type ไม่ใช่งานในระดับโทเคน และไวยากรณ์ของ TypeScript ก็ยังคงเปลี่ยนแปลงอยู่ตลอด

    • ตัวอย่างเช่น foo < bar & baz > ( x ) ถูกตีความแตกต่างกันใน TypeScript 1.5
    • หากต้องการใช้ฟีเจอร์ใหม่ของ TypeScript ก็ต้องคอมไพล์เป็น JS หรืออัปเดตเวอร์ชัน Node ให้ใหม่อยู่เสมอ
    • สำหรับคนที่ใช้ Node LTS เรื่องนี้อาจเป็นการประนีประนอมที่ทำได้ยาก
  • ถ้า Node.js สามารถรันไฟล์ TypeScript ได้โดยตรง TypeScript compiler ก็คงไม่จำเป็นต้องลบ type แล้วแปลงเป็น JavaScript

    • เรื่องนี้คล้ายกับสถานการณ์ของ Python
    • ใน Python มี type checker หลายตัว และทั้งหมดใช้ไวยากรณ์ type hint แบบเดียวกัน แต่ตีความความหมายต่างกัน
    • ใน JavaScript นั้น TypeScript กลายเป็น type checker ยอดนิยมเพียงตัวเดียว
    • ใน Python ก็มีคนที่ใช้ type hint เหมือนเป็นคอมเมนต์ด้วย
    • ถ้า Node.js รองรับการเมิน type ก็เป็นไปได้ว่า JavaScript จะทำแบบนั้นได้เช่นกัน
  • ถ้าฟีเจอร์นี้กลายเป็นค่าปริยาย ก็สงสัยว่า ecosystem ของ NPM จะตอบสนองอย่างไร

    • เวลาปล่อย NPM module จะยังต้อง build เวอร์ชัน CJS และ EJS ต่อไปไหม หรือจะใส่ engine: nodejs >= 25 ใน package.json แล้วข้ามขั้นตอน build ไปเลย
    • โดยส่วนตัวหวังว่า NPM module ที่เขียนด้วย TS จะไม่ต้องมี dist/.cjs ให้อีกต่อไป
    • การข้ามขั้นตอน build น่าจะเป็นสิ่งที่ดึงดูดผู้มีส่วนร่วมใน NPM มาก
    • เรื่องนี้อาจส่งผลกระทบเป็นลูกโซ่ต่อ ecosystem ของ NPM
    • ถ้า Node.js ปล่อยฟีเจอร์นี้โดยไม่มี experimental flag ก็คาดว่าผู้ใช้งานทั้งหมดจะยอมรับไฟล์ TS
    • สิ่งนี้อาจบีบให้ Firefox และ Safari ต้องรองรับไฟล์ TS ด้วย
    • โดยส่วนตัวรู้สึกยินดีที่ JS compiler จะทิ้ง type annotation ของ TS
    • ถ้า Node รองรับไฟล์ .ts ก็จะตัดขั้นตอน transcompile ออกไปได้
  • ถ้า Node สามารถตรวจสอบ type จากใน JS ได้ จะเป็นประโยชน์มาก

    • ใน Python มีเครื่องมืออย่าง pydantic ซึ่งสามารถตรวจดู type และสร้างตัวตรวจสอบได้
    • สิ่งนี้ทำให้การตรวจสอบ type, การตรวจสอบข้อมูลขณะรันไทม์, การสร้าง API และการสร้างเอกสาร API ทำได้ด้วยสัญกรณ์มาตรฐานเดียว
    • ตอนนี้ใน JS ยังต้องพึ่งเครื่องมืออย่าง zod
  • ประสบการณ์นักพัฒนา (DX) ของ Bun ในด้านนี้ถือว่าไม่เคยมีมาก่อน และตอบโจทย์การใช้งานส่วนใหญ่ได้แล้ว

    • ใน Node ไม่สามารถตั้งค่าไม่ให้บังคับใส่ส่วนขยายตอน import ได้ และก็ไม่สามารถตั้งค่าให้ tsc เติมส่วนขยาย .js ให้อัตโนมัติได้
    • การรองรับ TypeScript แบบเนทีฟอาจช่วยแก้ปัญหานี้ได้ แต่ก็คงยากที่จะไล่ทันประสบการณ์ใช้งานหรือประสิทธิภาพของ Bun
  • ชอบ TypeScript มากและโหยหา TypeScript runtime มานานแล้ว

    • เหตุผลที่ออกจาก Java ก็เพราะต้องการระบบ type ที่มีความสามารถมากกว่าและรองรับ gradual typing
    • แม้ ecosystem ของ npm จะมีข้อเสีย แต่การใช้ไลบรารียังรู้สึกไม่หนักเกินไปและสนุกกว่า
    • Rust อยู่คนละด้านของสเปกตรัมภาษา แต่ก็ให้ความรู้สึกคล้ายกัน
    • JIT เป็นคำที่ใช้ไม่ถูกนัก จริง ๆ แล้วต้องการพูดถึงความต่างของเวลาเริ่มต้นและการทำงานขณะรันระหว่าง JVM กับ V8
  • ฟีเจอร์ deno ที่ชอบที่สุดกำลังถูกนำเข้า Node โดยตรง

    • ตื่นเต้นมากที่จะสามารถลบ type ได้โดยไม่ต้องติดตั้ง esbuild
    • ช่วงหลังมานี้เอนเอียงไปทาง Python มากกว่า แต่ TypeScript ดีกว่า Python ในแง่ของ type
    • สคริปต์ขนาดใหญ่จะได้ประโยชน์มากขึ้นเมื่อมี type
  • เป็นเดือนที่สำคัญมากสำหรับ Node

    • ใน v22.5.0 มีการเพิ่ม node:sqlite และตอนนี้ก็เริ่มมีการรองรับ TypeScript
    • ชอบทิศทางของ Node
  • เป็นผู้เขียน PR นี้เอง ถามมาได้เลย

  • เริ่มใช้ Node.js ทำงานฝั่งแบ็กเอนด์ตั้งนานแล้ว และมันมีข้อดีกว่า PHP อยู่มาก

    • Node ค่อนข้างจุกจิกและต้องประกอบหลายอย่างเพื่อให้กลายเป็นภาษาที่อยากได้
    • ต่อมาเริ่มใช้ Golang และการมี type safety ทำให้เขียนโค้ดง่ายขึ้น
    • TypeScript เป็นตัวเลือกที่ดี แต่ก็เป็นเพียงส่วนเสริมอีกชั้นหนึ่งเท่านั้น
    • ข้อดีอย่างมากของการใช้ Node คือความเร็วในการทำ prototype ซึ่งอาจถูกหักล้างไปเมื่อใช้ TypeScript