¿Cómo decido si @types/* entra en `dependencias` o `devDependencies`?
Utilizo TypeScript 2 en mi proyecto. Me gustaría usar alguna biblioteca js, pero también mecanografía para esa biblioteca. Puedo instalar tipos con archivos npm install @types/some-library
. No estoy seguro si debería hacerlo yo --save
o --save-dev
ellos. Me parece que incluso el archivo Léame de GitHub de DefinetelyTyped menciona ambas versiones, pero nunca las explica. Pensaría que @types debería estar en devDependencies
, ya que los tipos son necesarios para el desarrollo y no se usan en tiempo de ejecución, pero vi muchas veces @types en solo dependencies
. Estoy confundido.
¿ Cómo debo decidir si @types/* entra en dependencies
o devDependencies
? ¿Existen realmente algunas instrucciones más o menos oficiales?
Digamos que está desarrollando un paquete "A" que tiene @types/some-module
el paquete en formato devDependencies
. Por alguna razón estás exportando el tipo de @types/some-module
:
import { SomeType } from 'some-module';
export default class APackageClass {
constructor(private config: SomeType) {
// …
}
}
En este momento, los consumidores de TypeScript del paquete "A" no pueden adivinar qué SomeType
es, ya que devDependencies
el paquete "A" no está instalado.
En ese caso particular, debe colocar @types/*
el paquete con regular dependencies
. Para otros casos devDependencies
es suficiente.
Si solo estás generando un paquete, es posible que no sea necesario hacer la distinción entre dependencies
y devDependencies
. Esta característica npm
es generalmente útil cuando se publica un paquete que otros pueden utilizar y no desea enviarles spam con dependencias redundantes.
Puede haber otros casos de uso en los que dividir las dependencias puede resultar útil, pero a menos que tenga una necesidad expresa de hacerlo, mi consejo es elegir cualquiera de los dos y colocar todo allí. No es difícil dividirlos después si fuera necesario.
Un ejemplo bien conocido de esta práctica en la vida real es que create-react-app
, de forma predeterminada, el texto estándar no expulsado que crea coloca todo dependencies
, consulte este hilo y esta respuesta.
En el caso particular de implementar una aplicación Node.js en producción, se desea instalar solo las dependencias necesarias para ejecutar la aplicación.
npm install --omit=dev
o
npm ci --production
o
yarn --production
En ese caso, los tipos deben estar en devDependencies
, para evitar que hinchen la instalación.
(Para evitar malentendidos, la opción --production
o --omit=dev
no debe usarse en las máquinas donde se crea la aplicación; de lo contrario, el compilador de TypeScript se quejará).
Observaciones: Soy consciente de que esto fue mencionado en un comentario de Brad Wilson en otra respuesta. Sin embargo, este punto parece digno de ser una respuesta.
Dependiendo de para qué se utilizará su código. Si necesita los tipos en su código de producción (por ejemplo, si crea un paquete personalizado que reexporta los tipos), entonces debería estar en ; dependencies
de lo contrario, si es solo para fines de desarrollo, devDependencies
es el lugar correcto para colocarlos.
Otras respuestas tenían mucho sentido, pero agregaré que el paquete de declaración de tipo de peerDep también debe colocarse en dependencies
lugar de peerDependencies
.
Supongamos que b
es un complemento de a
. Y c
utiliza a
y b
.
¿Por qué no debería @types/a
colocarse en b
's peerDependencies
?
Si b
es package.json
como:
{
"peerDependencies": {
"a": "1.5.x"
"@types/a": "1.4.x"
}
}
c
Puede utilizar sólo interfaces definidas en @types/[email protected]
pero c
está obligado a instalar @types/[email protected]
.
Además, c
puede ser un paquete javascript normal en lugar de un paquete mecanografiado, pero c
también está obligado a instalarlo @types/[email protected]
.
Entonces, lo correcto package.json
debería b
ser como:
{
"peerDependencies": {
"a": "1.5.x"
},
"dependencies": {
"@types/a": "1.4.x"
}
}