Бинарные скрипты в Node.js-пакетах представляют собой исполняемые файлы, которые становятся доступными как команды в терминале после установки пакета. Они используются для создания CLI-инструментов, автоматизации задач, генераторов кода и сборщиков.
Ключевая идея заключается в том, что пакет может экспортировать не только программный API для использования в коде, но и отдельную точку входа, запускаемую из командной строки.
bin в
package.jsonПоле bin описывает сопоставление между командой,
доступной в терминале, и файлом, который будет выполнен при её
вызове.
Существует два основных варианта объявления.
{
"name": "my-tool",
"version": "1.0.0",
"bin": "./cli.js"
}
В этом случае имя команды автоматически совпадает с именем пакета
(my-tool), а выполнение будет перенаправлено на файл
cli.js.
{
"name": "my-tool",
"version": "1.0.0",
"bin": {
"my-tool": "./dist/cli.js",
"my-tool-init": "./dist/init.js"
}
}
Здесь создаются две независимые команды:
my-toolmy-tool-initКаждая указывает на отдельный исполняемый файл.
При установке пакета через npm или yarn происходит автоматическое создание ссылок на исполняемые файлы.
Процесс включает следующие шаги:
bin в package.jsonnode_modules/.binТаким образом, команда становится доступной без глобальной установки пакета.
node_modules/.binКаталог node_modules/.bin играет ключевую роль в
механизме CLI-инструментов.
При установке пакета с bin-полем туда добавляются
исполняемые ссылки:
node_modules/
.bin/
my-tool -> ../my-tool/cli.js
Во время выполнения npm-скриптов эта директория автоматически добавляется в переменную окружения PATH, что позволяет вызывать команды напрямую:
npm run build
Если внутри build используется my-tool, он
будет найден автоматически.
Чтобы файл мог запускаться как CLI-утилита, в начале используется shebang:
#!/usr/bin/env node
console.log("CLI запущен");
Shebang сообщает операционной системе, что файл должен выполняться через Node.js интерпретатор.
Без этого строки файл не будет корректно исполняться как команда.
В Unix-подобных системах файл должен иметь право на выполнение:
chmod +x cli.js
Однако при установке через npm это обычно обрабатывается автоматически.
Parcel использует механизм bin для предоставления
команды parcel.
Внутри пакета Parcel определён исполняемый файл, который становится точкой входа CLI:
{
"name": "parcel",
"bin": {
"parcel": "./lib/cli.js"
}
}
После установки:
npm install parcel
становится доступной команда:
parcel build index.html
CLI-слой Parcel отвечает за:
Архитектура Parcel и подобных инструментов обычно разделяет:
bin)CLI файл обычно выполняет минимальную работу:
#!/usr/bin/env node
import { run } from "@parcel/core";
run(process.argv.slice(2));
Такой подход позволяет:
npm install parcel
Команда доступна только внутри проекта:
npx parcel index.html
или через npm scripts:
{
"scripts": {
"dev": "parcel index.html"
}
}
npm install -g parcel
Команда доступна во всей системе:
parcel index.html
Однако в современных проектах предпочтение отдаётся локальной
установке с npx, чтобы фиксировать версии.
npx и выполнение бинарниковnpx ищет бинарные команды в:
node_modules/.binПример:
npx parcel build index.html
Запускает бинарник Parcel без глобальной установки.
Пакеты могут предоставлять несколько CLI-команд:
{
"bin": {
"parcel": "./cli.js",
"parcel-init": "./init.js",
"parcel-analyze": "./analyze.js"
}
}
Каждая команда может:
binПри использовании TypeScript исходный CLI обычно находится в
src/cli.ts, но в bin указывается уже
скомпилированный файл:
{
"bin": {
"my-tool": "./dist/cli.js"
}
}
Критически важно:
.ts файл в binВ монорепозиториях бинарные команды часто проксируются через workspace-пакеты.
Пример структуры:
packages/
cli/
package.json (bin)
core/
CLI пакет:
{
"name": "@repo/cli",
"bin": {
"repo": "./dist/cli.js"
}
}
Это позволяет запускать:
repo build
при этом логика находится в другом пакете.
npm linkДля разработки CLI-инструментов используется:
npm link
Процесс:
Это особенно важно при разработке инструментов вроде Parcel или его плагинов.
При вызове команды:
parcel build
операционная система:
parcel в PATHnode_modules/.binНа Windows вместо символических ссылок используются shim-файлы
(.cmd), создаваемые npm.
Например:
parcel
parcel.cmd
parcel.ps1
Это обеспечивает единообразие запуска CLI на всех платформах.
binФайл не запускается как команда.
"bin": "./src/cli.js"
если файл не попадает в npm-пакет, команда ломается.
TypeScript/ESBuild не сгенерировали dist.
CLI не исполняется напрямую.
bin
в экосистеме инструментов сборкиПоле bin является фундаментом CLI-инструментов, включая
сборщики, линтеры и генераторы кода. В случае Parcel оно
обеспечивает:
Механизм остаётся одинаковым для всех версий Node.js-инструментов, что делает его базовым строительным блоком CLI-экосистемы JavaScript.