Управляемое чтение
В настоящее время студенты фронтенд-разработки неразлучны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-name
package, чтобы проверить, допустимо ли имя пакета. -
Семантические имена пакетов могут помочь разработчикам быстрее находить нужные пакеты и избегать случайного приобретения неправильных пакетов.
-
Если в имени пакета есть символы, удалите символы и не дублируйте существующее имя пакета.
Например: из-за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
. Подходит для тестирования на местеnpm
package, этот метод не следует применять онлайн.
-
-
依赖包名称: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
Некоторыми номерами версий необходимо управлять в процессе разработки. Если эти номера версий соответствуютSemVer
spec , мы можем использовать пакеты 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
Дождитесь первой версии
Зависимый выбор области действия
- Основной проект зависит от множества подмодулей, которые разрабатываются членами команды.
npm
package, рекомендуется изменить префикс версии на~
, если он заблокирован, зависимости основного проекта должны обновляться каждый раз, когда обновляются подзависимости, что очень громоздко.Если вы полностью доверяете подзависимостям, вы можете напрямую открывать их.^
Каждый раз, когда вы обновляетесь до последней версии. - Основной проект работает в
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.json
Fabric установит зависимости в соответствующие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
Режим, то есть сначала использовать сетевые данные, а затем запрашивать кэшированные данные, если запрос сетевых данных не удается.
Ссылаться на
- nuggets.capable/post/684490…
- Ууху. Call.com/question/30…
- zhuanlan.zhihu.com/p/37285173
- semver.org/lang/zh-CN/
- мертвая лошадь. Что / узел будет / 2014 ...
- Cai Baojian.com/Годовой рейтинг/файлы/Боюсь…
резюме
Надеюсь, чтение этой статьи поможет вам в следующем:
- К пониманию
pacakge.json
Подробная конфигурация в проекте для дальнейшего понимания инженерной конфигурации проекта. - владелец
npm
Механизм управления версиями, может разумно полагаться на версию конфигурации - понимать
npm install
Принцип установки, можно использовать разумноnpm
кеш,package-lock.json
Если в статье есть ошибки, исправьте их в комментариях, если статья вам поможет, ставьте лайк и подписывайтесь.
Если вы хотите читать больше качественных статей, вы можете подписаться на меняблог на гитхабе, твоя звезда✨, лайки и внимание - движущая сила моего постоянного творчества!
Рекомендую обратить внимание на мой паблик WeChat [code secret garden], каждый день выкладывать качественные статьи, будем общаться и расти вместе.