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 ต่อคำตอบอื่น แต่น่าจะเป็นประเด็นที่ควรจะเป็นคำตอบ
