Перейти к содержанию

Работа с зависимостями в JavaScript

NPM

Создание файла package-lock.json

  1. Инициализируйте проект:
    npm init -y
    
  2. Установите зависимости:
    npm install
    

Поддержка механизма NPM package alias

Механизм NPM package alias позволяет устанавливать пакеты под разными именами, что удобно для одновременного использования нескольких версий библиотеки, замены зависимости без изменения её имени в коде и работы с форками.

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

В package.json в секции dependencies может быть указана следующая запись:

"dependencies": {
  "@babel/legacy-core": "npm:@babel/core@=7.12.0"
}

Консольный агент Johnny корректно обрабатывает эту запись, распознавая, что @babel/legacy-core – это alias для @babel/core версии 7.12.0. В ходе анализа зависимостей учитывается оригинальный пакет, предотвращая ошибки, связанные с несуществующими именами.

Yarn

Создание файла yarn.lock

  1. Инициализируйте проект:
    yarn init -y
    
  2. Установите зависимости:
    yarn install
    

Поддержка механизма Yarn selective dependency resolution

Yarn поддерживает избирательное разрешение версий через поле resolutions в package.json, что позволяет задавать конкретные версии зависимостей без редактирования yarn.lock.

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

CodeScoring поддерживает обработку данного механизма в консольном агенте Johnny. Вот несколько сценариев его работы:

Замена пакета

Для замены пакета через механизм resolutions, в package.json добавляется следующая запись. В данном примере пакет parcel/watcher заменяется на пакет favware/skip-dependency.

"resolutions": {
  "@parcel/watcher": "npm:@favware/skip-dependency@latest"
}

Соответствующая данному пакету запись в файле yarn.lockбудет следующей:

dependencies:
  "@parcel/watcher": "npm:2.1.0"

При установке в сборке используется пакет favware/skip-dependency версии 1.2.2. Консольный агент корректно идентифицирует данный механизм и анализирует именно финальный пакет.

"@parcel/watcher@npm:@favware/skip-dependency@latest":
  version: 1.2.2
  resolution: "@favware/skip-dependency@npm:1.2.2"

Фиксация версии транзитивной зависимости

Для фиксации версии через механизм resolutions в package.json добавляется следующая запись. В данном примере версия пакета http-signature фиксируется на 1.3.4.

"resolutions": {
  "http-signature": "1.3.4"
}

Соответствующие данному пакету записи в файле yarn.lock будут следующими:

dependencies:
  http-signature "~1.2.0"

При установке в сборке будет использована версия http-signature 1.3.4. Консольный агент анализирует финальную версию пакета.

http-signature@1.3.4, http-signature@~1.2.0:
  version "1.3.4"
  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.4.tgz#a65b41193110b222364e776fd1ac848655a0e2f0"

Фиксация версии при множественных зависимостях

Для фиксации версии при наличии нескольких зависимостей через механизм resolutions в package.json добавляется следующая запись. В данном примере версия пакета yaml фиксируется на 2.2.2.

"resolutions": {
  "yaml": "2.2.2"
}

Соответствующие данному пакету записи в файле yarn.lock будут следующими:

dependencies:
  yaml: ^1.10.0
  yaml: ^2.2.1
  yaml: ^1.7.2
  yaml: ^1.10.2
  yaml: ^2.3.4
  yaml: 2.3.1
  yaml: ^2.1.1

При установке в сборке будет использована версия 2.2.2. Консольный агент анализирует только зафиксированную в resolutions версию пакета.

"yaml@npm:2.2.2":
  version: 2.2.2
  resolution: "yaml@npm:2.2.2"