← Усі статті

Node.js: Factory і Strategy для крос-платформенного npm-пакета

Порт EADDRINUSE на Windows, macOS і Linux — без if/else по ОС. Strategy, Factory, TypeScript-контракти та захист від shell injection.

Node.js: Factory і Strategy для крос-платформенного npm-пакета
Зміст

Коротко

Крос-платформені CLI на Node.js часто перетворюються на лабіринт if (process.platform === …). На Dev.to показали патерни Strategy і Factory для утиліти EADDRINUSE: команди різних ОС ховаються за інтерфейсами, ядро лишається тестованим.

Що сталося

Типова біль: локальний сервер не стартує, бо порт зайнятий. На Windows потрібні netstat і taskkill, на macOS і Linuxlsof і kill. Якщо розмазати ці гілки по всьому коду, unit-тести перетворюються на моки shell, а кожна нова ОС — ще один switch.

Автор будує шар так. TypeScript-інтерфейси описують контракт без рядків shell у бізнес-логіці. Factory обирає платформенну Strategy. Виконавець команд без стану запускає argv-масиви — менший ризик внедрення в shell.

Зверху — спільний API і CLI на одному ядрі. Приклад домену — «звільнити порт перед dev-сервером», але той самий каркас підходить для будь-якої різниці середовищ: бінарники, мережеві утиліти, обробка помилок.

Чому це важливо

npm-пакети, що «працюють на Mac», регулярно падають у Linux CI або у колег на Windows. Strategy робить поведінку передбачуваною і підмінною в тестах. Будь-який адаптер до зовнішніх систем виграє від розділення «політика vs механізм».

На практиці

  1. Опишіть інтерфейс домену до першої shell-команди.
  2. Одна Factory на вибір платформи.
  3. Runner приймає масив аргументів, не рядок exec(`kill ${pid}`).
  4. Тести: fake Strategy з записом викликів; інтеграційні — matrix по ОС у CI.
  5. CLI — тонка обгортка над тим самим сервісом з "exports".

Підсумок

Factory і Strategy — спосіб тримати крос-платформенний npm-пакет читабельним. Матеріал на Dev.to корисний, якщо утиліти роздуваються від switch (os.platform()).