ค้นหาเว็บไซต์

typescript - ฉันจะตัดสินใจอย่างไรว่า @types/* ควรอยู่ใน `dependencies` หรือ `devDependencies`?


ฉันใช้ TypeScript 2 ในโปรเจกต์ของฉัน ฉันอยากใช้ไลบรารี js บางตัว แต่ก็อยากได้ไฟล์ typings สำหรับไลบรารีนั้นด้วย ฉันสามารถติดตั้ง types ได้ด้วยคำสั่งง่าย ๆ npm install @types/some-library ฉันไม่แน่ใจว่าควรใช้ --save หรือ --save-dev กับพวกมัน มันดูเหมือนว่าแม้แต่ README ของ DefinetelyTyped บน GitHub ก็พูดถึงทั้งสองเวอร์ชัน แต่ไม่เคยอธิบายให้ชัดเจน ฉันคิดว่า @types ควรอยู่ใน devDependencies เพราะ types จำเป็นสำหรับการพัฒนาและไม่ได้ใช้งานใน runtime แต่ฉันก็เห็นหลายครั้งที่ @types อยู่ใน dependencies ทำให้ฉันสับสน

ฉันควรตัดสินใจอย่างไรว่า @types/* ควรอยู่ใน dependencies หรือ devDependencies? จริง ๆ แล้วมีคำแนะนำอย่างเป็นทางการมากหรือน้อยบ้างหรือไม่?

คำตอบ #1

สมมติว่าคุณกำลังพัฒนาแพ็กเกจ "A" ที่มีแพ็กเกจ @types/some-module อยู่ใน devDependencies ด้วยเหตุผลบางประการคุณกำลังส่งออกประเภทจาก @types/some-module:

import { SomeType } from 'some-module';

export default class APackageClass {
  constructor(private config: SomeType) {
    // …       
  }
}

ตอนนี้ผู้ใช้ TypeScript ของแพ็กเกจ "A" ไม่สามารถเดาได้ว่า SomeType คืออะไร เนื่องจาก devDependencies ของแพ็กเกจ "A" ไม่ได้ ถูกติดตั้ง

ในกรณีเฉพาะนั้นคุณ ต้องวางแพ็กเกจ @types/* ไว้ใน dependencies ปกติ สำหรับกรณีอื่น ๆ devDependencies ก็เพียงพอแล้ว

คำตอบ #2

ถ้าคุณแค่สร้างบันเดิลเพียงอย่างเดียว อาจไม่จำเป็นต้องแยกระหว่าง dependencies และ devDependencies ฟีเจอร์นี้ของ npm มักจะมีประโยชน์เมื่อเผยแพ็คเกจที่สามารถใช้โดยผู้อื่น และคุณไม่ต้องการที่จะส่งผลักดันพวกเขาด้วย dependencies ที่ซ้ำซ้อน

อาจมีกรณีการใช้งานอื่น ๆ ที่การแยก dependencies ออกมาอาจมีประโยชน์ แต่ถ้าคุณไม่มีความจำเป็นชัดเจนสำหรับสิ่งนี้ คำแนะนำของผมคือให้เลือกเพียงอันใดอันหนึ่งและวางทุกอย่างที่นั่น การแยกพวกมันออกทีหลังไม่ใช่เรื่องยากถ้าจำเป็นต้องใช้

ตัวอย่างที่เป็นที่รู้จักของการปฏิบัตินี้ในชีวิตจริงคือ create-react-app, โดยค่าเริ่มต้นบูทสเตรปที่ไม่ได้ถูก eject ที่มันสร้างจะวางทุกอย่างไว้ใน dependencies, ดูเธรดนี้และคำตอบนี้

คำตอบ #3

ในกรณีเฉพาะของการปรับใช้แอปพลิเคชัน Node.js ไปยังระบบการผลิต จะต้องการติดตั้งเฉพาะ dependencies ที่จำเป็นสำหรับการรันแอปพลิเคชันเท่านั้น

npm install --omit=dev หรือ

npm ci --production หรือ

yarn --production

ในกรณีนั้น ประเภทเหล่านั้นควรอยู่ใน devDependencies เพื่อหลีกเลี่ยงไม่ให้การติดตั้งมีขนาดใหญ่เกินไป

(เพื่อหลีกเลี่ยงความเข้าใจผิด จะต้องไม่ใช้ตัวเลือก --production หรือ --omit=dev บนเครื่องที่มีการสร้างแอปพลิเคชัน มิฉะนั้นคอมไพเลอร์ TypeScript จะรายงานข้อผิดพลาด)

หมายเหตุ: ฉันทราบว่าสิ่งนี้ถูกกล่าวถึงในความคิดเห็นโดย Brad Wilson ต่อคำตอบอื่น แต่น่าจะเป็นประเด็นที่ควรจะเป็นคำตอบ

บทความที่เกี่ยวข้อง