Как именно работает флаг обновления package.json (под капотом)

Я пытаюсь понять, как работает процесс обновления package.json. Например:

"dependencies": {
 "express": "^4.16.4",
},

В этом случае у меня Express с минусовым флагом ^ только для обновления 4.X.X. Это ясно. Но как именно работает это обновление? Я имею в виду, если я удалю папки node_module (и package-lock.json) через 1 неделю после первой установки (и будет выпущена новая экспресс-версия), какую версию я загружу? 4.16.4 или (например) 4.17.0? Я думаю, что 4.17.0, но package.json все еще остается с 4.16.4 (текстовое описание), и об обновлении сообщается в package-lock.json или что-то еще? Я никогда не видел изменения чисел в package.json.

Я очень смущен этим.

Иногда, когда я проверяю какой-то модуль из их папки, я вижу версию, отличную от package.json. Почему?

мой ответ имел смысл?

Nathan 09.04.2019 16:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
131
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Символ вставки (^) изменится на последняя основная версия (первое число). ^4.16.4 будет соответствовать любому выпуску 4.x.x, включая 4.17.x, но не будет обновляться до версии 5.0.0. выпуска Express, поскольку это основной выпуск с критическими изменениями в библиотеке Express.

Что касается вашего вопроса: «Если бы я удалил каталог node_modules и файл package-lock.json через неделю после первой установки Express и сказал, что в этот период была выпущена новая версия Express, какую версию Express я бы скачал?

Это зависит от того, была ли самая новая версия выпуском главный, незначительный, или пластырь. Если самая новая версия была второстепенной или патч-релизом: меняется второе или третье число, то npm установит последнюю версию 4.x.x. Express версия. В вашем конкретном примере сценария да, он установил бы ExpressV4.17.0. Вы также правы в том, что package.json по-прежнему будет указывать "express: "^4.16.4" как необходимую зависимость для создания вашего проекта. Это связано с тем, что каретка работает, как объяснялось ранее: возьмите последнюю версию 4.x.x. версия Express. Нет необходимости обновлять ваш список Express в package.json до последней версии, так как морковь позаботится об этом за вас. Если подумать, это действительно приятная функция, поскольку альтернативой будет вручную указывать выпуск каждой новой версии, даже если это всего лишь второстепенный выпуск или патч. И ни у кого нет на это времени... если только это не крупный релиз.

Кроме того, поскольку последний выпуск Express не был основным выпуском, то есть первое число вашего Semver, не изменилось, нет «критических изменений», поэтому обычно безопасно просто получить последнюю версию. Однако при этом вы можете указать точную версию любой зависимости, если хотите. Что касается файла package-lock.json, то этот файл похож на "снимок" вашего текущие конфигурации и сборки зависимостей. Таким образом, этот файл будет обновляться по мере того, как вы будете вносить изменения, влияющие на сборку вашего проекта: т. е. либо добавление новых зависимостей, либо обновление существующих версий. Это потому, что этот файл должен быть "источник истины" для других на случай, если они захотят воспроизвести создание вашего проекта и потенциально внести в него свой вклад.

Надеюсь, это поможет!

Другие вопросы по теме