Разговор об опасных ямах зеркалирования NPM

Node.js JavaScript
Разговор об опасных ямах зеркалирования NPM

автор:JowayYoung
склад:Github,CodePen
Блог:Официальный сайт,Наггетс,думаю нет,Знай почти
Нет публики:Интерфейс IQ
Специальное заявление: Нелегко быть оригинальным, и перепечатка или плагиат не допускаются без разрешения.Если вам нужно перепечатать, вы можете связаться с автором для получения разрешения.

предисловие

Из-за внутренней сетевой среды реализацияnpm iВ процессе установки зависимостей проекта вы обязательно столкнетесь安装过慢или安装失败Случай. Обычно опытные студентыNodeКстатизеркало нпмУстановите внутреннее зеркало Taobao.

npm config set registry https://registry.npm.taobao.org/

Это позволит справиться с большинствомnpm iустановки. Конечно, это решает только большую часть安装过慢или安装失败При углубленной разработке проекта обязательно будут какие-то странные ситуации, поэтому автор и написал эту статью.

Управление изображениями

Вы также можете столкнуться с такой ситуацией, при разработке проекта используйте淘宝镜像, но публикуетсторонние модули npmнеобходимо использовать, когда原镜像. Прежде чем приступить к решению этих странных ситуаций, рекомендуется использоватьИнструмент управления образами NPM.

  • исходное изображение:https://registry.npmjs.org/
  • зеркало таобао:https://registry.npm.taobao.org/

Главный геройnrm, это бесплатный переключатель в любое время и в любом местезеркало нпминструменты управления. С его помощью решается упомянутая выше проблема, когда какое зеркало использовать. Далее следует установить его и кратко объяснить, как его использовать.

Установить

npm i -g nrm

Посмотреть зеркало

nrm ls

Добавить зеркало

nrm add <name> <url>

удалить изображение

nrm del <name>

тестовое изображение

nrm test <name>

использовать зеркало

nrm use <name>

Посмотреть текущее зеркало

nrm current

После ознакомления с командой следующая волна операций выглядит следующим образом,原镜像а также淘宝镜像Переключайтесь между ними по желанию. Конечно, если у вас хорошая память, вам не нужно использовать этот инструмент, ха-ха.

nrm操作

Засыпать яму

имеютnrmПри переходе на зеркало Taobao скорость установки будет значительно выше, но устанавливаемые модули зависят отC++模块Это отстой. Неявно устанавливается во время установкиnode-gyp,node-gypскомпилировать эти зависимостиC++模块модуль.

Итак, возникает вопрос,node-gypЗависит от первой компиляцииNode源码, так спокойно иди скачивайNode. Хотя ранее ставил淘宝镜像, но здесь бесполезно. Таким образом, из-за внутренней сетевой среды я снова столкнулся с этим.安装过慢или安装失败Случай.

отличноnpm configпредоставил параметрdisturl, он может установить адрес зеркала узла и, конечно же, указать его на домашнее зеркало Taobao. Таким образом, эти зависимости могут быть легко установленыC++模块модуль.

npm config set disturl https://npm.taobao.org/mirrors/node/

Проблема решается шаг за шагом, а затем возникает другая проблема. Обычно все используютnode-sassкак зависимость развития проекта, ноnode-sassустановка всегда была головной болью.

Установитьnode-sassкогда, вinstall阶段загрузит файл с Github под названиемbinding.nodeфайл, покаGitHub Releasesфайлы размещены вs3.amazonaws.comВключен, этот URL-адрес был Q, поэтому его нельзя установить снова.

Однако путей больше, чем трудностей, отnode-sassОдин из них можно найти в официальной документацииsass_binary_siteпараметр, он может установить адрес зеркала Sass и, несомненно, указать его на домашнее зеркало Taobao. Это облегчит установкуnode-sass.

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/

На самом деле подобных модулей несколько, для удобства я их все же поместил в исходники.镜像参数Соответствует зеркалу Taobao镜像地址Подобрали, унифицированные настройки просты в установке. Ниже приведены конфигурации зеркальных адресов нескольких модулей, обычно используемых автором, пожалуйста, примите их!

Они есть:Sass,Sharp,Electron,Puppeteer,Phantom,Sentry,Sqlite,Python.

Конфигурация зеркального адреса

npm config set <name> <url>, торопитьсяКопия в один клик, постоянное использование. Будьте особенно внимательны, не пропустите последний/.

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm config set sharp_dist_base_url https://npm.taobao.org/mirrors/sharp-libvips/
npm config set electron_mirror https://npm.taobao.org/mirrors/electron/
npm config set puppeteer_download_host https://npm.taobao.org/mirrors/
npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/
npm config set sentrycli_cdnurl https://npm.taobao.org/mirrors/sentry-cli/
npm config set sqlite3_binary_site https://npm.taobao.org/mirrors/sqlite3/
npm config set python_mirror https://npm.taobao.org/mirrors/python/

С помощью этой волны операций выполнитеnpm iПри установке вышеуказанных модулей вы сможете наслаждаться отечественной скоростью. Если позволяют условия, рекомендуется переместить эти файлы изображений на свой сервер или сервер компании,镜像地址Просто укажите на свой сервер. Построить такой зеркальный сервер в интранете компании, а он все время установлен.Это то, чем сейчас занимается команда, где автор.

npm config set electron_mirror https://xyz/mirrors/electron/

Анализ исходного кода

часто застреваетnode-sassНапример, следующие товары являются мошенническимиnode-sass/lib/extensions.jsизисходный код, видно что пойдет по умолчаниюGitHub ReleasesАдрес хостинга , причины также были проанализированы выше и здесь повторяться не будут.

function getBinaryUrl() {
  const site = getArgument("--sass-binary-site")
    || process.env.SASS_BINARY_SITE
    || process.env.npm_config_sass_binary_site
    || (pkg.nodeSassConfig && pkg.nodeSassConfig.binarySite)
    || "https://github.com/sass/node-sass/releases/download";
  const result = [site, "v" + pkg.version, getBinaryName()].join("/");
  return result;
}

И другие модули имеют аналогичный код, например.puppeteerэта установкаChroniumизисходный код, Заинтересованные студенты перейдут к исходному коду, там же.

async function download() {
  await compileTypeScriptIfRequired();
  const downloadHost =
    process.env.PUPPETEER_DOWNLOAD_HOST
    || process.env.npm_config_puppeteer_download_host
    || process.env.npm_package_config_puppeteer_download_host;
  const puppeteer = require("./index");
  const product =
    process.env.PUPPETEER_PRODUCT
    || process.env.npm_config_puppeteer_product
    || process.env.npm_package_config_puppeteer_product
    || "chrome";
  const browserFetcher = puppeteer.createBrowserFetcher({
    product,
    host: downloadHost,
  });
  const revision = await getRevision();
  await fetchBinary(revision);
  // 还有很多
}

Сводка по пит-товарам

из-заnode-sassЭто зависимость разработки проекта, которую все часто используют, а также модуль с длительным временем установки и наиболее распространенными сообщениями об ошибках.Здесь я потрачу несколько глав на анализ и решение проблем, с которыми можно столкнуться.

node-sassПричины сбоя установки не ограничиваются вышеперечисленными ситуациями, мы можем проанализировать и получить прорывы из процесса установки для решения проблемы. согласно сnpm i node-sassДля анализа выходной информации может быть получен следующий процесс.

  • Тестовые заданияnode_modulesизnode-sassСуществует ли он и совпадает ли текущая установленная версия
    • Yes: пропустить, завершить процесс установки
    • No: перейти к следующему шагу
  • отNPMскачатьnode-sass
  • обнаружить全局缓存или项目缓存Будь тамbinding.node
    • Yes: пропустить, завершить процесс установки
    • No: перейти к следующему шагу
  • отGithub Releasesскачатьbinding.nodeи кешировать его глобально
    • Success: записать информацию о версииpackage-lock.json
    • Error: перейти к следующему шагу
  • попробуй скомпилить локальноbinding.node
    • Success: записать информацию о версииpackage-lock.json
    • Error: вывод сообщения об ошибке

не трудно увидеть,node-sassзависит от бинарникаbinding.node, не только изNPMскачать本体также нужно отGithub Releasesскачатьbinding.node.


Из реальной ситуации,node-sassпоявляться安装过慢или安装失败Могут быть следующие ситуации:

Зеркала NPM размещены на внешних серверах.

Как было сказано выше, здесь это описывать не будем.Решение состоит в следующем.

nrm use taobao

Спокойно скачать во время установкиnode-gyp

Как было сказано выше, здесь это описывать не будем.Решение состоит в следующем.

npm config set disturl https://npm.taobao.org/mirrors/node/

binding.nodeФайлы размещены на иностранных серверах

Как было сказано выше, здесь это описывать не будем.Решение состоит в следующем.

npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/

Версия Node несовместима с версией node-sass.

node-sassСовместимость версий очень плохая. Необходимо использовать в соответствии с версией Node. Подробную информацию см.node-sass-version-association, таблица сравнения версий повторного использования официальных документов выглядит следующим образом.

NodeJS Minimum node-sass version Node Module
Node 14 4.14+ 83
Node 13 4.13+ 79
Node 12 4.12+ 72
Node 11 4.10+ 67
Node 10 4.9+ 64
Node 8 4.5.3+ 57

воплощать в жизньnpm iПеред установкой зависимостей убедитесь, что текущая версия Node иnode-sassВерсии совместимы.

Версия binding.node в глобальном кеше несовместима с версией Node.

если используется локальноnvmилиnВыполняется управление версией узла, и версия узла была переключена, что может появиться в процессе установки.Windows/OS X/Linux 64-bit with Node.js 12.xТакая подсказка, такая ситуация тоже ситуация, с которой я часто сталкиваюсь (у меня на компьютере установлено более 30 версий Node и я часто переключаюсь туда-сюда 😂).

Это потому чтоnode-sassВерсия и версия Node связаны (см. таблицу выше), и после изменения версии Node соответствующая версия не может быть сопоставлена ​​в глобальном кеше.binding.nodeфайл, вызывающий сбой установки. Согласно подсказке об ошибке, очистите кеш NPM и переустановите его.Решение заключается в следующем.

npm cache clean -f

npm rebuild node-sass

Так что, если вам нечего делать, не переключайте версии Node туда-сюда, например, мне нужно установить очень много версий Node, слишком много старых проектов.

Переустановите после неудачной установки

Возможно, у вас нет прав на удаление установленного контента, что может вызвать некоторые проблемы при переустановке.node_modulesУдали все и переустанови.

Удалить в системах Mac и Linuxnode_modulesБыстрее, но удаляет в системах Windowsnode_modulesЭто относительно медленно, я рекомендую всем использоватьrimrafудалятьnode_modules, версия узлаrm -rfинструмент.

npm i -g rimraf

в проектеpackage.jsonПрисоединяйсяnpm scriptsПозволятьrimrafпостоянный. Три основные операционные системы широко распространены и настоятельно рекомендуются.

{
  "scripts": {
    "reinstall": "rimraf node_modules && npm i"
  }
}

что安装失败,重新安装такие операции, какnpm run removeудалятьnode_modulesОпять такиnpm i.

npm run reinstall

Окончательное резюме

Если это выглядит немного запутанно, вставьте последовательность операций с кодом непосредственно ниже.Рекомендуется, чтобы внешний интерфейс Xiaobai занимался этими проблемами зеркалирования NPM сразу после установки Node, чтобы предотвратить ненужные проблемы в будущем (для решения этих проблем требуется время ).

# 查看Node版本和NPM版本确认已安装Node环境
node -v
npm -v

# 安装nrm并设置NPM的淘宝镜像
npm i -g nrm
nrm use taobao

# 设置依赖安装过程中内部模块下载Node的淘宝镜像
npm config set disturl https://npm.taobao.org/mirrors/node/

# 设置常用模块的淘宝镜像
npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/
npm config set sharp_dist_base_url https://npm.taobao.org/mirrors/sharp-libvips/
npm config set electron_mirror https://npm.taobao.org/mirrors/electron/
npm config set puppeteer_download_host https://npm.taobao.org/mirrors/
npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/
npm config set sentrycli_cdnurl https://npm.taobao.org/mirrors/sentry-cli/
npm config set sqlite3_binary_site https://npm.taobao.org/mirrors/sqlite3/
npm config set python_mirror https://npm.taobao.org/mirrors/python/

противnode-sassСлучай:

# 安装rimraf并设置package.json
npm i -g rimraf

# 安装前请确保当前的Node版本和node-sass版本已兼容

# 安装失败
npm cache clean -f
npm rebuild node-sass 或 npm run reinstall

package.jsonПрисоединяйсяnpm scripts:

{
  "scripts": {
    "reinstall": "rimraf node_modules && npm i"
  }
}

Суммировать

Проблема с зеркалом NPMЯм действительно много, и в конечном счете это связано с сетевым окружением. Конечно, эти проблемы не могут остановить нас, желающих исследовать.Решений всегда больше, чем трудностей.Настойчивость всегда может найти решение.

Автор приходит к решению этойПроблема с зеркалом NPMЕсли вы столкнулись с некоторыми модулями, не упомянутыми выше, вы можете попытаться решить проблему, выполнив следующие действия.

  • воплощать в жизньnpm iПеред настройкой зеркала Taobao убедитесь, что проект установки зависит от внутренней сети.
  • Если установка не удалась, в процессе установки внутри модуля должны быть загружены файлы с других внешних серверов.
  • Клонируйте копию исходного кода модуля на Github для анализа и ищитеbase、binary、cdn、config、dist、download、host、mirror、npm、site、urlтакие ключевые слова (исследуйте самостоятельно, обычноmirrorсамый высокий матч)
  • Найти морфологические изображения в результатах поисказеркальный адресблок кода, затем проанализируйте функцию блока кода и извлеките окончательныйзеркальный адрес,Напримерnode-sassизsass_binary_site
  • Перейдите на официальный сайт зеркала Taobao, Baidu, Google и другие веб-сайты, чтобы найти нужный вам адрес зеркала.Если вы не можете его найти, стандартизируйте Интернет, чтобы извлечь файл зеркала чужого сервера и переместить его на свой собственный или корпоративный. сервер.
  • Установите адрес зеркала, от которого зависит модуль:npm config set <registry name> <taobao url / yourself url>
  • сделай это сноваnpm iУстановите зависимости проекта, все готово

Если это не поможет вам или решитьПроблема с зеркалом NPMЯ также столкнулся с другими ямами, пожалуйста, добавьте автора WeChat для совместного общения. Если есть ошибка, пожалуйста, укажите, и если есть лучшее решение, вы также можете внести предложения.

Кроме того, автор потратил некоторое время, используя Xmind, чтобы упорядочить содержание этой статьи и создать карту распределения точек знаний.Концентрация — это суть. Поскольку изображение слишком большое для загрузки, оно будет сохранено в общедоступном аккаунте. При необходимости вы можете подписаться на него.IQ前端,сканирование文章底部二维码, фоновый ответNPM镜像Получите эту картинку, надеюсь, она вам поможет.

Эпилог

❤️Подписаться + Нравится + Избранное + Комментарий + Переслать ❤️, оригинальность это не просто, поощряйте автора к созданию более качественных статей

Обратите внимание на публичный аккаунтIQ前端, внешний общедоступный аккаунт, ориентированный на навыки разработки CSS / JS, вас ждут другие галантереи переднего плана

  • Ответить после подписки资料Получите бесплатные учебные материалы
  • Ответить после подписки进群Втяните вас в группу технического обмена
  • Добро пожаловать, чтобы следоватьIQ前端,БолееНавыки разработки на CSS/JSНажимайте только на публичный аккаунт