typescript - 我該如何決定 @types/* 應該放入 `dependencies` 還是 `devDependencies`?
我在我的專案中使用 TypeScript 2。我想使用一些 JavaScript 庫,但也想要該庫的型別定義。我可以用簡單的 npm install @types/some-library 來安裝型別定義。我不確定應該用 --save 還是 --save-dev。對我來說,就連 DefinitelyTyped 的 GitHub 自述檔似乎也同時提到了兩種方式,但從未解釋過。我認為 @types 應該放在 devDependencies,因為型別定義是開發時需要的,執行時並不使用,但我多次看到 @types 直接放在 dependencies 中。我感到困惑。
我應該如何決定 @types/* 應該放入 dependencies 還是 devDependencies?是否真的有一些多多少少官方的指引?
答案#1
假設你正在開發一個名為「A」的套件,該套件在 devDependencies 中有 @types/some-module 套件。出於某種原因,你正在從 @types/some-module 匯出類型:
import { SomeType } from 'some-module';
export default class APackageClass {
constructor(private config: SomeType) {
// …
}
}
現在,使用套件「A」的 TypeScript 使用者無法猜測 SomeType 是什麼,因為套件「A」的 devDependencies 並未被安裝。
在那種特定情況下,你需要將@types/*套件放在一般的dependencies裡。對於其他情況,devDependencies就足夠了。
答案#2
如果你只是生成一個捆綁檔,可能不需要區分 dependencies 和 devDependencies。npm 的這個功能通常在發佈可供他人使用的套件時很有用,這樣你就不會向他們發送多餘的依賴項。
可能還有其他使用情境下,拆分依賴關係會有幫助,但除非你有明確的需求,否則我的建議是選擇其中一個,並將所有東西放在那裡。如果之後有需要,拆分它們也不困難。
這種做法在現實生活中的一個著名例子是 create-react-app,預設情況下,它創建的未彈出的樣板會將所有內容放在 dependencies 中,參見這個討論串和這個答案
答案#3
在將 Node.js 應用程式部署到生產環境的特定情況下,人們只想安裝運行應用程式所需的依賴項。
npm install --omit=dev 或
npm ci --production 或
yarn --production在那種情況下,這些類型應該放在 devDependencies 中,以防止安裝時變得臃腫。
(為避免誤解,在構建應用程式的機器上不得使用 --production 或 --omit=dev 選項,否則 TypeScript 編譯器會報錯。)
備註:我知道這是在 Brad Wilson 對另一個答案的評論中提到的。不過,這一點似乎值得成為一個答案。
