Skip to content

Search

Match titles, tags, and descriptions. Arrow keys to move,Enter to open,Esc to close.

Open from the page (not while typing in a field):/·KorCtrlK

    Permalink to this article

    pre-commit

    Development Workflow with Husky for Next.js, ESLint, and Vitest Integration

    A practical Husky setup for Next.js projects so linting, testing, and pre-push checks become part of the team workflow instead of a last-minute cleanup step.

    Practical writing from the same lane as the work: architecture decisions, delivery clarity, and engineering systems.

    Tutorial

    Read the Previous Post: Building the Best Next.js TypeScript ESLint Configuration

    GitHub Repository

    Implementing a robust pre-commit system can significantly reduce pull request review time. By enforcing ESLint rules, ensuring passing tests, and maintaining a stable build, developers can avoid pushing broken builds and the subsequent need for corrective commits.

    This approach improves code quality while reducing CI/CD expenses.

    Setting Up Pre-commit and Pre-push

    Start by installing the required dependencies:

    bash
    npm install --save-dev husky lint-staged

    To organize Husky within a config folder, modify your package.json:

    jsonpackage.json
    {
      "scripts": {
        "dev": "next dev",
        "build": "next build",
        "start": "next start",
        "lint": "next lint",
        "test": "vitest",
        "pre-commit": "lint-staged && vitest run",
        "pre-push": "eslint . --fix --max-warnings=0 && npm run build",
        "prepare": "husky install config/.husky"
      },
      "lint-staged": {
        "*.{js,jsx,ts,tsx}": [
          "eslint --fix"
        ]
      }
    }

    This establishes commands for pre-commit and pre-push operations. Customize according to your project requirements.

    Description of Actions

    The pre-commit script executes linting with fixes and runs tests before allowing commits:

    jsonpackage.json
    "pre-commit": "lint-staged && vitest run"

    The pre-push script enforces strict linting standards and triggers the build process:

    jsonpackage.json
    "pre-push": "eslint . --fix --max-warnings=0 && npm run build"

    Execute the prepare command to generate the hook files:

    bash
    npm run prepare

    This generates the necessary files in the config/.husky directory. These files allow Husky to execute the specified commands whenever a commit or push is made.

    If you ever need to bypass Husky’s verification — for example during a work in progress — you can use --no-verify:

    bashterminal
    git commit . -m 'quick fix' --no-verify

    Bypassing verification risks overlooking console errors and is not recommended as a regular practice.

    Conclusions

    • Husky pre-commit and pre-push hooks improve code stability through enforced linting and testing protocols.
    • Organizing configurations within a dedicated config folder maintains project cleanliness and simplifies maintenance.
    • Early error detection reduces corrective commits and workflow disruptions.
    • While bypass options exist, circumventing verification processes compromises code reliability.
    • Integrating Husky fosters quality-focused development practices and a culture of continuous improvement.

    Next Post: Storybook in Action with Next.js, Tailwind and TypeScript

    Share this piece
    LinkedInXWhatsApp

    Powered by GitHub Discussions — sign in with GitHub to join the conversation, orreply on GitHub.

    Related writing

    Keep reading in the same thread.

    More writing from a similar lane — overlapping topics, tooling choices, and the tradeoffs behind the article you just read.

    Browse all posts