Por Joan León y David Garcia
Schibsted Spain
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
NVM Repo
$ > nvm ls-remote
$ > nvm install v6.0.0
Las versiones pares son las LTS
$ > nvm list
v4.3.1
v4.4.1
-> v5.0.0
v5.2.0
v6.0.0
$ > nvm use v6.0.0
$ > nvm alias miProyecto 6
$ > miProyecto -> 6 (-> v6.0.0)
nvm alias default > setea versión por defecto
$ > nvm unalias miProyecto 6
$ > miProyecto -> 6 (-> v6.0.0)
$ > nvm install 6.0.0 --reinstall-packages-from 5.0.0
$ > nvm which 6.0.0 - Indica la ruta de instalación
Inicializar un proyecto npm
$ > npm init
$ > npm init -y // Sin asistente
Lanza asistente de creación de package.json si no añadimos el flag -y
Estructura del package.json
{
"name": "@schibstedspain/sui-card",
"version": "7.1.0",
"main": "dist/",
"scripts": {
"dist": "npm run dist:scripts && npm run dist:styles",
"test": "mocha --compilers js:babel-core/register --recursive",
},
"dependencies": {
"classnames": "2.2.0"
},
"devDependencies": {
"@schibstedspain/sui-multimedia": "0.1",
}
}
Ejemplo resumido de archivo de meta-datos del proyecto npm
Instalación de paquetes npm
$ > npm install [nombre del package]
$ > npm install [nombre del package]@3.4.12 // Versión específica
$ > npm i [nombre del package] // shortcut
prueba $ > npm isntall
Instalación de paquetes locales
$ > npm install [nombre del package] -S
$ > npm install [nombre del package] --save
Añadimos como dependencia en package.json
Instalación de paquetes como dependencia de desarrollo
$ > npm install [nombre del package] -D
$ > npm install [nombre del package] --save-dev
Añadimos como dependencia de desarrollo en package.json
Instalación de paquetes globales
$ > npm install [nombre del package] -g
$ > npm install [nombre del package] --global
Estará disponible a nivel de usuario
Instalación de múltiples paquetes
$ > npm install [package1] [package2] [package3] --save
También podemos añadir múltiples argumentos
Actualización de paquetes
$ > npm update [package]
Obtenemos la versión más reciente del repositorio de npm
Desinstalación de paquetes
$ > npm uninstall [package] // sólo borramos carpeta node_modules
$ > npm uninstall [package] --save // eliminamos dep
$ > npm uninstall [package] --save-dev // eliminamos devDep
$ > npm un [package]
Utiliza el flag --save o --save-dev para eliminarlo del package.json
Enlazar paquetes locales
$ > npm link // En el paquete a enlazar
$ > npm link [package] // En el paquete que carga la dependencia
Crea un Symlink a la carpeta node_modules local
...a veces no funciona :(
...acepta un único nivel de recursividad
Desenlazar paquetes
$ > npm unlink // En el paquete a desenlazar
$ > npm unlink [package] // En el paquete que cargaba la dependencia
Al desenlazar un paquete necesitaremos volver a ejecutar npm install
Publicar un paquete a npm
$ > npm publish
Un paquete no puede volver a re-publicarse con la misma versión
Si despublicas un paquete puedes romper Internet
Mostrar información de un paquete
$ > npm view [package]
$ > npm view [package] versions
Lee metadatos del package.json
Ejecutar un script
"scripts": {
"sass": "node-sass -o dist/css src/scss"
}
$ > npm run sass
Mediante 'npm run [script]' podemos ejecutar scripts definidos en el package.json
Agrupando scripts
"scripts": {
"lint:sass": "sass-lint src/**/*.scss -c -v",
"lint:js": "eslint src/js/**/*.js",
"lint": "npm run lint:sass && npm run lint:js"
}
$ > npm run lint
$ > npm run lint:sass
$ > npm run lint:js
'npm run lint' ejecutaría 'npm run lint:sass' y 'npm run lint:js'
npm Start
"scripts": {
"start": "npm run start:open && npm run start:server",
"start:server": "webpack-dev-server",
"start:open": "opener http://localhost:8080"
}
$ > npm run start
$ > npm start
script standar para lanzar un proyecto npm
'npm start' no necesita especificar 'run'
ciclo de ejecución de scripts
"scripts": {
"predist": "rimraf ./dist/*",
"dist": "webpack",
"postdist": "copyfiles ./dist/* ./docs/ && gh-pages -d docs"
}
$ > npm run dist
npm buscará scripts con prefijos 'pre' y 'post' y si existen los ejecutará antes y después respectivamente
Instalación de node-sass
"scripts": {
"css": "node-sass -o dist/css src/scss --output-style compressed --source-map-embed"
}
$ > npm install node-sass --save-dev
$ > npm run css
node-sass es un wrapper de 'LibSass' sobre node que nos permite preprocesar archivos '.scss'
Instalación de autoprefixer
"scripts": {
"autoprefixer": "postcss -u autoprefixer --autoprefixer.browsers '> 5%, ie 9' -r dist/css/*"
}
$ > npm install autoprefixer postcss-cli --save-dev
$ > npm run autoprefixer
node-sass es un wrapper de 'LibSass' sobre node que nos permite preprocesar archivos '.scss'
Instalación de BabelJS
"scripts": {
"build:js": "babel src/js --out-dir dist/js"
}
$ > npm install babel-cli babel-preset-es2015 --save-dev
$ > npm run build:js
BabelJS es un transpiler de archivos JS que nos permite utilizar versiones futuras de Javascript
Instala en la raiz de tu proyecto un archivo .babelrc con la configuración
Linting de Sass y Javascript con Eslint
"scripts": {
"lint:sass": "sass-lint src/**/*.scss -c -v",
"lint:js": "eslint src/js/**/*.js",
"lint": "npm run lint:sass && npm run lint:js"
}
$ > npm install eslint sass-lint babel-eslint --save-dev
$ > npm run lint
Eslint es un potente linter que soporta Sass, JS y JSX
Instala en la raiz de tu proyecto un archivo .eslintrc.json con la configuración
Instala en la raiz de tu proyecto un archivo .sass-lint.yml con la configuración
Test unitarios con MochaJS y Chai
"scripts": {
"test": "mocha --compilers js:babel-register",
"test:watch": "mocha --compilers js:babel-register --watch"
}
$ > npm install mocha chai --save-dev
$ > npm run test
$ > npm run test:watch // modo TDD
MochaJS es un framework de test unitarios. Además instalaremos la librería de aserciones Chai
Pre-commit hook
"pre-commit": [
"lint",
"test"
]
$ > npm install precommit-hook --save-dev
El pre-commit hook no nos permitirá publicar a github si no pasamos las reglas especificadas por los linters
Watching sass, js y html
"scripts": {
"watch:css": "onchange src/scss/*.scss -- npm run build:css",
"watch:js": "onchange src/js/*.js -- npm run build:js",
"watch:html": "onchange dist/*.html -- npm run serve"
}
$ > npm install onchange --save-dev
$ > npm run watch:css
$ > npm run watch:js
$ > npm run watch:html
OnChange nos permite detectar cambios en archivos para poder lanzar scripts npm
Recargando el navegador con BrowserSync
"scripts": {
"serve": "browser-sync start --server dist --files dist",
"dev": "parallelshell 'npm run watch:css' 'npm run watch:js' 'npm run serve'"
}
$ > npm install browser-sync parallelshell --save-dev
$ > npm run dev
ParallelShell nos permite tener múltiples procesos ejecutándose al mismo tiempo