Фронтенд-инжиниринг — Анализ механизма управления пакетами npm

внешний интерфейс NPM

Управляемое чтение

В настоящее время студенты фронтенд-разработки неразлучныnpmЭтот инструмент управления пакетами, его превосходный механизм управления версиями пакетов обеспечивает успешное развитие.NodeJSСообщество, понимание его внутреннего механизма очень полезно для углубления нашего понимания разработки модулей и настройки различных интерфейсных инженеров для ускорения устранения неполадок (я полагаю, что многие студенты получили различные проблемы с зависимостями).

В этой статье рассматриваются три точки зрения:package.json, управление версиями, установка зависимостей в сочетании с конкретными примерамиnpmПодробно анализируется механизм управления пакетами.

1. Анализ package.json

существуетNode.js, модуль — это библиотека или фреймворк, который также являетсяNode.jsпроект.Node.jsПроект следует модульной архитектуре, когда мы создаемNode.jsПроект, означает, что модуль создан, этот модуль должен иметь файл описания, т.е.package.json. Это наш самый распространенный конфигурационный файл, но действительно ли вы подробно разбирались в его конфигурации? настроить разумныйpackage.jsonФайл напрямую определяет качество нашего проекта, поэтому сначала разберем егоpackage.jsonподробная конфигурация.

1.1 Обязательные атрибуты

package.jsonСвойства очень много, из которых нужно заполнить только два:nameа такжеversion, эти два свойства образуютnpmУникальный идентификатор модуля.

правила именования пакетов npm

nameТо есть имя модуля и его наименование должны соответствовать некоторым официальным спецификациям и предложениям:

  • Имя пакета станет модулемurl, аргумент в командной строке или имя папки, любое неurlБезопасные символы нельзя использовать в именах пакетов, вы можете использоватьvalidate-npm-package-namepackage, чтобы проверить, допустимо ли имя пакета.

  • Семантические имена пакетов могут помочь разработчикам быстрее находить нужные пакеты и избегать случайного приобретения неправильных пакетов.

  • Если в имени пакета есть символы, удалите символы и не дублируйте существующее имя пакета.

Например: из-заreact-nativeуже существует,react.native,reactnativeбольше не может быть создан.

  • Если имя вашего пакета слишком похоже на имя существующего пакета, чтобы вы могли опубликовать пакет, рекомендуется опубликовать пакет в вашей области.

Например: Имя пользователяconard, то область видимости@conard, опубликованный пакет может быть@conard/react.

Проверьте, занят ли пакет

nameЭто уникальный идентификатор пакета, и его нельзя повторять с другими именами пакетов.npm view packageNameПосмотрите, занят ли пакет, и вы можете просмотреть некоторую основную информацию о нем:

Выдает, если имя пакета никогда не использовалось404ошибка:

Кроме того, вы можете перейти кhttps://www.npmjs.com/Для получения более подробной информации о пакете.

1.2 Описательная информация

основное описание

{
  "description": "An enterprise-class UI design language and React components implementation",
  "keywords": [
    "ant",
    "component",
    "components",
    "design",
    "framework",
    "frontend",
    "react",
    "react-component",
    "ui"
  ]
}

descriptionОн используется для добавления информации описания модуля, чтобы другие могли понять ваш модуль.

keywordsИспользуется для добавления ключевых слов в ваши модули.

Конечно, они также играют очень важную роль, заключающуюся в облегчении извлечения модуля. когда вы используетеnpm searchПри извлечении модуляdescriptionа такжеkeywordsсовпадают. пиши хорошоdescriptionа такжеkeywordsЭто полезно для вашего модуля, чтобы получать все более и более точную экспозицию:

Разработчик

Есть два поля, описывающие разработчика:authorа такжеcontributors,authorОтносится к основному автору пакета,authorсоответствовать человеку.contributorsОтносится к информации об участнике,contributorsВ соответствии с несколькими соавторами значение представляет собой массив, а описание человека может быть строкой или приведенной ниже структурой:

{ 
    "name" : "ConardLi", 
    "email" : "lisqPersion@163.com", 
    "url" : "https://github.com/ConardLi"
}

адрес

{
  "homepage": "http://ant.design/",
  "bugs": {
    "url": "https://github.com/ant-design/ant-design/issues"
  },
  "repository": {
    "type": "git",
    "url": "https://github.com/ant-design/ant-design"
  },
}

homepageИспользуется для указания домашней страницы для этого модуля.

repositoryРепозиторий кода для указанного модуля.

bugsУкажите адрес или адрес электронной почты, по которому люди, у которых есть вопросы о вашем модуле, могут задать вопросы.

1.3 Конфигурация зависимостей

Наш проект может зависеть от одной или нескольких внешних зависимостей.В соответствии с различным использованием зависимостей мы настраиваем их в соответствии со следующими свойствами:dependencies、devDependencies、peerDependencies、bundledDependencies、optionalDependencies.

Правило конфигурации

Прежде чем представить несколько конфигураций зависимостей, давайте сначала рассмотрим правила конфигурации зависимостей.Конфигурация пакета зависимостей, которую вы видите, может быть следующей:

 "dependencies": {
      "antd": "ant-design/ant-design#4.0.0-alpha.8",
      "axios": "^1.2.0",
      "test-js": "file:../test",
      "test2-js": "http://cdn.com/test2-js.tar.gz",
      "core-js": "^1.1.5",
 }

Конфигурация зависимостей следует следующим правилам конфигурации:

  • 依赖包名称:VERSION
    • VERSIONявляется последователемSemVerконфигурация номера канонической версии,npm installзагрузит пакет, соответствующий указанному диапазону версий, на сервер npm.
  • 依赖包名称:DWONLOAD_URL
    • DWONLOAD_URLзагружаемыйtarballАдрес сжатого пакета, который будет установлен при установке модуля.tarСкачайте и установите локально.
  • 依赖包名称:LOCAL_PATH
    • LOCAL_PATHявляется локальным путем пакета зависимостей, например.file:../pacakges/pkgName. Подходит для тестирования на местеnpmpackage, этот метод не следует применять онлайн.
  • 依赖包名称:GITHUB_URL
    • GITHUB_URLкоторыйgithubизusername/modulenameнаписание, например:ant-design/ant-design, вы также можете указать послеtagа такжеcommit id.
  • 依赖包名称:GIT_URL
    • GIT_URLТо есть мы обычно клонируем кодовую базуgit url, который следует форме:
<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]

вprotocalМожет быть в следующих формах:

  • git://github.com/user/project.git#commit-ish
  • git+ssh://user@hostname:project.git#commit-ish
  • git+ssh://user@hostname/project.git#commit-ish
  • git+http://user@hostname/project/blah.git#commit-ish
  • git+https://user@hostname/project/blah.git#commit-ish

dependencies

dependenciesУкажите модули, от которых зависит запуск проекта, и здесь можно настроить зависимые модули среды разработки и рабочей среды, например

 "dependencies": {
      "lodash": "^4.17.13",
      "moment": "^2.24.0",
 }

devDependencies

Есть некоторые пакеты, которые вы можете использовать только в среде разработки, например, тот, который вы используете для проверки спецификации кода.eslint, для тестированияjest, пользователи могут нормально работать без установки этих зависимостей при использовании вашего пакета, но их установка займет больше времени и ресурсов, поэтому вы можете добавить эти зависимости вdevDependencies, эти зависимости все равно будут реализованы локальноnpm installустанавливается и управляется, но не будет установлен в рабочей среде:

 "devDependencies": {
      "jest": "^24.3.1",
      "eslint": "^6.1.0",
 }

peerDependencies

peerDependenciesИспользуется для указания версии разрабатываемого модуля и совместимости версии зависимого пакета, установленного пользователем.

Приведенное выше утверждение может быть слишком абстрактным, давайте рассмотрим его напрямую.ant-designВозьмем пример,ant-designизpackage.jsonСуществуют следующие конфигурации:

  "peerDependencies": {
    "react": ">=16.0.0",
    "react-dom": ">=16.0.0"
  }

При разработке системы используйтеant-design, поэтому он также должен зависеть отReact. в то же время,ant-designтакже зависит отReact, он должен оставаться стабильнымReactверсия16.0.0, от которого вы зависите при разработкеReactверсия15.x:

В настоящее время,ant-designнужно использоватьReactи импортируйте его:

import * as React from 'react';
import * as ReactDOM from 'react-dom';

В это время получается хост-среда, которая является вашей средой.Reactверсия, которая может вызвать некоторые проблемы. существуетnpm2, укажите вышеpeerDependenciesбудет означать принудительную установку среды хостингаreact@>=16.0.0和react-dom@>=16.0.0версия.

npm3больше не буду спрашиватьpeerDependenciesУказанные зависимости устанавливаются принудительно, вместоnpm3После завершения установки он проверит правильность установки, и если она неверна, пользователю будет выведено предупреждение.

  "dependencies": {
    "react": "15.6.0",
    "antd": "^3.22.0"
  }

Например, в моем проекте я зависел отantdПоследняя версия , затем зависит отreactиз15.6.0версия, выдаст следующее предупреждение при установке зависимостей:

optionalDependencies

В некоторых сценариях зависимый пакет может не быть сильно зависимым, и функция зависимого пакета не является обязательной.Если зависимый пакет не может быть получен, вы хотитеnpm installЧтобы продолжать работать без сбоев, вы можете поместить эту зависимость вoptionalDependenciesв, примечаниеoptionalDependenciesКонфигурация будет перезаписанаdependenciesТак что просто настройте его в одном месте.

Конечно, цитируяoptionalDependenciesОбработка исключений должна быть сделана хорошо при установке зависимостей в модуль, иначе будет сообщено об ошибке, когда модуль не может быть получен.

bundledDependencies

В отличие от вышеизложенного,bundledDependenciesЗначение представляет собой массив, в котором можно указать модули, которые будут упакованы вместе при публикации этого пакета.

  "bundledDependencies": ["package1" , "package2"]

1.4 Соглашение

{
    "license": "MIT"
}

licenseПоле используется для указания соглашения об открытом исходном коде программного обеспечения.Соглашение об открытом исходном коде подробно описывает права, которыми обладают другие лица после получения вашего кода, какие операции они могут выполнять с вашим кодом, а какие операции запрещены. Существует множество вариантов одного и того же соглашения.Если соглашение будет слишком свободным, автор потеряет многие права на произведение.Если соглашение будет слишком строгим, пользователям будет неудобно использовать и распространять произведение.Поэтому авторы с открытым исходным кодом следует учитывать, какие права они хотят сохранить в работе, а какие ограничения снять.

Соглашения о программном обеспечении можно разделить на две категории: с открытым исходным кодом и коммерческие.Для коммерческих соглашений или юридических деклараций, лицензионных соглашений каждое программное обеспечение будет иметь свой собственный набор документов, который написан автором программного обеспечения или профессиональным юристом.Для большинства людей, нет необходимости делать это самостоятельно Потратить время и усилия на написание длинного лицензионного соглашения — хороший выбор, чтобы выбрать широко распространенное соглашение с открытым исходным кодом.

Ниже приведены несколько основных протоколов с открытым исходным кодом:

  • MIT: Пока пользователь содержит заявления об авторских правах и заявления о лицензировании в копии проекта, они могут использовать ваш код, чтобы делать что угодно, вам не нужно брать на себя какую-либо ответственность.
  • Apache: что-то типаMIT, а также содержит положения, касающиеся патентного лицензирования, предоставляемого участниками пользователям.
  • GPL: Когда пользователь, изменяющий код проекта, распространяет исходный или двоичный код, он должен опубликовать свои соответствующие модификации.

Если у вас есть более подробные требования к соглашению об открытом исходном коде, вы можете перейти кchoosealicense.com/Получите более подробное описание протокола с открытым исходным кодом.

1.5 Связанные каталоги и файлы

Запись программы

{
  "main": "lib/index.js",
}

mainВ свойствах можно указать основной входной файл программы, например, указанный вышеantdуказанная запись модуляlib/index.js, когда мы вводим в код сantdВремя:import { notification } from 'antd';По сути, введениеlib/index.jsмодули, выставленные в .

Запись инструмента командной строки

Если ваш модуль является инструментом командной строки, вам необходимо указать запись для инструмента командной строки, которая указывает имя вашей команды и соответствующую связь локального указанного файла. Если это глобальная установка, npm будет использовать символическую ссылку для связывания исполняемых файлов с/usr/local/bin, если он установлен локально, будет ссылаться на./node_modules/.bin/.

{
    "bin": {
    "conard": "./bin/index.js"
  }
}

Например, приведенная выше конфигурация: когда ваш пакет установлен глобально:npmБудет в/usr/local/binзатем создайтеconardМягкая ссылка для имени, указывающая на глобально установленныйconardпод сумкой"./bin/index.js". В этот момент вы выполняете в командной строкеconardСвязанный файл js будет вызываться.

Я не буду здесь слишком много распространяться, и более подробное содержание будет объяснено в моих последующих статьях об инструментах командной строки.

конфигурация файла релиза

{
    "files": [
      "dist",
      "lib",
      "es"
    ]
}

filesатрибуты описывают васnpm publishпосле нажатия наnpmСписок файлов сервера.Если указана папка, будет включено все содержимое папки. Мы видим, что загруженный пакет имеет следующую структуру каталогов:

Кроме того, вы также можете настроить.npmignoreфайл, чтобы исключить некоторые файлы, предотвращая отправку большого количества ненужных файлов вnpm, правила и вы используете.gitignoreэто то же самое..gitignoreфайлы также могут выступать в качестве.npmignoreдокумент.

man

manКомандаLinuxкоманда помощи подmanИнструкцию можно посмотретьLinuxСправка по инструкциям, справка по файлу конфигурации и справка по программированию в формате .

если вашnode.jsмодуль — это глобальный инструмент командной строки, которыйpackage.jsonпройти черезmanсвойства могут быть указаныmanАдрес документа, который ищет команда.

manФайл должен заканчиваться цифрой или, если он сжат, заканчиваться.gzконец. Число указывает, что файл будет установлен вmanкакая часть . еслиmanИмя файла не начинается с имени модуля, оно будет иметь префикс имени модуля во время установки.

Например, следующая конфигурация:

{ 
  "man" : [ 
    "/Users/isaacs/dev/npm/cli/man/man1/npm-access.1",
    "/Users/isaacs/dev/npm/cli/man/man1/npm-audit.1"
  ]
}

Введите в командной строкеman npm-audit:

Каталог проекта спецификации

Одинnode.jsмодуль основан наCommonJSМодульные спецификации реализованы в строгом соответствии сCommonJSСпецификация, каталог модуля должен содержать файлы описания пакета в дополнение кpackage.jsonКроме того, необходимо включить следующие каталоги:

  • bin: Каталог, в котором хранятся исполняемые двоичные файлы.
  • lib: каталог, в котором хранится код js.
  • doc: Каталог, в котором хранится документ
  • test: каталог, в котором хранится код модульного теста.
  • ...

В каталоге модулей вы не можете быть организованы или названы точно в соответствии с приведенной выше структурой, вы можетеpackage.jsonуточнитьdirectories属性来指定你的目录结构和上述的规范结构的对应情况。 ПомимоdirectoriesСвойства Нет больше приложений.

{
  "directories": {
    "lib": "src/lib/",
    "bin": "src/bin/",
    "man": "src/man/",
    "doc": "src/doc/",
    "example": "src/example/"
  }
}

Однако в официальном документе говорится, что, хотя в настоящее время этот атрибут не играет важной роли, в будущем могут быть сделаны некоторые хитрости, например, файл уценки, хранящийся в doc, и файл примера, хранящийся в example, могут отображаться дружно.

1.6 Настройка скрипта

script

{
  "scripts": {
    "test": "jest --config .jest.js --no-cache",
    "dist": "antd-tools run dist",
    "compile": "antd-tools run compile",
    "build": "npm run compile && npm run dist"
  }
}

scriptsАббревиатура, используемая для настройки некоторых команд скрипта.Каждый скрипт можно использовать в комбинации друг с другом.Эти скрипты могут охватывать жизненный цикл всего проекта и могут быть использованы после настройки.npm run commandпозвонить. еслиnpmключевое слово, вы можете вызвать его напрямую. Например, приведенная выше конфигурация определяет следующие команды:npm run test,npm run dist,npm run compile,npm run build.

config

configПоля используются для настройки переменных среды, используемых в сценариях, таких как приведенная ниже конфигурация, которую можно использовать в сценариях.process.env.npm_package_config_portчтобы получить.

{
  "config" : { "port" : "8080" }
}

1.7 Конфигурация публикации

preferGlobal

если вашnode.jsОсновной модуль для монтажа на глобальный инструмент командной строки, то значение устанавливается наtrueКогда модуль установлен на локальный пользователь, вы дадите предупреждение. Эта конфигурация не предотвращает установку пользователей, но подскажет пользователю предотвратить неправильное использование вызвало некоторые проблемы.

private

еслиprivateсвойство установлено наtrue, npm откажется публиковать его, чтобы предотвратить непреднамеренную публикацию приватного модуля.

publishConfig

  "publishConfig": {
    "registry": "https://registry.npmjs.org/"
  },

Более детальная настройка при публикации модулей, например можно настроить на публикацию только определенногоtag, настройте частную публикацию наnpmисточник. Более подробная конфигурация может обратиться кnpm-config

os

Если вы разработаете модуль, вы можете работать только вdarwinВ системе нужно убедиться, чтоwindowsПользователи не будут устанавливать к вам модули, что позволит избежать ненужных ошибок.

использоватьosСвойства могут помочь вам с указанными выше требованиями.Вы можете указать, что ваш модуль может быть установлен только на определенных системах, или указать черный список систем, которые не могут быть установлены:

"os" : [ "darwin", "linux" ]
"os" : [ "!win32" ]

Например, я поставил тестовый модуль для указания черного списка системы:"os" : [ "!darwin" ], когда я устанавливаю его под эту систему, вылезает следующая ошибка:

В среде узла вы можете использовать process.platform для определения операционной системы.

cpu

и вышеosТочно так же мы можем использоватьcpuАтрибуты более точно ограничивают среду установки пользователя:

"cpu" : [ "x64", "ia32" ]
"cpu" : [ "!arm", "!mips" ]

В среде узла process.arch можно использовать для определения архитектуры процессора.

Во-вторых, проанализируйте механизм управления версиями пакетов.

NodejsУспех неотделимnpmОтличные системы управления зависимостями. Прежде чем вводить всю систему зависимостей, мы должны понятьnpmКак управлять версиями зависимых пакетов, эта глава представитnpm包Спецификация выпуска версии, как управлять версиями различных зависимых пакетов и некоторые рекомендации для версий пакетов.

2.1 Просмотр версии пакета npm

ты можешь выполнитьnpm view package versionпросмотретьpackageПоследняя версия.

воплощать в жизньnpm view conard versionsпросмотретьpackageВсе опубликованные версии на сервере npm.

воплощать в жизньnpm lsВы можете просмотреть информацию о версиях всех пакетов в дереве зависимостей текущего репозитория.

2.2 Спецификация SemVer

npm包Версии модуля во всех должны следоватьSemVerСпецификация - поGithubНабросал поучительный унифицированный номер версии, представляющий правила. фактическиSemantic VersionАббревиатура от (Semantic Versioning).

Официальный сайт спецификации SemVer:semver.org/

Стандартная версия

SemVerСтандартный номер версии спецификации принимаетX.Y.Z, где X, Y и Z — неотрицательные целые числа, а ведущие нули запрещены. X — основной номер версии, Y — дополнительный номер версии, а Z — номер редакции. Каждый элемент должен быть увеличен численно.

  • Номер основной версии (major): Когда вы делаете несовместимые модификации API
  • дополнительный номер версии (minor): когда вы делаете обратно совместимые функциональные дополнения
  • Поправка №(patch): когда вы исправляете ошибку обратной совместимости.

Например:1.9.1 -> 1.10.0 -> 1.11.0

Предварительная версия

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

Начальный номер версии может быть добавлен в конце «основной номер версии. Дополнительный номер версии. Номер редакции», за которым следует номер соединения, за которым следует ряд идентификаторов, разделенных точками, и информация о компиляции версии.

  • внутренняя версия (alpha):
  • Бета-версия (beta):
  • Релиз-кандидат для официального релизаrc: которыйRelease candiate

Реакция версии

Давайте взглянемReactИсторические версии:

Видно, что строго поSemVerВыпущено по спецификации:

  • Номер версии строго соответствует主版本号.次版本号.修订号формат именования
  • Версии строго возрастают,:16.8.0 -> 16.8.1 -> 16.8.2
  • Когда выпускается основная версия или изменения версии, сначала выпустите ее.alpha,beta,rcДождитесь первой версии

релизная версия

изменениеnpmПосле какой-то функции вам обычно нужна новая версия, наша обычная практика — модифицировать напрямуюpackage.jsonПерейти на указанную версию. Если операция ошибочна, легко вызвать путаницу с номером версии, мы можем использовать ее в соответствии сSemverКаноническая команда для этого:

  • npm version patch: номер версии обновления
  • npm version minor: номер младшей версии обновления
  • npm version major: номер основной версии обновления

Использование инструмента версии 2.3

Некоторыми номерами версий необходимо управлять в процессе разработки. Если эти номера версий соответствуютSemVerspec , мы можем использовать пакеты npm для управления версиямиsemverЧтобы помочь нам сравнить размеры версий, извлечь информацию о версии и т. д.

Npm также использует этот инструмент для работы с версиями.

npm install semver
  • Сравните номера версий
semver.gt('1.2.3', '9.8.7') // false
semver.lt('1.2.3', '9.8.7') // true
  • Определяет, соответствует ли номер версии спецификации, и после синтаксического анализа возвращает номер версии, соответствующий спецификации.
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
  • Coerce Другие номера версий для номеров версий SEMVER
semver.valid(semver.coerce('v2')) // '2.0.0'
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
  • Некоторые другое использование
semver.clean('  =v1.2.3   ') // '1.2.3'
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
semver.minVersion('>=1.0.0') // '1.0.0'

Выше приведены наиболее распространенные варианты использования semver.Подробности см. в документации по semver:GitHub.com/year-rank/node-color…

2.4 Управление версиями зависимостей

Мы часто видим, что вpackage.jsonРазличные способы записи различных зависимостей в:

  "dependencies": {
    "signale": "1.4.0",
    "figlet": "*",
    "react": "16.x",
    "table": "~5.4.6",
    "yargs": "^14.0.0"
  }

Первые три легко понять:

  • "signale": "1.4.0": фиксированный номер версии
  • "figlet": "*": любая версия (>=0.0.0)
  • "react": "16.x": соответствует основной версии (>=16.0.0 <17.0.0)
  • "react": "16.3.x": соответствует основной и дополнительной версиям (>=16.3.0 <16.4.0)

Давайте посмотрим на последние два, номер версии указан~а также^символ:

  • ~: когда новая версия получена при установке зависимостей, установить вx.y.zсерединаzПоследняя версия. То есть, если номер основной версии и дополнительный номер версии остаются неизменными, сохраняется последняя версия номера версии.
  • ^: когда новая версия получена при установке зависимостей, установить вx.y.zсерединаyа такжеzВсе последней версии. То есть, сохраняя основной номер версии без изменений, оставьте дополнительный номер версии и номер редакции в качестве последней версии.

существуетpackage.jsonНаиболее часто встречающиеся в файле должны быть"yargs": "^14.0.0"зависимости этого формата, потому что мы используемnpm install packageПри установке пакетаnpmПоследняя версия устанавливается по умолчанию, а затем к номеру установленной версии добавляется префикс^Нет.

Обратите внимание, что если основной номер версии0, будет считаться нестабильной версией, ситуация отличается от описанной выше:

  • И основной, и дополнительный номер версии0: ^0.0.z,~0.0.zОбе версии считаются фиксированными и не изменяются при установке зависимостей.
  • Номер основной версии0: ^0.y.zпроизводительность и~0.y.zТо же самое, просто сохраните номер версии до последней версии.

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

2.5 Заблокировать версии зависимостей

заблокировать файл

В реальной разработке часто возникают странные проблемы из-за несогласованности различных зависимостей, или в некоторых сценариях мы не хотим, чтобы зависимости обновлялись, и рекомендуется использовать их в разработкеpackage-lock.json.

Блокировка версии зависимости означает, что при каждой установке зависимости будет устанавливаться исправленная версия без выполнения обновления вручную. Убедитесь, что вся команда использует один и тот же номер версии зависимостей.

При каждой установке фиксированной версии нет необходимости рассчитывать диапазон зависимых версий, что может значительно ускорить время установки зависимостей в большинстве сценариев.

Используйте package-lock.json, чтобы убедиться, что версия npm выше 5.6, потому что между 5.0 и 5.6 логика обработки package-lock.json несколько раз обновлялась, и после версии 5.6 логика обработки постепенно стабилизируется.

оpackage-lock.jsonПодробная структура будет проанализирована в следующих главах.

Регулярно обновлять зависимости

Наша цель — сохранить зависимости, используемые командой, согласованными или стабильными, а не никогда не обновлять эти зависимости. В реальном сценарии разработки, хотя нам не нужно каждый раз устанавливать новую версию, нам все равно необходимо регулярно обновлять зависимую версию, чтобы мы могли наслаждаться устранением проблем, улучшением производительности и обновлением новых функций, предоставляемым пакетом зависимостей. Обновить.

использоватьnpm outdatedМожет помочь нам перечислить, какие зависимости не были обновлены до последней версии:

  • Желтый цвет означает, что он не соответствует указанному семантическому диапазону версий — обновление не требуется.
  • Красный указывает на соответствие указанному семантическому диапазону версий — требуется обновление

воплощать в жизньnpm updateОбновит все красные зависимости.

2.6 Рекомендации по выбору версии зависимостей

Выпуск версии

  • При внешнем выпуске официальной версии пакета npm пометьте его версию как1.0.0.
  • После выпуска версии пакета любые модификации должны быть выпущены в новой версии.
  • Номер версии строго соответствует主版本号.次版本号.修订号формат именования
  • Выпуски номеров версий должны быть строго добавочными
  • Когда выпускается основная версия или изменения версии, сначала выпустите ее.alpha、beta、rcДождитесь первой версии

Зависимый выбор области действия

  • Основной проект зависит от множества подмодулей, которые разрабатываются членами команды.npmpackage, рекомендуется изменить префикс версии на~, если он заблокирован, зависимости основного проекта должны обновляться каждый раз, когда обновляются подзависимости, что очень громоздко.Если вы полностью доверяете подзависимостям, вы можете напрямую открывать их.^Каждый раз, когда вы обновляетесь до последней версии.
  • Основной проект работает вdockerВ сети подзависимости все еще разрабатываются и обновляются локально.dockerПеред выпуском версии все версии зависимостей должны быть заблокированы, чтобы гарантировать отсутствие проблем в сети после выпуска локальных подзависимостей.

поддерживать согласованность зависимостей

  • убедисьnpmверсия в5.6Выше обязательно включите по умолчаниюpackage-lock.jsonдокумент.
  • Выполняется членом инициализацииnpm inatallПосле этогоpackage-lock.jsonОтправить в удаленный репозиторий. Не отправляйте напрямуюnode_modulesв удаленный репозиторий.
  • выполнять регулярноnpm updateОбновите зависимости и отправьтеlockФайл гарантирует, что другие участники синхронно обновляют зависимости, не изменяя их вручную.lockдокумент.

Изменения зависимостей

  • Зависимость обновления: изменитьpackage.jsonВерсия зависимостей файла, выполнитьnpm install
  • Зависимости понижения версии: прямое выполнениеnpm install package@version(изменятьpackage.jsonне будет понижать зависимости)
  • Обратите внимание на отправку после изменения зависимостейlockдокумент

В-третьих, проанализируйте принцип установки npm.

npm installВероятно, он пройдет через описанные выше процессы.В этой главе мы поговорим о деталях реализации, развитии и причинах каждого процесса.

3.1 Вложенная структура

Все мы знаем, что реализацияnpm installПосле этого пакет зависимостей устанавливается наnode_modules, давайте посмотрим поближе,npmУстановите зависимости наnode_modulesКакой конкретный механизм.

существуетnpmболее ранняя версияnpmСпособ борьбы с зависимостями простой и грубый, в виде рекурсии, строго поpackage.jsonСтруктура и подзависимости пакетовpackage.jsonFabric установит зависимости в соответствующиеnode_modulesсередина. Пока не появятся зависимые пакеты, не зависящие от других модулей.

Например, наш модульmy-appТеперь зависит от двух модулей:buffer,ignore:

{
  "name": "my-app",
  "dependencies": {
    "buffer": "^5.4.3",
    "ignore": "^5.1.4",
  }
}

ignoreчистыйJSмодулей, которые не зависят ни от каких других модулей, аbufferОн опирается на следующие два модуля:base64-js,ieee754.

{
  "name": "buffer",
  "dependencies": {
    "base64-js": "^1.0.2",
    "ieee754": "^1.1.4"
  }
}

Затем выполнитеnpm installпосле этого получитьnode_modulesСтруктура каталогов модуля выглядит следующим образом:

Преимущества этого метода очевидны,node_modulesСтруктура иpackage.jsonСтруктура - одна корреспонденция, прозрачная иерархия и для обеспечения того, чтобы каждая структура монтажа каталога одинакова.

Однако представьте, что если вы зависите от очень большого количества модулей, вашnode_modulesбудет очень большим, с очень глубокими уровнями вложенности:

  • На разных уровнях зависимостей можно ссылаться на один и тот же модуль, что приводит к значительной избыточности.
  • существуетWindowsВ системе максимальная длина пути к файлу — 260 символов, слишком глубокий уровень вложенности может вызвать непредсказуемые проблемы.

3.2 Плоская структура

Для решения вышеуказанных проблем,NPMсуществует3.xВ версию было внесено крупное обновление. Он изменяет ранее вложенную структуру на плоскую структуру:

  • При установке модуля, независимо от того, является ли он прямой зависимостью или зависимой зависимостью, сначала установите его вnode_modulesКорневая директория.

Все еще вышеприведенная структура зависимостей, которую мы выполняемnpm installВы получите следующую структуру каталогов:

base64-js@1.0.1

{
  "name": "my-app",
  "dependencies": {
    "buffer": "^5.4.3",
    "ignore": "^5.1.4",
    "base64-js": "1.0.1",
  }
}
  • node_modules

npm install

  • в текущем модулеnode_modulesПоиск следующего пути
  • в верхнем модулеnode_modulesпоиск по пути
  • ...
  • пока глобальный путь не будет найденnode_modules

Предположим, мы зависим от другого пакетаbuffer2@^5.4.3, что зависит от пакетаbase64-js@1.0.3, структура установки в настоящее время выглядит следующим образом:

такnpm 3.xВерсия не полностью решает проблему избыточности модулей старой версии, и даже приносит новые проблемы.

Просто представьте, что ваше приложение не предполагает никаких зависимостейbase64-js@1.0.1версии, и вы одновременно зависите от разных зависимостейbase64-jsверсияbufferа такжеbuffer2. из-за выполненияnpm install, согласно сpackage.jsonПорядок, в котором зависимости разрешаются по очереди, затемbufferа такжеbuffer2существуетpackage.jsonПорядок размещения определяетnode_modulesСтруктура зависимости:

зависеть в первую очередьbuffer2:

зависеть в первую очередьbuffer:

Кроме того, чтобы позволить разработчикам использовать последние пакеты зависимостей в целях безопасности, мыpackage.jsonОбычно блокируется только основная версия, а это означает, что структура зависимостей также может быть изменена после обновления минорной версии некоторых пакетов зависимостей.Неопределенность структуры зависимостей может привести к непредсказуемым проблемам в программе.

3.3 Заблокировать файл

чтобы решитьnpm installНеопределенная проблема,npm 5.xдобавлена ​​версияpackage-lock.jsonфайл, и метод установки по-прежнему используетсяnpm 3.xуплощенный способ.

package-lock.jsonФункция состоит в том, чтобы заблокировать структуру зависимостей, то есть до тех пор, пока у вас естьpackage-lock.jsonфайл, то каждый раз, когда вы выполняетеnpm installпостгенерированныйnode_modulesСтруктура каталогов должна быть точно такой же.

Например, у нас есть следующая структура зависимостей:

{
  "name": "my-app",
  "dependencies": {
    "buffer": "^5.4.3",
    "ignore": "^5.1.4",
    "base64-js": "1.0.1",
  }
}

в исполненииnpm installпостгенерированныйpackage-lock.jsonследующим образом:

{
  "name": "my-app",
  "version": "1.0.0",
  "dependencies": {
    "base64-js": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz",
      "integrity": "sha1-aSbRsZT7xze47tUTdW3i/Np+pAg="
    },
    "buffer": {
      "version": "5.4.3",
      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
      "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
      "requires": {
        "base64-js": "^1.0.2",
        "ieee754": "^1.1.4"
      },
      "dependencies": {
        "base64-js": {
          "version": "1.3.1",
          "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
          "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
        }
      }
    },
    "ieee754": {
      "version": "1.1.13",
      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
    },
    "ignore": {
      "version": "5.1.4",
      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
      "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A=="
    }
  }
}

Давайте подробно рассмотрим приведенную выше структуру:

Две внешние свойстваname,versionтакой жеpackage.jsonсерединаnameа такжеversion, который описывает текущее имя и версию пакета.

dependenciesэто объект, объект иnode_modulesСтруктура пакета во взаимном соответствии, объектkey— имя пакета, а значение — некоторая описательная информация о пакете:

  • version: версия пакета — этот пакет в настоящее время установлен вnode_modulesверсия в
  • resolved: Источник установки для конкретного пакета.
  • integrity:Мешокhashстоимость, исходя изSubresource IntegrityЧтобы убедиться, что установленные пакеты не были изменены или недействительны
  • requires: Соответствует зависимым зависимостям и зависимым зависимостямpackage.jsonсерединаdependenciesЗависимости те же.
  • dependencies: структурный и внешнийdependenciesСтруктура та же, магазин устанавливается в подзависимостиnode_modulesзависимости в пакете.

Обратите внимание, что не все дети-иждивенцы имеютdependenciesсвойства, только зависимости подзависимостей и те, которые в настоящее время установлены в корневом каталогеnode_modulesЭто свойство будет существовать только после конфликта зависимостей в .

Например, просмотрите приведенные выше зависимости:

мы вmy-appзависит отbase64-js@1.0.1версия сbufferзависит отbase64-js@^1.0.2конфликт, такbase64-js@1.0.1необходимо установить вbufferупаковкаnode_modules, соответствующийpackage-lock.jsonсерединаbufferизdependenciesАтрибуты. Это также соответствуетnpmСглаживание зависимостей.

Таким образом, согласно приведенному выше анализу,package-lock.jsonфайл иnode_modulesСтруктура каталогов один к одному, то есть каталог проекта существуетpackage-lock.jsonСтруктуру каталогов зависимостей, созданную при каждой установке, можно сохранить одинаковой.

Кроме того, в проекте используетсяpackage-lock.jsonМожет значительно ускорить время установки зависимости.

Мы используемnpm i --timing=true --loglevel=verboseкоманда может видетьnpm installПолный процесс, давайте сравним использованиеlockфайл и не использоватьlockразличия в файлах. Очистить перед сравнениемnpmкеш.

Не используйтеlockдокумент:

использоватьlockдокумент:

видимый,package-lock.jsonКонкретная версия и ссылка для загрузки каждого пакета были кэшированы в файле, поэтому нет необходимости обращаться к удаленному хранилищу для запроса, а затем напрямую вводить ссылку для проверки целостности файла, что сокращает большое количество сетевых запросов.

Рекомендации

При разработке системных приложений рекомендуется ставитьpackage-lock.jsonФайл фиксируется в репозитории версий кода, что гарантирует, что все разработчики группы иCIСсылку можно выполнитьnpm installВерсии установленных зависимостей совпадают.

разработкаnpmпакет, вашnpmПакет должен зависеть от других репозиториев.Из-за плоского механизма установки, о котором мы упоминали выше, если вы заблокируете версию зависимого пакета, ваш зависимый пакет не сможет использовать один и тот же пакет с другими зависимыми пакетами.semverЗависимые пакеты с ограниченной областью действия, которые могут создать ненужную избыточность. Поэтому мы не должны ставитьpackage-lock.jsonФайл опубликован(npmПо умолчанию не будетpackage-lock.jsonфайл выпущен).

3.4 Кэш

в исполненииnpm installилиnpm updateПосле того, как команда загрузит зависимости, в дополнение к установке пакета зависимостей вnode_modulesПомимо каталога, копия также будет кэшироваться в локальном каталоге кеша.

пройти черезnpm config get cacheКоманду можно запросить: вLinuxилиMacПо умолчанию это домашний каталог пользователя..npm/_cacacheсодержание.

В этом каталоге есть еще два каталога:content-v2,index-v5,content-v2директория для храненияtarкэш пакетов, аindex-v5директория для храненияtarупаковкаhash.

Когда npm выполняет установку, его можно установить в соответствии сpackage-lock.jsonХранится вintegrity、version、nameсоздать уникальныйkeyсоответствуетindex-v5Кэшировать записи в каталоге, чтобы найтиtarупаковкаhash, то согласноhashперейти к кэшуtarПакет используется напрямую.

Мы можем найти пакет для поиска и тестирования в каталоге кеша, вindex-v5Поиск Пакета Путь:

grep "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz" -r index-v5

Затем форматируем json:

{
  "key": "pacote:version-manifest:https://registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz:sha1-aSbRsZT7xze47tUTdW3i/Np+pAg=",
  "integrity": "sha512-C2EkHXwXvLsbrucJTRS3xFHv7Mf/y9klmKDxPTE8yevCoH5h8Ae69Y+/lP+ahpW91crnzgO78elOk2E6APJfIQ==",
  "time": 1575554308857,
  "size": 1,
  "metadata": {
    "id": "base64-js@1.0.1",
    "manifest": {
      "name": "base64-js",
      "version": "1.0.1",
      "engines": {
        "node": ">= 0.4"
      },
      "dependencies": {},
      "optionalDependencies": {},
      "devDependencies": {
        "standard": "^5.2.2",
        "tape": "4.x"
      },
      "bundleDependencies": false,
      "peerDependencies": {},
      "deprecated": false,
      "_resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.0.1.tgz",
      "_integrity": "sha1-aSbRsZT7xze47tUTdW3i/Np+pAg=",
      "_shasum": "6926d1b194fbc737b8eed513756de2fcda7ea408",
      "_shrinkwrap": null,
      "bin": null,
      "_id": "base64-js@1.0.1"
    },
    "type": "finalized-manifest"
  }
}

над_shasumАтрибуты6926d1b194fbc737b8eed513756de2fcda7ea408то естьtarупаковкаhash,hashПервые несколько6926То есть сначала двухслойный каталог тайника, заходим в этот каталог, а потом уже выкупленный мешок после нахождения:

Вышеупомянутая стратегия кэширования начинается с версии npm v5.До версии npm v5 каждый кэшированный модуль напрямую хранится в виде имени модуля в папке ~/.npm, а структура хранения — {cache}/{name}/ {версия}.

npmДля управления кэшированными данными предусмотрено несколько команд:

  • npm cache add: официальное объяснение состоит в том, что эта команда в основномnpmИспользуется внутри, но также может использоваться для ручного добавления кеша в конкретный пакет.
  • npm cache clean: Удалить все данные в каталоге кеша.Для обеспечения целостности кэшированных данных необходимо добавить--forceпараметр.
  • npm cache verify: проверка достоверности и целостности кэшированных данных и очистка ненужных данных.

На основе кешированных данных npm предоставляет следующие режимы автономной установки:

  • --prefer-offline: Сначала используются кэшированные данные, и если нет соответствующих кэшированных данных, они будут загружены из удаленного репозитория.
  • --prefer-online: Сначала используйте сетевые данные. Если запрос сетевых данных не удался, запросите кэшированные данные. Этот режим может своевременно получить самый последний модуль.
  • --offline: кэшированные данные используются напрямую, без запроса сети.Если кэшированные данные не существуют, установка завершается сбоем.

3.5 Целостность файла

Мы много раз упоминали целостность файлов выше, так что же такое проверка целостности файлов?

Перед загрузкой зависимостей мы вообще можем получитьnpmРассчитано для этого зависимого пакетаhashзначение, например, мы выполняемnpm infoкомандуй, следуйtarball(ссылка для скачивания) естьshasum(hash):

После того, как пользователь загрузит пакет зависимостей на локалку, необходимо убедиться, что в процессе загрузки не возникнет ошибки, поэтому после завершения загрузки необходимо вычислить значение файла локально.hashзначение, если обаhashЕсли значения совпадают, убедитесь, что загруженные зависимости полны, а если они отличаются, загрузите их заново.

3.6 Общий процесс

Что ж, давайте подытожим вышеописанный процесс в целом:

  • экзамен.npmrcфайл: приоритет: уровень проекта.npmrcФайл > Пользовательский уровень.npmrcфайл > глобальный.npmrcФайл> Встроенный NPM.npmrcдокумент

  • Проверьте, есть ли у товараlockдокумент.

  • безlockдокумент:

    • отnpmПолучить информацию о пакете из удаленного репозитория
    • согласно сpackage.jsonПостроить дерево зависимостей, процесс сборки:
      • При построении дерева зависимостей, независимо от того, является ли оно прямой зависимостью или зависимой зависимостью, оно предпочтительно размещается вnode_modulesКорневая директория.
      • Когда встречается один и тот же модуль, оценивается, соответствует ли версия модуля, уже помещенного в дерево зависимостей, диапазону версий нового модуля.node_modulesпоместите модуль ниже.
      • Обратите внимание, что этот шаг предназначен только для определения логического дерева зависимостей, а не реальной установки.Позже, в соответствии с этой структурой зависимостей, пакет зависимостей в кеше будет загружен или получен.
    • Найти каждый пакет в дереве зависимостей по очереди в кеше
      • Кэш не существует:
        • отnpmПакет загрузки удаленного склада
        • Проверить целостность пакета
        • Проверка не проходит:
          • скачать снова
        • Проверка пройдена:
          • Скопируйте загруженный пакет вnpmкаталог кеша
          • Разархивируйте загруженный пакет в соответствии со структурой зависимостей вnode_modules
      • Кэш существует: распаковать кеш в соответствии со структурой зависимостей, чтобыnode_modules
    • Разархивируйте пакет вnode_modules
    • генерироватьlockдокумент
  • имеютlockдокумент:

    • экзаменpackage.jsonЯвляется ли версия зависимости в иpackage-lock.jsonИмеются конфликтующие зависимости в .
    • Если конфликта нет, пропустите процесс получения информации о пакете и построения дерева зависимостей и начните искать информацию о пакете в кеше.Последующий процесс аналогичен

Вышеупомянутый процесс кратко описываетnpm installПриблизительный процесс этого процесса также включает в себя некоторые другие операции, такие как выполнение определенных вами функций жизненного цикла, которые вы можете выполнитьnpm install package --timing=true --loglevel=verboseЧтобы просмотреть конкретный процесс установки и сведения о пакете.

3.7 yarn

yarnв2016выпущен в 2009 году, когдаnpmеще вV3период, еще нетpackage-lock.json文件,就像上面我们提到的:不稳定性、安装速度慢等缺点经常会受到广大开发者吐槽。 В настоящее время,yarnРождение:

Выше упоминается на официальном сайтеyarnВ то время преимущества все еще были очень привлекательными. Конечно, позжеnpmЯ также знал о своих собственных проблемах и сделал много оптимизаций.В более поздних оптимизациях (lockфайл, кеш, по умолчанию -s...), мы можем видеть более или менееyarnтень, видимоyarnДизайн по-прежнему очень хорош.

yarnтакже используетсяnpm v3Плоская структура для управления зависимостями.После установки зависимостей будет сгенерировано значение по умолчанию.yarn.lockфайл или приведенные выше зависимости, давайте посмотримyarn.lockСтруктура:

# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1


base64-js@1.0.1:
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.0.1.tgz#6926d1b194fbc737b8eed513756de2fcda7ea408"
  integrity sha1-aSbRsZT7xze47tUTdW3i/Np+pAg=

base64-js@^1.0.2:
  version "1.3.1"
  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
  integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==

buffer@^5.4.3:
  version "5.4.3"
  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.4.3.tgz#3fbc9c69eb713d323e3fc1a895eee0710c072115"
  integrity sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==
  dependencies:
    base64-js "^1.0.2"
    ieee754 "^1.1.4"

ieee754@^1.1.4:
  version "1.1.13"
  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
  integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==

ignore@^5.1.4:
  version "5.1.4"
  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
  integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==

Видно, что суммаpackage-lock.jsonФайлы по-прежнему похожи, с некоторыми отличиями:

  • package-lock.jsonиспользуетjsonФормат,yarn.lockиспользует пользовательский формат
  • yarn.lockНомер версии нейтронных зависимостей не фиксирован, что означает отдельныйyarn.lockне уверенnode_modulesструктура каталогов, также необходимо иpackage.jsonфайл для сотрудничества. а такжеpackage-lock.jsonДля уверенности нужен только один файл.

yarnСтратегия смягчения выглядит иnpm v5Как и раньше, каждый кэшированный модуль хранится в отдельной папке, а имя папки содержит имя модуля, номер версии и другую информацию. использовать командуyarn cache dirКаталог, в котором можно просмотреть кешированные данные:

yarnИспользовать по умолчаниюprefer-onlineРежим, то есть сначала использовать сетевые данные, а затем запрашивать кэшированные данные, если запрос сетевых данных не удается.

Ссылаться на

резюме

Надеюсь, чтение этой статьи поможет вам в следующем:

  • К пониманиюpacakge.jsonПодробная конфигурация в проекте для дальнейшего понимания инженерной конфигурации проекта.
  • владелецnpmМеханизм управления версиями, может разумно полагаться на версию конфигурации
  • пониматьnpm installПринцип установки, можно использовать разумноnpmкеш,package-lock.json

Если в статье есть ошибки, исправьте их в комментариях, если статья вам поможет, ставьте лайк и подписывайтесь.

Если вы хотите читать больше качественных статей, вы можете подписаться на меняблог на гитхабе, твоя звезда✨, лайки и внимание - движущая сила моего постоянного творчества!

Рекомендую обратить внимание на мой паблик WeChat [code secret garden], каждый день выкладывать качественные статьи, будем общаться и расти вместе.