JS Tower
Node.jsМодуль 2: Экосистема npm

npm scripts

Автоматизация задач с npm

Цель урока

В этом уроке ты научишься:

  • Создавать npm scripts
  • Использовать pre/post хуки
  • Работать с переменными окружения

Базовые скрипты

{
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "test": "jest",
    "build": "tsc"
  }
}

Запуск

# Стандартные скрипты
npm start
npm test

# Пользовательские скрипты
npm run dev
npm run build

Примечание

start и test можно запускать без run: npm start, npm test.


Pre и Post хуки

{
  "scripts": {
    "prebuild": "rm -rf dist",
    "build": "tsc",
    "postbuild": "cp package.json dist/",
    
    "pretest": "npm run lint",
    "test": "jest",
    "posttest": "echo 'Тесты завершены'"
  }
}

Порядок выполнения npm run build:

  1. prebuild
  2. build
  3. postbuild

Передача аргументов

{
  "scripts": {
    "test": "jest",
    "test:watch": "jest --watch",
    "test:coverage": "jest --coverage"
  }
}
# Передача аргументов через --
npm test -- --verbose
npm run test -- --watch

Переменные окружения

В скриптах

{
  "scripts": {
    "start": "NODE_ENV=production node index.js",
    "dev": "NODE_ENV=development nodemon index.js"
  }
}

cross-env (кроссплатформенность)

npm install cross-env --save-dev
{
  "scripts": {
    "start": "cross-env NODE_ENV=production node index.js",
    "dev": "cross-env NODE_ENV=development nodemon index.js"
  }
}

dotenv

npm install dotenv
// index.js
require('dotenv').config();

console.log(process.env.DATABASE_URL);
# .env
DATABASE_URL=mongodb://localhost:27017/mydb
API_KEY=secret123

Параллельное выполнение

npm-run-all

npm install npm-run-all --save-dev
{
  "scripts": {
    "lint": "eslint .",
    "test": "jest",
    "build": "tsc",
    
    "check": "npm-run-all lint test",
    "check:parallel": "npm-run-all --parallel lint test",
    
    "dev": "npm-run-all --parallel dev:*",
    "dev:server": "nodemon server.js",
    "dev:client": "webpack serve"
  }
}

concurrently

npm install concurrently --save-dev
{
  "scripts": {
    "dev": "concurrently \"npm run server\" \"npm run client\"",
    "server": "nodemon server.js",
    "client": "webpack serve"
  }
}

Полезные скрипты

{
  "scripts": {
    "start": "node dist/index.js",
    "dev": "nodemon src/index.ts",
    "build": "tsc",
    "build:watch": "tsc --watch",
    
    "lint": "eslint src/",
    "lint:fix": "eslint src/ --fix",
    
    "format": "prettier --write src/",
    "format:check": "prettier --check src/",
    
    "test": "jest",
    "test:watch": "jest --watch",
    "test:coverage": "jest --coverage",
    
    "clean": "rm -rf dist node_modules",
    "reinstall": "npm run clean && npm install",
    
    "prepare": "husky install",
    "prepublishOnly": "npm run build && npm test"
  }
}

Практика

Задание 1: Базовые скрипты

Задача: Создай скрипты для запуска, разработки и тестирования.

Решение:

{
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "test": "jest"
  }
}

Задание 2: Pre/Post хуки

Задача: Добавь очистку перед сборкой.

Решение:

{
  "scripts": {
    "prebuild": "rm -rf dist",
    "build": "tsc"
  }
}

Проверь себя

  1. Как запустить пользовательский скрипт?
  2. Что такое pre/post хуки?
  3. Как передать аргументы в скрипт?