Для начала теория:
1. Сам репозиторий npm располагается по адресу
https://registry.npmjs.org/
работает он по принципу http+rest+json
2. Метаданные конкретного пакета можно получить по адресам:
https://registry.npmjs.org/$package
https://registry.npmjs.org/$package/
$version
где
$package - имя пакета,
$version - нужная версия или latest для самой последней
3. в методанных по адресам
https://registry.npmjs.org/$package/
$version обязательно присутствует объект dist содержащий поля shasum (контрольная сумма архива) и tarball (ссылка на сам архив упакованный tar+gz), качаем архив по ссылке, при необходимости проверяем контрольную сумму
4. там же могут содержаться объекты dependencies и devDependencies, формат как в файле package.json
Базовую теорию рассказал, начать с этим писать свой npm/yarn уже можно, но не нужно
Действуем:
1. Пишем скрипт, который выкачивает tarball пакета и всего дерева его зависимостей и запускаем на машине где есть интернет
2. Копируем все это на целевую машину
3а. Устанавливаем все пакеты как расписал
Константин Китманов через npm install ./package.tgz
Однако npm может опять же захотеть интернет, чтоб подтянуть зависимости, поэтому:
3б. Делаем установку вручную:
в папке проекта создадим node_modules:
mkdir node_modules
распакуем туда архивы, package меняем на имя пакета, version - на версию:
tar -xzf package-version.tgz node_modules/package
если у нас при подтягивании зависимостей получилось 2 версии одного пакета, то старшую ложим в свой node_modules а младшие в node_modules тех пакетов, которые затребовали такую версию
некоторые пакеты потребуют компиляции c++ части, тут понадобится python2 и build-essential в системе, которые можно поставить из deb пакетов (как выдернуть deb пакет из любого репозитория apt расписывать не буду, там принципы похожие), для компиляции достаточно запустить:
npm build path/to/unpacked/package