Todos los días, millones de desarrolladores, al crear sus aplicaciones JavaScript, recurren a npm (o a Yarn). Ejecutar comandos como
npm init
o
npx create-react-app
ha convertido en una forma familiar de comenzar a trabajar en casi cualquier proyecto de JavaScript. Puede ser un servidor, un cliente o incluso una aplicación de escritorio.
Pero la utilidad npm no solo es capaz de inicializar proyectos o instalar paquetes. El autor del material, cuya traducción publicamos hoy, quiere hablar sobre trucos de 13 npm que le permitirán exprimir todo lo que sea posible de este sistema. Aquí consideraremos técnicas de varios tamaños, desde el uso de atajos hasta la personalización del comportamiento de
npm init
.

Muchos programadores usan npm diariamente. Esto significa que a la larga, incluso un pequeño ahorro de tiempo puede cambiar algo para mejor. Este material está destinado principalmente a desarrolladores principiantes y desarrolladores de nivel medio. Sin embargo, incluso si usted es un profesional, el autor del material espera que pueda encontrar aquí un par de cosas interesantes que no haya encontrado antes.
Si no está familiarizado con npm, tenga en cuenta que el programa que nos interesa está instalado con
Node.js. Si está trabajando en Windows, se recomienda que instale
Git Bash para reproducir algo de lo que se está discutiendo aquí.
1. Breves opciones para grabar comandos básicos
Comencemos con lo básico. Al pasar un poco de tiempo explorando versiones abreviadas de los comandos npm más comunes, se ahorrará mucho tiempo en el futuro.
- Instalar paquetes. Opción normal:
npm install
. Atajo: npm i
. - Ejecución de pruebas. Opción normal:
npm test
. Atajo: npm t
. - Llamada de ayuda Opción común:
npm --help
. Atajo: npm -h
. - Indicador de configuración global. Opción común:
--global
. Atajo: -g
. - La instalación del paquete marca como una dependencia de desarrollo. La opción habitual es
--save-dev
. Atajo: -D
. npm init
configuración predeterminada de npm init
. La opción habitual es npm init --yes
o npm init --force
. Atajo: npm init -y
o npm init -f
.
Ahora no necesita usar el
--save
o
-S
para guardar paquetes. Los paquetes se guardan por defecto. Y para instalar un paquete sin guardarlo, puede usar el indicador
--no-save
.
▍ Opciones de grabación cortas para comandos menos comunes
Aquí hay algunas abreviaturas más útiles, que, sin embargo, no se usan tan ampliamente como las que acabamos de revisar.
- Guardar un paquete como una dependencia opcional. La opción habitual:
--save-optional
. Atajo: -O
. - Guardar información sobre la versión exacta del paquete. La opción habitual es
--save-exact
. Atajo: -E
.
El uso del comando
npm install
con el
--save-bundle
o
-B
hace que las entradas en los paquetes instalados aparezcan en
package.json
, en la sección
bundledDependencies
. Estos paquetes se empaquetarán con el proyecto una vez publicados. Para crear un archivo tarball que contenga archivos de proyecto y paquetes enumerados en
bundledDependencies
, puede usar el comando
npm pack
.
▍ Abreviatura del directorio raíz
Normalmente, el símbolo de punto (
.
) Se utiliza para representar el directorio raíz de una aplicación o (según el contexto) para representar un punto de entrada a una aplicación. En npm, esto es lo que se establece como el valor de la propiedad
main
en el archivo
package.json
:
{ "main": "index.js" }
Esta taquigrafía se puede usar, por ejemplo, con comandos como
npx create-react-app
. Entonces, en lugar de ejecutar este comando en la forma de
npx create-react-app my-app
(que conducirá a la creación de una nueva carpeta
my-app
), puede ejecutar este comando de esta manera:
npx create-react-app .
(preste atención al punto que viene después del comando). Esto le permitirá crear un proyecto de plantilla de aplicación React en la carpeta en la que se encuentra en el momento en que se ejecuta el comando.
2. Establecer valores predeterminados para npm init
Al ejecutar constantemente el comando
npm init
para crear un nuevo proyecto, lo más probable es que ingrese los mismos datos una y otra vez en respuesta a las preguntas del sistema. Por ejemplo, es probable que usted sea el autor de la mayoría de los proyectos que cree. Para ahorrar tiempo al ingresar los mismos datos, puede establecer sus propios valores predeterminados para los campos correspondientes:
npm config set init.author.name "Joe Bloggs" npm config set init.author.email "joebloggs@gmail.com" npm config set init.author.url "joebloggs.com" npm config set init.license "MIT"
Para verificar la corrección de agregar dicha información al sistema, ingrese el
npm config edit
. Esto abrirá el archivo de configuración en el editor del sistema. Si desea editar los parámetros globales de npm, use el
npm config edit -g
.
Para volver a la configuración predeterminada, puede usar el siguiente script. Su primera línea elimina los datos de configuración del archivo, y la segunda lo llena con los valores predeterminados.
echo "" > $(npm config get userconfig) npm config edit
La secuencia de comandos anterior restablece los valores predeterminados para el usuario. El siguiente script restablece los valores predeterminados globales:
echo "" > $(npm config get globalconfig) npm config --global edit
3. Scripts multiplataforma
Cualquier código que se ejecute en la línea de comando puede encontrar problemas de compatibilidad. Esto es especialmente cierto para las incompatibilidades entre sistemas basados en Windows y Unix (esto incluye Mac y Linux). Esto no es un problema si usted y solo usted está trabajando en un determinado proyecto. Pero en muchos casos, la compatibilidad de secuencias de comandos multiplataforma es importante. Por ejemplo, trabajar independientemente del sistema operativo es una gran ventaja para cualquier proyecto de código abierto, capacitación o demostración.
Afortunadamente, resolver el problema de compatibilidad de script no es particularmente difícil. Tenemos varias opciones a nuestra disposición. Sin embargo, aquí me gustaría hablar sobre uno de ellos, sobre el uso del cual obtuve los mejores resultados. Este es un paquete
cross-env . Debe instalarse como una dependencia de desarrollo utilizando el
npm i -D cross-env
. Entonces debe poner
cross-env
delante de cada variable de entorno. Por ejemplo, podría verse así:
{ "scripts": { "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js" }
Descubrí que el paquete
cross-env
es la herramienta más conveniente para lograr la compatibilidad de scripts multiplataforma. Pero será útil que eche un vistazo a las siguientes dos herramientas populares que pueden ayudarlo a resolver este problema:
- Paquete Rimraf . Se puede instalar globalmente para ejecutar scripts multiplataforma.
- Paquete ShellJS . Esta es una implementación portátil de Node.js del shell de comandos de Unix.
4. Ejecución paralela de scripts
Para organizar la ejecución secuencial de comandos en el shell de Linux, se utiliza la construcción
&&
. ¿Qué hay de ejecutar scripts paralelos? Para lograr esto, puede elegir el paquete npm apropiado. Los paquetes más populares de este tipo son
concurrentemente y
npm-run-all . Aquí demostramos el uso del paquete concurrente.
Primero, el paquete seleccionado debe instalarse como una dependencia de desarrollo:
npm i -D concurrently
. Luego, en
package.json
puede usar una construcción de la siguiente forma:
{ "start": "concurrently \"command1 arg\" \"command2 arg\"" }
5. Ejecución de scripts ubicados en varios directorios
A veces te encuentras con aplicaciones que tienen varios archivos
package.json
ubicados en diferentes directorios. Sería conveniente, por ejemplo, ejecutar scripts declarados en ellos, estando en el directorio raíz del proyecto. Esto es mucho mejor que tener que viajar a diferentes carpetas cada vez que necesite ejecutar un script. Para hacer esto, puede usar los siguientes dos enfoques.
Para comenzar, puede usar el
cd
para navegar automáticamente al directorio deseado. Puede verse más o menos así:
cd folder && npm start && cd ..
Pero este problema se puede resolver de una manera más interesante. Consiste en utilizar el indicador
--prefix
, con el que puede especificar la ruta:
npm start --prefix path/to/your/folder
El siguiente es un ejemplo de aplicación de esta solución desde una aplicación real. Aquí necesitamos ejecutar
npm start
para las partes del cliente y el servidor del proyecto. Su código, respectivamente, se encuentra en las carpetas del
client
y del
server
.
"start": "concurrently \"(npm start --prefix client)\" \"(npm start --prefix server)\"",
6. Retrasar el lanzamiento del script hasta que un recurso esté disponible
Cuando se desarrollan aplicaciones de pila completa, a menudo surge la necesidad de ejecutar las partes del cliente y del servidor de la aplicación. El paquete de
espera le permite sincronizar la ejecución de ciertos procesos. En nuestro caso, es necesario que antes de iniciar la parte cliente de la aplicación, un cierto puerto esté disponible.
Por ejemplo, hay un script de desarrollo que se usa en una aplicación Electron cuya interfaz se escribe usando React. El script, que se usa
concurrently
, ejecuta la capa de presentación de la aplicación y la ventana Electron en paralelo. Pero usando el modo de
wait-on
puede hacer que la ventana Electron se abra solo cuando la capa de presentación React esté lista para usar y accesible en
http://localhost:3000
. Así es como se ve
wait-on
uso de
wait-on
:
"dev": "concurrently \"cross-env BROWSER=none npm run start\" \"wait-on http://localhost:3000 && electron .\"",
Además, el comportamiento estándar de los proyectos React es abrir automáticamente una ventana del navegador. Si usa React with Electron, esto no es necesario. Esto puede
BROWSER=none
utilizando la variable de entorno
BROWSER=none
, antes de la cual, en aras de la compatibilidad multiplataforma de la solución, se encuentra el comando
cross-env
.
7. Listado y trabajo con scripts disponibles
Para enumerar los scripts disponibles en
package.json
, solo vaya al directorio raíz del proyecto y ejecute el comando
npm run
en el terminal.
Pero hay una forma aún más conveniente de enumerar scripts. Al usarlo, el script deseado puede seleccionarse inmediatamente de la lista y ejecutarse. Para utilizar esta forma de trabajar con scripts, necesitamos instalar globalmente el
ntl
(Lista de tareas de Npm):
npm i -g ntl
Luego, en la carpeta del proyecto, debe ejecutar el comando
ntl
. Mostrará una lista de los scripts disponibles y le dará la oportunidad de seleccionar el script que desea ejecutar. Así es como se ve.
Usando el comando ntlEsta característica puede ser muy útil si no sabe exactamente qué scripts hay en el proyecto. También es bueno en los casos en que el programador desea reemplazar la entrada de un comando largo para ejecutar un script con la entrada de un comando corto y presionar rápidamente algunas teclas más en el teclado.
8. Ejecución de pre-scripts y post-scripts
Es posible que esté familiarizado con los scripts previos y posteriores a la
build
que le permiten ejecutar algún código antes y después de ejecutar el script de
build
. Tales guiones anteriores y posteriores se pueden definir para cualquier otro guión. Incluyendo aquellos cuyas descripciones son agregadas a p
ackage.json
por el programador.
Esto no solo le permite hacer el código más limpio, sino que también ayuda a ejecutar los scripts anteriores y posteriores de forma aislada.
9. Control de versiones de la aplicación.
En lugar de cambiar manualmente la versión de la aplicación, el programador puede usar comandos especiales
npm
. Para aumentar la parte correspondiente del número de versión de la aplicación, puede usar el
npm version
seguido de
major
,
minor
o
patch
:
// 1.0.0 npm version patch // 1.0.1 npm version minor // 1.1.0 npm version major // 2.0.0
Dependiendo de la frecuencia con la que actualice su aplicación, puede ahorrar tiempo aumentando automáticamente el número de versión cada vez que implemente una nueva versión de la aplicación. Por ejemplo, así:
{ "predeploy": "npm version patch" }
10. Edición de package.json desde la línea de comando
El archivo package.json es un archivo json normal, por lo que puede editarse directamente desde la línea de comandos utilizando la utilidad
json . Esto abre nuevas posibilidades en situaciones donde necesita modificar
package.json
, permitiéndole crear sus propias versiones abreviadas de comandos. Instale el paquete
json
nivel mundial:
npm install -g json
Luego, la utilidad
json
se puede usar para
editar rápidamente
el archivo usando el
modificador -I
. Por ejemplo, para agregar un nuevo script
foo
con la
bar
valor al archivo, puede usar el siguiente comando:
json -I -f package.json -e 'this.scripts.foo="bar"'
En la siguiente sección, verá un ejemplo más práctico del uso de la utilidad
json
.
11. Automatización de la configuración y apertura del repositorio.
Si hay una entrada de
"repository"
en su archivo
package.json
, esto significa que puede abrir la página del repositorio en el navegador utilizado por el sistema de manera predeterminada. Para hacer esto, use el comando
npm repo
.
Si su proyecto ya está conectado al repositorio remoto y tiene instalada la utilidad de línea de comandos
git
, esto significa que puede encontrar la dirección de su repositorio utilizando el siguiente comando:
git config --get remote.origin.url
Pero eso no es todo. Si, de acuerdo con el consejo anterior, instaló la utilidad
json
, puede usar el siguiente script para agregar automáticamente la información correcta del repositorio a
package.json
:
json -I -f package.json -e "this.repository=\"$(git config --get remote.origin.url)\""
12. Creando tu propio script para controlar el comando npm init
Ahora hablemos de resolver una tarea más grande. Es decir, vamos a desarrollar nuestro propio script que controla el funcionamiento del comando
npm init
, que acepta la URL del repositorio de GitHub y envía automáticamente la primera confirmación. Aquí hablamos sobre cómo crear tales scripts. Y en la siguiente sección, que será nuestro último consejo, hablaremos sobre trabajar con
git
.
Puede personalizar el comportamiento del comando
npm init
utilizando el
.npm-init.js
. Creemos dicho archivo en el directorio de inicio del usuario actual (en Windows generalmente es
C:/Users/<username>
, y en Mac es
/Users/<username>
). Después de eso, ejecute el siguiente comando que le dice a npm dónde se encuentra exactamente este archivo:
npm config set init-module ~\.npm-init.js
Antes de integrarse con
git
, veamos un ejemplo simple del
.npm-init.js
, que reproduce las preguntas que el sistema le hace al usuario cuando usa el comando
npm init
sin configuraciones adicionales:
module.exports = { name: prompt('package name', basename || package.name), version: prompt('version', '0.0.0'), decription: prompt('description', ''), main: prompt('entry point', 'index.js'), repository: prompt('git repository', ''), keywords: prompt(function (s) { return s.split(/\s+/) }), author: prompt('author', 'Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)'), license: prompt('license', 'ISC') }
Cada pregunta se basa en la siguiente plantilla:
nameInPackage: prompt('nameInPrompt', 'defaultValue')
Para indicar un cierto valor y no hacer una pregunta al usuario, simplemente elimine el método de
prompt
.
Si desea volver a la configuración estándar de
npm init
, simplemente elimine el
.npm-init.js
.
13. Enviar el primer commit al repositorio de GitHub usando npm init
Para ejecutar comandos
git
en el
.npm-init.js
necesitamos encontrar una manera de trabajar con la línea de comandos. Puede usar el módulo
child_process
para
child_process
. Lo conectamos en la parte superior del archivo, y dado que solo necesitamos la función
execSync
, solo la importamos, usando la desestructuración:
const { execSync } = require('child_process');
Además, crearemos una función auxiliar que muestre los resultados de nuestra función en la consola:
function run(func) { console.log(execSync(func).toString()) }
Y finalmente, creemos el bloque de solicitud apropiado para manejar la URL del repositorio de GitHub. Si el script tiene la URL, crearemos el archivo
README.md
y enviaremos el primer commit al repositorio.
Entonces, uno de los elementos del objeto
.npm-init.js
debería ser el siguiente código:
repository: prompt('github repository url', '', function (url) { if (url) { run('touch README.md'); run('git init'); run('git add README.md'); run('git commit -m "first commit"'); run(`git remote add origin ${url}`); run('git push -u origin master'); return url; })
Así es como debe verse el código completo para el archivo
.npm-init.js
después de esta adición:
const { execSync } = require('child_process'); function run(func) { console.log(execSync(func).toString()) } module.exports = { name: prompt('package name', basename || package.name), version: prompt('version', '0.0.0'), decription: prompt('description', ''), main: prompt('entry point', 'index.js'), keywords: prompt(function (s) { return s.split(/\s+/) }), author: prompt('author', 'Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)'), license: prompt('license', 'ISC'), repository: prompt('github repository url', '', function (url) { if (url) { run('touch README.md'); run('git init'); run('git add README.md'); run('git commit -m "first commit"'); run(`git remote add origin ${url}`); run('git push -u origin master'); return url; }), }
Así es como se ve el archivo
package.json
que el sistema crea usando este
.npm-init.js
:
{ "name": "Custom npm init", "version": "0.0.0", "decription": "A test project, to demonstrate a custom npm init script.", "main": "index.js", "keywords": [], "author": "Joe Bloggs <joe.bloggs@gmail.com> (joebloggs.com)", "license": "ISC", "repository": { "type": "git", "url": "git+https://github.com/JoeBloggs/custom.git" }, "bugs": { "url": "https://github.com/JoeBloggs/custom/issues" }, "homepage": "https://github.com/JoeBloggs/custom#readme" }
Al configurar el proceso de inicialización de nuevos proyectos, puede ir más allá. Por ejemplo, para asegurarse de que al crear un proyecto, se cree un nuevo repositorio para él.
Resumen
Espero que este material te haya ayudado a ver lo que puedes lograr con npm. Quiero creer que ha encontrado algo aquí que le permitirá trabajar de manera más productiva, ya sea que estemos hablando de usar versiones abreviadas de comandos, de scripts de
package.json
o de configurar
npm init
para satisfacer sus necesidades.
Estimados lectores! ¿Automatizas el trabajo con npm?
