Как отказаться от jQuery в современном фронтенде: опыт команды GitHub
Не так давно GitHub полностью перестал использовать jQuery в своём фронтенд-коде. Мы перевели пост, в котором разработчики рассказывают, с чего началась их работа с jQuery, как они поняли, что пора от него отказываться, и как они смогли сделать это без использования других библиотек или фреймворков.
Зачем jQuery был нужен раньше?
jQuery 1.2.1 вошёл в число зависимостей GitHub в конце 2007 года. Это произошло за год до того, как Google выпустил первую версию браузера Chrome. На тот момент не было общепринятого способа обращаться к элементам DOM с помощью CSS-селектора, не было стандартного способа добавить анимацию к стилю элемента, а интерфейс XMLHttpRequest, предложенный Internet Explorer, как и многие API, был плохо совместим с браузерами.
С jQuery стало гораздо проще управлять DOM, создавать анимации и делать AJAX-запросы. У веб-разработчиков появилась возможность создавать более современные, динамические сайты, которые выделялись среди остальных. Самое главное, все функции JavaScript, проверенные в одном браузере с помощью jQuery, как правило, работали и в других браузерах. На заре GitHub, когда большинство его функций только обретали форму, появление jQuery позволило небольшой команде разработчиков быстро создавать прототипы и представлять новые функции без необходимости подстраивать их отдельно под каждый браузер.
Простой интерфейс jQuery также послужил основой для создания библиотек, которые в будущем стали компонентами остальной части фронтенда GitHub.com: pjax и facebox.
Веб-стандарты в последующие годы
С течением времени GitHub превратился в компанию с сотнями разработчиков и постепеннно сформировалась команда, которая отвечала за размер и качество JavaScript-кода, который мы отправляем браузерам. Одна из вещей, за которыми мы постоянно следим, — технический долг, порой вырастающий из некогда полезных зависимостей, которые потеряли свою актуальность по прошествии времени.
Когда очередь дошла до jQuery, мы сравнили его с развивающимся веб-стандартом в браузерах и поняли, что:
- Шаблон
$(selector)
можно легко заменить наquerySelectorAll()
; - Переключение CSS-классов теперь можно осуществить с помощью Element. classList;
- CSS теперь поддерживает создание анимации в таблицах стилей, а не в JavaScript;
$.ajax
-запросы можно выполнять с помощью Fetch Standard;- Интерфейс
достаточно стабилен для кроссплатформенного использования; - Шаблон делегирования событий легко инкапсулировать с помощью легковесной библиотеки;
- С эволюцией JavaScript часть синтаксического сахара jQuery устарела.
Кроме того, синтаксис цепочек команд не удовлетворял нашим представлениям о коде, который мы хотели бы писать в будущем. Например:
$('.js-widget') .addClass('is-loading') .show()
Такой синтаксис прост в написании, однако по нашим стандартам не очень хорошо передаёт намерения автора. Сколько элементов js-widget
, по его задумке, должно быть на странице: один или больше? А если мы обновим разметку страницы и случайно оставим имя класса js-widget
, будет ли выброшено исключение, которое сообщит нам, что что-то пошло не так? По умолчанию jQuery молча пропускает всё выражение, когда нет совпадений по начальному селектору; однако для нас такое поведение было больше багом, нежели фичей.
Наконец, нам хотелось начать аннотировать типы с Flow, чтобы проводить статическую проверку типов во время сборки, и мы пришли к выводу, что синтаксис цепочек плохо поддаётся статическому анализу, так как почти каждый результат вызова метода jQuery одного и того же типа. Из возможных вариантов мы выбрали именно Flow, так как тогда такие возможности, как режим @flow weak
, позволили нам начать прогрессивно и эффективно применять типы к кодовой базе, которая по большей части была нетипизированной.
В конечном счёте отказ от jQuery означает, что мы можем больше полагаться на веб-стандарты, использовать веб-документацию MDN в качестве официальной документации для наших фронтендеров, поддерживать более гибкий код в будущем и уменьшить вес наших зависимостей на 30 Кбайт, что в итоге увеличит скорость загрузки страницы и выполнения JavaScript.
Постепенный переход
Хотя наша конечная цель была не за горами, мы знали, что было бы нецелесообразно направить все имеющиеся ресурсы на переписывание всего с jQuery на чистый JS. Во всяком случае, такое поспешное решение негативно бы сказалось на функциональности сайта, от которой нам бы пришлось отказаться. Вместо этого мы:
- Начали отслеживать количество вызовов jQuery на строку кода и следили за графиком на протяжении времени, чтобы убедиться, что он либо не меняется, либо падает, но не растёт.
- Отказались от использования jQuery в новом коде. Чтобы достичь этого с помощью автоматизации, мы создали eslint-plugin-jquery, который проваливал CI-тесты при попытке использовать возможности jQuery вроде
$.ajax
. - В старом коде появилось много нарушений правил eslint, которые мы пометили с помощью специальных правил
eslint-disable
в комментариях. Для того, кто будет это читать, такие комментарии должны были служить явным сигналом того, что здесь не отражаются наши текущие методы написания кода - Мы написали бота, который при отправке pull request’а оставлял комментарий, сигнализирующий нашей команде каждый раз, как кто-то хотел добавить новое правило
eslint-disable
. Таким образом мы могли провести ревью кода на ранней стадии и предложить альтернативы. - Большая часть старого кода была явно связана с внешними интерфейсами jQuery-плагинов pjax и facebox, поэтому мы оставили их интерфейсы почти без изменений, в то время как изнутри заменили их реализацией на чистом JS. Наличие статической проверки типов вселило в нас уверенность в проводимом рефакторинге.
- Много старого кода было связано с rails-behaviors, нашим адаптером для Ruby on Rails, таким образом, что он присоединял обработчик жизненного цикла AJAX к определённым формам:
Вместо того чтобы переписывать все эти вызовы согласно новому подходу, мы решили использовать ложные события жизненного цикла
ajax*
, и формы продолжали отправлять данные асинхронно, как и раньше; только теперь изнутри использовалсяfetch()
. - Мы поддерживали свою сборку jQuery, из которой убирали ненужные нам модули и заменяли более лёгкой версией. Например, после избавления от всех jQuery-специфичных CSS-псевдоселекторов вроде
:visible
или:checkbox
мы смогли убрать модуль Sizzle; а когда мы заменили$.ajax
-вызовы наfecth()
, мы смогли отказаться от модуля AJAX. Мы убивали двух зайцев разом: уменьшали время выполнения JavaScript, параллельно гарантируя то, что никто не напишет код, который будет пытаться использовать удалённую функциональность. - Глядя на статистику нашего сайта, мы старались прекратить поддержку Internet Explorer настолько быстро, насколько это возможно. Как только использование определённой версии IE падало ниже определённого порога, мы прекращали её поддержку и фокусировались на более современных браузерах. Отказ от поддержки IE 8-9 на раннем этапе позволил нам использовать многие нативные возможности браузеров, которые в противном случае было бы сложно «заполифиллить».
- В рамках нашего усовершенствованного подхода к написанию фронтенда GitHub мы сосредоточились на использовании обычного HTML по-максимуму, добавляя JavaScript в качестве последовательного улучшения. В итоге даже те формы и другие элементы интерфейса, которые были улучшены с помощью JS, как правило, могли работать даже с выключенным в браузере JavaScript. В некоторых случаях нам даже удалось удалить определённую устаревшую функциональность вместо её переписывания на чистом JS.
Благодаря этим и аналогичным усилиям с течением времени мы постепенно смогли уменьшить нашу зависимость от jQuery вплоть до того момента, когда не осталось ни одной строки кода, ссылающейся на эту библиотеку.
Custom Elements: пользовательские элементы
Одна технология, наделавшая шуму в последние годы, — Custom Elements: библиотека компонентов, встроенная в браузер, что означает отсутствие необходимости для пользователя качать, парсить и компилировать дополнительные байты фреймворка.
Мы создали несколько пользовательских элементов на основе спецификации v0 с 2014 года. Однако, поскольку стандарты в то время постоянно менялись, мы сильно в это не вкладывались. А начали только с 2017 года, когда была выпущена спецификация Web Components v1, реализованная как в Chrome, так и в Safari.
Во время перехода с jQuery мы искали структуры, которые можно было бы извлечь в качестве пользовательских элементов. Например, мы преобразовали код facebox, использованный для отображения модальных диалогов, в элемент <details-dialog>
.
Наша общая философия прогрессивного улучшения относится и к пользовательским элементам. Это значит, что мы стараемся хранить как можно больше контента в разметке и только добавлять поведение поверх неё. Например, <local-time>
по умолчанию показывает исходную временную метку, но с улучшением может переводить время в местный часовой пояс, а <details-dialog>
, расположенный внутри элемента <details>
, интерактивен даже без JavaScript, но может быть улучшен до расширенных возможностей доступа.
Вот пример того, как можно реализовать элемент <local-time>
:
// Элемент local-time отображает время в текущем // часовом поясе и местоположении пользователя. // // Пример: // Sep 6, 2018 // class LocalTimeElement extends HTMLElement { static get observedAttributes() { return ['datetime'] } attributeChangedCallback(attrName, oldValue, newValue) { if (attrName === 'datetime') { const date = new Date(newValue) this.textContent = date.toLocaleString() } } } if (!window.customElements.get('local-time')) { window.LocalTimeElement = LocalTimeElement window.customElements.define('local-time', LocalTimeElement) }
Один из аспектов Web Components, который мы очень хотим перенять, — Shadow DOM. У Shadow DOM есть потенциал для раскрытия множества возможностей для веба, однако он также усложняет полифиллинг. Так как его полифиллинг на данный момент приведёт к снижению производительности даже для кода, который управляет частями DOM, не относящихся к веб-компонентам, для нас нецелесообразно использовать его в продакшне.
Полифиллы
Здесь вы можете увидеть полифиллы, которые помогли нам перейти к использованию встроенных возможностей браузера. Мы стараемся использовать их, только когда это совершенно необходимо, т.е. как часть отдельного JavaScript-бандла для совместимости с устаревшими браузерами.
- github/eventlistener-polyfill
- github/fetch
- github/form-data-entries
- iamdustan/smoothscroll
- javan/details-element-polyfill
- jonathantneal/closest
- kumarharsh/custom-event-polyfill
- marvinhagemeister/request-idle-polyfill
- mathiasbynens/String.prototype.codePointAt
- mathiasbynens/String.prototype.endsWith
- mathiasbynens/String.prototype.startsWith
- medikoo/es6-symbol
- nicjansma/usertiming.js
- rubennorte/es6-object-assign
- stefanpenner/es6-promise
- webcomponents/template
- webcomponents/URL
- webcomponents/webcomponentsjs
- WebReflection/url-search-params
- yola/classlist-polyfill
Смотрите также: «Фундаментальные принципы объектно-ориентированного программирования на JavaScript»
Перевод статьи «Removing jQuery from GitHub. com frontend»
Менторы по jQuery | Наставники по jQuery
Подберите наставника для индивидуальных занятий и ускорьте свое обучение
Сформулируйте цель
Выберите наставника и оставьте заявку
Познакомьтесь с наставником
Проведем бесплатный 15 минутный звонок, чтобы познакомиться с наставником, обсудить цели и задать вопросы.
Подробнее о занятиях
Занимайтесь с наставником
И достигайте своих целей!
На ресурсе доступно 26 наставников
1712₽ / час
- Пакет 10 занятий-10%
Подробнее
На бесплатное занятие
2140₽ / час
- Пакет 10 занятий-10%
Подробнее
На бесплатное занятие
2140₽ / час
Подробнее
На бесплатное занятие
Нужна помощь в выборе?
Команда Solvery подберёт вам подходящего ментора!
Это бесплатно
1498₽ 2140₽ / час
- Первое занятие-30%
- Пакет 5 занятий-5%
- Пакет 10 занятий-10%
Подробнее
На бесплатное занятие
1077₽ 2140₽ / час
- Первое занятие-50%
- Пакет 5 занятий-5%
- Пакет 10 занятий-10%
Подробнее
На бесплатное занятие
2440₽ 2568₽ / час
- Первое занятие-5%
- Пакет 5 занятий-5%
Подробнее
На бесплатное занятие
2711₽ / час
- Пакет 5 занятий-5%
- Пакет 10 занятий-10%
Подробнее
На бесплатное занятие
2568₽ 2854₽ / час
- Первое занятие-10%
- Пакет 5 занятий-5%
- Пакет 10 занятий-10%
Подробнее
На бесплатное занятие
2409₽ 3211₽ / час
- Первое занятие-25%
- Пакет 5 занятий-5%
- Пакет 10 занятий-10%
Подробнее
На бесплатное занятие
2854₽ 3567₽ / час
- Первое занятие-20%
- Пакет 5 занятий-5%
- Пакет 10 занятий-10%
Подробнее
На бесплатное занятие
вызвать | Cypress Documentation
Вызвать функцию для ранее полученного объекта.
Если вы хотите получить свойство, которое не является функцией ранее полученного
предмет, используйте .its()
.
Если вы соедините дальнейшие команды с .invoke()
, это будет называться множественным
раз. Если вы хотите, чтобы метод вызывался только один раз, завершите свою цепочку с помощью .invoke()
и затем начать заново с cy
.
Синтаксис
.invoke(имя_функции) .invoke(параметры, имя_функции) .invoke(имя_функции, аргументы...) .invoke(параметры, имя_функции, аргументы...)
Использование
Правильное использование
cy.get('.input').invoke('val').should('eq', 'foo') // Вызов функции 'val' cy.get('.modal').invoke('show') // Вызов функции jQuery 'show' cy.wrap({ animate: fn }).invoke('animate') // Вызов функции 'animate'
Неправильное использование
cy.invoke('convert') // Ошибки, не могут быть связаны с 'cy' cy. wrap({ name: 'Jane' }).invoke('name') // Ошибки, 'name' не является функцией cy.wrap({ анимация: fn }) .invoke('анимация') .then(() => {}) // 'animate' будет вызываться несколько раз
Аргументы
имя_функции (строка, число)
Имя вызываемой функции.
options (объект)
Передайте объект параметров, чтобы изменить поведение по умолчанию .invoke()
.
Опция | По умолчанию | Описание |
---|---|---|
журнал | истина0074 | |
timeout | defaultCommandTimeout | Time to wait for .invoke() to resolve before timing out |
args...
Дополнительные аргументы для вызова функции. Нет ограничений на количество аргументов.
Yields
-
.invoke()
возвращает возвращаемое значение метода. -
.invoke()
это запрос, и безопасно связывать дальнейшие команды. - Если вы выберете дополнительные команды из
.invoke()
, функция будет звонили несколько раз!
Примеры
Функция
Утверждение возвращаемого значения функции
const fn = () => { вернуть 'бар' } cy.wrap({ foo: fn }).invoke('foo').should('eq', 'bar') // true
Используйте
.invoke()
для проверки содержимого HTMLСвойства, которые являются функциями, вызываются
В приведенном ниже примере мы используем .invoke()
, чтобы скрытый div был 'display: block'
, чтобы мы могли взаимодействовать с его дочерними элементами.
cy.get('div.контейнер') .should('be.hidden') // элемент скрыт .invoke('show') // вызвать метод jquery 'show' в '. container' .should('be.visible') // элемент теперь виден .find('input') // переход к дочернему элементу "input" .type('Cypress великолепен') // и введите текст
Использовать
.invoke('show')
и .invoke('trigger')
Функция с аргументами
Отправить определенные аргументы в функцию
const fn = (a, b, c) => { вернуть а + б + с } cy.wrap ({сумма: fn}) .invoke('сумма', 2, 4, 6) .should('be.gt', 10) // верно .and('be.lt', 20) // верно
Используйте
cy.invoke('removeAttr', 'target')
, чтобы обойти новую вкладкуАргументы автоматически перенаправляются в функцию
cy.get('img').invoke('attr', 'src').should('include', 'myLogo')
Массивы
В приведенных выше примерах субъект был объектом, но cy.invoke
также работает с
массивы и позволяет использовать числовой индекс для выбора функции для запуска.
const reverse = (s) => Cypress. _.reverse(s) const double = (n) => n * n // выбирает функцию с индексом 1 и вызывает ее с аргументом 4 cy.wrap([reverse, double]).invoke(1, 4).should('eq', 16)
метод jQuery
Если родительская команда возвращает элемент jQuery, мы можем вызвать метод jQuery,
например attr
, text
или val
. Чтобы подтвердить атрибут id
элемента для
пример:
Пример кода
cy.contains('Пример кода') .invoke('атрибут', 'идентификатор') .should('равно', 'фрагмент кода')
Совет: Cypress имеет встроенное утверждение Chai-jQuery для подтверждения атрибута. Приведенный выше пример можно записать просто так:
cy.contains('Пример кода').should('have.attr', 'id', 'фрагмент кода')
Примечания
Плагины сторонних производителей
Использование Kendo DropDown
Если вы используете jQuery
, то jQuery
обернутые элементы будут автоматически
иметь доступ к сторонним плагинам для вызова.
cy.get('ввод') .invoke('getKendoDropDownList') .then((dropDownList) => { // возвращает результат $input.getKendoDropDownList() вернуть dropDownList.select('яблоки') })
Мы можем переписать предыдущий пример более лаконично и добавить утверждение.
cy.get('ввод') .invoke('getKendoDropDownList') .invoke('выбрать', 'яблоки') .invoke('val') .should('матч', /яблоки/)
Повторные попытки
.invoke()
автоматически повторяет вызов указанного метода до тех пор, пока
возвращаемое значение удовлетворяет приложенным утверждениям. Пример ниже проходит после
1 секунда.
пусть сообщение = 'привет' постоянный английский = { приветствие() { ответное сообщение }, } setTimeout(() => { сообщение = 'до свидания' }, 1000) // изначально english.greeting() возвращает "hello", если утверждение не выполняется. // .invoke('приветствие') пытается снова и снова, пока не пройдет 1 секунда // возвращаемое сообщение становится "до свидания" и утверждение проходит cy. wrap(английский).invoke('приветствие').should('равно', 'пока')
Правила
Требования
-
.вызвать()
требует привязки к предыдущей команде.
Утверждения
-
.вызвать()
будет ждатьфункция
существовать на эту тему перед бегом. -
.вызвать()
будет ждать обещание решить, если вызванфункция
возвращает обещание. -
.вызвать()
будет автоматически повторить попытку пока все связанные утверждения не будут прошло
Время ожидания
-
.вызвать()
может истечь время ожидания утверждений, которые вы добавили в проходят. -
.вызвать()
может истечь время ожидания обещания, к которому вы вернулись решать.
Журнал команд
Вызов метода jQuery show для элемента
cy.get('.connectors-div') . должен('быть.скрытым') .вызвать('показать') .должен('быть.видимым')
Приведенные выше команды будут отображаться в журнале команд как:
При нажатии на вызова
в журнале команд консоль выводит
Следующее:
ИСТОРИЯ
Версия | Изменения |
---|---|
12.0.0 | .Invoke () не больше поддерживает промоты или ASYNC. опции аргумент |
3.7.0 | Добавлена поддержка аргументов типа Число для имя_функции |
См. также
-
.its()
-
.затем()
-
cy.wrap()
Использование интерфейса командной строки LibMan с ASP.NET Core
- Статья
- 8 минут на чтение
Скотт Адди
Интерфейс командной строки LibMan — это кроссплатформенный инструмент, который поддерживается везде, где поддерживается .NET Core.
Предварительные требования
- Пакет SDK для .NET Core 2.1 или более поздней версии
Установка
Чтобы установить интерфейс командной строки LibMan:
dotnet tool install -g Microsoft.Web.LibraryManager.Cli
Глобальный инструмент .NET Core устанавливается из пакета NuGet Microsoft.Web.LibraryManager.Cli.
Чтобы установить интерфейс командной строки LibMan из определенного источника пакета NuGet:
dotnet tool install -g Microsoft.Web.LibraryManager.Cli --version 1.0.94-g606058a278 --add-source C:\Temp\
В предыдущем примере глобальный инструмент .NET Core устанавливается из файла C:\Temp\Microsoft.Web.LibraryManager.Cli.1.0.94-g606058a278.nupkg локального компьютера Windows.
Использование
После успешной установки интерфейса командной строки можно использовать следующую команду:
libman
Для просмотра установленной версии CLI:
libman --версия
Для просмотра доступных команд CLI:
libman --help
Вывод предыдущей команды примерно такой:
1.0.163+g45474d37ed Использование: libman [опции] [команда] Параметры: --help|-h Показать справочную информацию --version Показать информацию о версии Команды: кеш Список или очистить содержимое кеша libman clean Удаляет из проекта все файлы библиотеки, определенные в libman.json. init Создать новый файл libman.json install Добавьте определение библиотеки в файл libman.json и загрузите библиотеку в указанное место restore Загружает все файлы от провайдера и сохраняет их в указанном пункт назначения uninstall Удаляет все файлы указанной библиотеки из указанных место назначения, затем удаляет указанное определение библиотеки из libman. json update Обновляет указанную библиотеку Используйте «libman [команда] --help» для получения дополнительной информации о команде.
В следующих разделах описаны доступные команды CLI.
Инициализировать LibMan в проекте
Команда libman init
создает файл libman.json
, если он не существует. Файл создается с содержимым шаблона элемента по умолчанию.
Краткий обзор
libman init [-d|--назначение-по умолчанию] [-p|--по умолчанию-провайдер] [--verbosity] инициализация libman [-h|--help]
Опции
Следующие опции доступны для libman init
команда:
-d|--назначение по умолчанию <ПУТЬ>
Путь относительно текущей папки. Файлы библиотеки устанавливаются в этом расположении, если для библиотеки в
libman.json
свойство назначения не определено. ЗначениеdefaultDestination
libman. json
.-p|--по умолчанию-провайдер <ПОСТАВЩИК>
Используемый поставщик, если для данной библиотеки не определен поставщик. Значение
.defaultProvider
libman.json
. Замените-
cdnjs
-
файловая система
-
джсделивр
-
без упаковки
-
Примеры
Чтобы создать Файл libman.json
в проекте ASP.NET Core:
Перейдите к корню проекта.
Выполните следующую команду:
инициализация библиотеки
Введите имя провайдера по умолчанию или нажмите
Введите
, чтобы использовать провайдера CDNJS по умолчанию. Допустимые значения включают:-
cdnjs
-
файловая система
-
джсделивр
-
без упаковки
-
В корень проекта добавлен файл libman. json
со следующим содержимым:
{ "версия": "1.0", "defaultProvider": "cdnjs", "библиотеки": [] }
Добавить файлы библиотеки
Команда libman install
загружает и устанавливает файлы библиотеки в проект. Файл libman.json
добавляется, если он не существует. Файл libman.json
изменен для хранения сведений о конфигурации файлов библиотеки.
Краткий обзор
libman install <БИБЛИОТЕКА> [-d|--destination] [--files] [-p|--provider] [--verbosity] установка libman [-h|--help]
Аргументы
БИБЛИОТЕКА
Имя устанавливаемой библиотеки. Это имя может включать обозначение номера версии (например, @1.2.0
).
Опции
Для команды libman install
доступны следующие опции:
-d|--destination <ПУТЬ>
Место для установки библиотеки. Если не указано, используется расположение по умолчанию. Если свойство
defaultDestination
не указано вlibman.json
, этот параметр является обязательным.--files <ФАЙЛ>
Укажите имя файла для установки из библиотеки. Если не указано, устанавливаются все файлы из библиотеки. Укажите один параметр
--files
для каждого устанавливаемого файла. Относительные пути тоже поддерживаются. Например:--files dist/browser/signalr.js
.-p|--provider <ПОСТАВЩИК>
Имя провайдера для получения библиотеки. Замените
.-
cdnjs
-
файловая система
-
джсделивр
-
без упаковки
Если не указано, свойство
defaultProvider
вlibman.json
используется. Если свойствоdefaultProvider
не указано вlibman. json
, этот параметр является обязательным.-
Примеры
Рассмотрим следующий файл libman.json
:
{ "версия": "1.0", "defaultProvider": "cdnjs", "библиотеки": [] }
Чтобы установить файл jQuery версии 3.2.1 jquery.min.js
в папку wwwroot/scripts/jquery с помощью поставщика CDNJS:
libman install [email protected] --provider cdnjs --destination wwwroot/scripts/jquery --files jquery.min.js
Файл libman.json
выглядит следующим образом:
{ "версия": "1.0", "defaultProvider": "cdnjs", "библиотеки": [ { "библиотека": "[email protected]", "пункт назначения": "wwwroot/scripts/jquery", "файлы": [ "jquery.min.js" ] } ] }
Для установки файлов calendar.js
и calendar.css
из C:\temp\contosoCalendar\ с использованием поставщика файловой системы:
libman install C:\temp\contosoCalendar\ --provider filesystem --files calendar. js --files calendar.css
Следующее приглашение появляется по двум причинам:
- Файл
libman.json
не содержит свойстваdefaultDestination
. - Команда
libman install
не содержит параметр-d|--destination
.
После принятия назначения по умолчанию файл libman.json
выглядит следующим образом:
{ "версия": "1.0", "defaultProvider": "cdnjs", "библиотеки": [ { "библиотека": "[email protected]", "пункт назначения": "wwwroot/scripts/jquery", "файлы": [ "jquery.min.js" ] }, { "библиотека": "C:\\temp\\contosoCalendar\\", "провайдер": "файловая система", "destination": "wwwroot/lib/contosoCalendar", "файлы": [ "календарь.js", "календарь.css" ] } ] }
Восстановление файлов библиотеки
Команда libman restore
устанавливает файлы библиотеки, определенные в libman. json
. Применяются следующие правила:
- Если в корне проекта нет файла
libman.json
, возвращается ошибка. - Если в библиотеке указан поставщик, свойство
defaultProvider
вlibman.json
игнорируется. - Если в библиотеке указано место назначения, свойство
defaultDestination
вlibman.json
игнорируется.
Краткий обзор
libman restore [--verbosity] libman восстановить [-h|--help]
Опции
Для команды libman restore
доступны следующие опции:
Примеры
Восстановление файлов библиотеки, определенных в libman.json
:
libman restore
Удалить файлы библиотеки
Команда libman clean
удаляет файлы библиотеки, ранее восстановленные с помощью LibMan. Папки, ставшие пустыми после этой операции, удаляются. Связанные конфигурации файлов библиотеки в библиотеки
свойство libman. json
не удаляются.
Синопсис
libman clean [--verbosity] libman очистить [-h|--help]
Опции
Для команды libman clean
доступны следующие опции:
Примеры
Для удаления файлов библиотеки, установленных через LibMan:
libman clean
Удаление файлов библиотеки
Команда libman uninstall
:
- Удаляет все файлы, связанные с указанной библиотекой, из места назначения в
libman.json
. - Удаляет конфигурацию связанной библиотеки из
libman.json
.
Ошибка возникает, когда:
- В корне проекта нет файла
libman.json
. - Указанная библиотека не существует.
Если установлено несколько библиотек с одинаковым именем, вам будет предложено выбрать одну из них.
Краткий обзор
libman uninstall[--verbosity] удалить libman [-h|--help]
Аргументы
БИБЛИОТЕКА
Имя удаляемой библиотеки. Это имя может включать обозначение номера версии (например, @1.2.0
).
Параметры
Для команды libman uninstall
доступны следующие параметры:
Примеры
Рассмотрим следующий файл libman.json
:
{ "версия": "1.0", "defaultProvider": "cdnjs", "библиотеки": [ { "библиотека": "[email protected]", "файлы": [ "jquery.min.js", "jquery.js", "jquery.min.map" ], "пункт назначения": "wwwroot/lib/jquery/" }, { "провайдер": "unpkg", "библиотека": "бутстрап@4.1.3", "пункт назначения": "wwwroot/lib/bootstrap/" }, { "провайдер": "файловая система", "библиотека": "C:\\temp\\lodash\\", "файлы": [ "lodash.js", "lodash.min.js" ], "пункт назначения": "wwwroot/lib/lodash/" } ] }
Чтобы удалить jQuery, выполните любую из следующих команд:
libman удалить jquery
libman удалить jquery@3. 3.1
Чтобы удалить файлы Lodash, установленные через поставщика файловой системы
удалить libman C:\temp\lodash\
Обновление версии библиотеки
Команда libman update
обновляет библиотеку, установленную через LibMan, до указанной версии.
Ошибка возникает, когда:
- В корне проекта нет файла
libman.json
. - Указанная библиотека не существует.
Если установлено несколько библиотек с одинаковым именем, вам будет предложено выбрать одну из них.
Краткий обзор
libman update <БИБЛИОТЕКА> [-pre] [--to] [--verbosity] обновление libman [-h|--help]
Аргументы
БИБЛИОТЕКА
Имя библиотеки для обновления.
Параметры
Для команды libman update
доступны следующие параметры:
Примеры
Чтобы обновить jQuery до последней версии:
libman обновить jquery
Чтобы обновить jQuery до версии 3. 3.1:
libman обновить jquery --до 3.3.1
Чтобы обновить jQuery до последней предварительной версии:
обновление libman jquery -pre
Управление кешем библиотеки
Команда libman cache
управляет кэшем библиотеки LibMan. Поставщик файловой системы не использует библиотечный кеш.
Краткий обзор
libman cache clean [] [--verbosity] список кеша libman [--files] [--libraries] [--verbosity] кеш libman [-h|--help]
Аргументы
PROVIDER
Используется только с командой clean
. Указывает кэш провайдера для очистки. Допустимые значения включают:
-
cdnjs
-
файловая система
-
джсделивр
-
без упаковки
Параметры
Для команды libman cache
доступны следующие параметры:
Примеры
Чтобы просмотреть имена кэшированных библиотек для каждого поставщика, используйте одну из следующих команд:
список кеша libman
список кеша libman --libraries
Отображается вывод, аналогичный следующему:
Содержимое кэша: --------------- распаковать: нокаутировать реагировать вью cdnjs: потрясающий шрифт jquery нокаутировать lodash. js реагировать
Чтобы просмотреть имена файлов кэшированных библиотек для каждого поставщика:
список кэшей libman --files
Отображается вывод, аналогичный следующему:
Содержимое кэша: --------------- распаковать: нокаутировать: <список опущен для краткости> реагировать: <список опущен для краткости> вид: <список опущен для краткости> cdnjs: потрясающий шрифт метаданные.json jquery метаданные.json 3.2.1\core.js 3.2.1\jquery.js 3.2.1\jquery.min.js 3.2.1\jquery.min.map 3.2.1\jquery.slim.js 3.2.1\jquery.slim.min.js 3.2.1\jquery.slim.min.map 3.3.1\core.js 3.3.1\jquery.js 3.3.1\jquery.min.js 3.3.1\jquery.min.map 3.3.1\jquery.slim.js 3.3.1\jquery.slim.min.js 3.3.1\jquery.slim.min.map нокаутировать метаданные.json 3.4.2\knockout-debug.js 3.