Bagaimana saya memutuskan apakah @ types / * masuk ke `dependencies` atau` devDependencies`?

200

Saya menggunakan TypeScript 2 di proyek saya. Saya ingin menggunakan beberapa perpustakaan js, tetapi juga mengetik untuk perpustakaan itu. Saya dapat menginstal jenis dengan sederhana npm install @types/some-library. Saya tidak yakin apakah saya harus --saveatau --save-devmereka. Tampaknya bagi saya bahwa bahkan GitHub DefinetelyTyped membaca saya jenis menyebutkan kedua versi, tetapi tidak pernah menjelaskannya. Saya akan berpikir bahwa @types harus dalam devDependencies, karena jenis diperlukan untuk pengembangan dan tidak digunakan dalam runtime, tapi saya melihat berkali-kali @types hanya dalam dependencies. Saya bingung.

Bagaimana saya harus memutuskan apakah @ types / * masuk ke dependenciesatau devDependencies? Apakah sebenarnya ada lebih atau kurang instruksi resmi?

kamyl
sumber
Apakah Anda menghasilkan bundel atau apakah ini paket yang akan digunakan oleh orang lain? Seperti yang saya lihat, Anda hanya perlu membuat perbedaan antara dependenciesdan devDependenciesdalam kasus terakhir.
Valentin
Saya membuat beberapa game di js / ts dari awal. Saya bundel semuanya dengan webpack. Tidak ada backend sama sekali atm, tetapi mungkin saya akan membungkus semuanya dalam Electron untuk membuatnya mandiri suatu hari nanti. Saya tidak berpikir ada orang yang akan menggunakannya sebagai ketergantungan pada aplikasi mereka sendiri, tapi saya kira itu mungkin (pikirkan game mini di game GTA; dan game saya adalah open source). Tetap saja, saya ingin belajar dan mengikuti praktik terbaik dan itulah alasan utama saya membuat game itu. Saya harap saya mengklarifikasi kasus penggunaan saya dengan cukup baik. :)
kamyl
1
Ya, masuk akal, hanya ingin memastikan bahwa jawaban awal saya relevan dengan use case Anda. Saya masih berpikir bahwa perbedaan antara devDependenciesdan dependenciestidak relevan ketika membangun bundel, sesuatu yang create-react-appmemaksa juga tapi akhirnya itu terserah Anda untuk memilih
Valentin

Jawaban:

140

Katakanlah Anda sedang mengembangkan paket "A" yang memiliki paket @ types / some-module di devDependencies. Untuk beberapa alasan Anda mengekspor tipe dari @ types / some-module

import {SomeType} from 'some-module';
export default class APackageClass {
     constructor(private config: SomeType) {

     }
}

Saat ini, konsumen "Script" pada paket "A" tidak dapat menebak apa SomeType itu, karena devDependensi paket "A" TIDAK diinstal.

Dalam kasus tertentu Anda PERLU menempatkan paket @ types / * dengan "dependensi" reguler. Untuk kasus lain, "dependensi" cukup baik.

wookieb
sumber
7
Jadi Anda menyiratkan bahwa, jika saya hanya menggunakan tipe dalam implementasi, itu definisi tipe bisa devDependencies?
Franklin Yu
7
Ya @ FranklinYu. Segera setelah jenisnya muncul di file deklarasi, Anda harus meletakkannya di dependencies. Kalau tidak, devDependenciestidak apa
wookieb
1
Tetapi sebuah paket bekerja untuk TS dan JS. Pengembang JS tidak perlu tipe-tipe itu untuk mengkompilasi kode mereka. Menambahkan definisi tipe ke dependenciesakan membuat pohon ketergantungan kembung.
Tyler Long
1
@ TylerLong Benar. Itu tidak sempurna tetapi itulah kenyataan. Secara opsional, Anda juga dapat menggunakan "dependensi opsional" tetapi saya yakin pada skala ini mungkin akan sangat mengganggu.
wookieb
55

Jika Anda hanya membuat bundel, mungkin tidak perlu membedakan antara dependenciesdan devDependencies. Fitur npmini umumnya berguna ketika menerbitkan paket yang dapat digunakan oleh orang lain dan Anda tidak ingin mengirim spam dengan dependensi yang berlebihan.

Mungkin ada kasus penggunaan lain di mana dependensi pemisahan dapat membantu tetapi kecuali jika Anda memiliki kebutuhan yang jelas untuk ini, maka saran saya adalah hanya memilih salah satu dan meletakkan semuanya di sana. Tidak sulit untuk memisahkan mereka setelah itu jika perlu.

Contoh yang terkenal dari praktik ini IRL adalah create-react-app, secara default boiler yang tidak terlontar menciptakan tempat segalanya dependencies, lihat utas ini dan jawaban ini

Valentin
sumber
8
Jika Anda tidak menerbitkan paket, itu benar, tetapi jika Anda melakukannya, itu tidak ada hubungannya dengan pengembangan vs runtime dan segala sesuatu dengan apa yang diperlukan untuk membangun paket ini vs apa yang diperlukan untuk menggunakan paket ini .
Yogu
1
@Yogu Itu sebabnya saya membuat perbedaan di tempat pertama jadi ya, saya sepenuhnya setuju dengan Anda
Valentin
13
Saya tidak setuju dengan saran ini. devDependenciestidak diinstal ketika Anda melakukannya npm install --production(atau npm ci --production) dan karenanya tidak tersedia saat menjalankan kode produksi. Ini adalah perbedaan yang sangat berarti untuk layanan, bukan hanya perpustakaan.
Brad Wilson
2
@BradWilson Anda ada benarnya, ada banyak alur kerja npm di bawah matahari, jika kasus penggunaan Anda mengharuskan Anda untuk membuat perbedaan maka dengan segala cara, lakukanlah. Jangan ragu untuk memberikan jawaban Anda sendiri terhadap dilema ini.
Valentin
Saya telah memperbarui jawaban saya untuk menyebutkan keberadaan kasus penggunaan lain di mana perbedaannya mungkin bermakna dan memberikan contoh dunia nyata. Terima kasih untuk umpan baliknya!
Valentin
15

Dalam kasus khusus penerapan aplikasi Node.js untuk produksi, seseorang hanya ingin menginstal dependensi yang diperlukan untuk menjalankan aplikasi.

npm install --production atau

npm ci --production atau

yarn --production

Dalam hal ini, jenisnya harus di dalam devDependencies, agar tidak kembung pemasangan.

Catatan: Saya tahu ini disebutkan dalam komentar Brad Wilson untuk jawaban lain. Namun, poin ini layak menjadi jawaban.

Carsten Führmann
sumber