Когда я должен использовать автозагрузку вместо require?

30

Из того, что я понимаю require, используется для загрузки больших кусков кода (что-то вроде модулей), хотя он также может загружать отдельные функции.

Автозагрузка с другой стороны, только регистрирует функции и откладывает загрузку до времени выполнения.

Я недавно прочитал статью, которая защищает использование autoloadисключительно.

Это лучше autoloadчем чем require? Каковы некоторые типичные случаи использования для каждого из них?

caisah
источник
3
@ Жиль: FWIW, я не согласен с тем, что вы удалили теги autoloadи requireиз этого вопроса. Добавление тэга librariesбыло в порядке, но теперь любой, кто ищет, использует тэги для вопросов autoloadили requireне найдет этот. Это обе важные функции Emacs-Lisp, которые люди будут искать. Очень плохо. И подумайте, насколько полезными elispи libraries(особенно elisp) они будут на практике для сайта Emacs: боюсь, в Emacsland они мало чем отличаются. (Но нет, я не против иметь их и использовать их.)
Дрю
@ Обратил меня к мета-дискуссии . Если вы считаете, что этот общий принцип здесь не применим, поднимите его на мета.
Жиль "ТАК - перестань быть злым"
1
@ Жиль: Готово . Да, я прочитал это и подумал, что это, возможно, и мотивировало тебя. Я не согласен с множеством общих принципов. Это не означает, что следование им общим способом всегда является TRT.
Дрю
2
Я согласен с Дрю: поскольку этот вопрос конкретно касается разграничения вариантов использования, autoloadи requireя думаю, что эти теги оправданы. На самом деле, маркировка этого вопроса [только] с помощью librariesчрезмерного обобщения. Я, например, requireзапускаю загрузку «my-foobar-cfg», которая, как следует из названия, содержит только мою конфигурацию, а не библиотеку.
паприка

Ответы:

28

autoloadне является заменой require. Обычно requireиспользуется, чтобы убедиться, что определенный файл загружен. autoloadс другой стороны, Emacs дает подсказку, в каком файле найти данную функцию, не загружая файл сразу. Только когда вызывается функция автозагрузки, загружается соответствующий файл.

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

Если вы хотите сделать тяжелые настройки для пакета, как правило, вам не повезло autoload. Если вы все еще хотите избежать requireэтого, вы можете отложить свои настройки до тех пор, пока файл не будет загружен с помощью eval-after-load.

Руководство по Emacs охватывает эту тему в следующих разделах:

паприка
источник
2
Возможно, стоит упомянуть также: autoloadэто (более или менее) о предоставлении определений команд, так что вы можете использовать эти команды. requireо том, чтобы сделать все доступное в библиотеке (и в библиотеках, которые требует библиотека, рекурсивно) доступным. Emacs - это больше, чем команды. (Но да, конечно, после запуска автозагрузки команды загружается вся ее библиотека.)
Дрю
4

С точки зрения инициализации Emacs, не делайте выбор. У пользователя GitHub jwiegley есть превосходный макрос объявления use-package , который потребует или автоматически загрузит пакет в зависимости от необходимости. Лучше всего использовать для отсрочки загрузки пакетов, которые могут быть загружены по требованию.

Энди
источник
3

Если вы хотите, чтобы определенная функция загружалась и была доступна непосредственно при запуске Emacs, используйте require, в противном случае используйте автозагрузку. Я лично очень ценю время запуска (фактически я перезагружаю Emacs пару раз в неделю, иногда несколько раз в день), поэтому я согласен, что потребуется некоторое время, когда Emacs автоматически загрузит определенную функцию, когда она мне понадобится. Итак, подумайте, что вы хотите сделать доступным сразу после запуска Emacs, и что можно загрузить при необходимости.

Матиас Даль
источник