Kiedy powinienem używać automatycznego ładowania zamiast wymagać?

30

Z tego, co rozumiem, requiresłuży do ładowania dużych fragmentów kodu (coś w rodzaju modułów), chociaż może również ładować poszczególne funkcje.

Z drugiej strony autoload, rejestruje tylko funkcje i odkłada ładowanie do czasu wykonania.

Niedawno przeczytałem artykuł, który zaleca stosowanie autoloadwyłącznie.

Czy to jest lepsze autoloadniż require? Jakie są typowe przypadki użycia dla każdego z nich?

caisah
źródło
3
@Gilles: FWIW, nie zgadzam się z tym, że usunąłeś tagi autoloadi requirez tego pytania. Dodanie tagu librariesbyło w porządku, ale teraz każdy, kto szuka, używając tagów, pytań autoloadlub requirenie znajdzie tego. Są to ważne funkcje Emacsa-Lispa, których ludzie będą szukać. Szkoda I pomyślcie, jak pomocne elispi libraries(szczególnie elisp) będą naprawdę w praktyce dla strony Emacs: obawiam się, że nie rozróżniają wiele w Emacsland. (Ale nie, nie jestem przeciwny ich posiadaniu i używaniu.)
Drew
@Drew Idę na obowiązującą meta dyskusję . Jeśli uważasz, że ta ogólna zasada nie ma tutaj zastosowania, prosimy o podniesienie jej na meta.
Gilles „SO- przestań być zły”
1
@Gilles: Gotowe . Tak, przeczytałem to i doszedłem do wniosku, że to może motywowało cię. Nie zgadzam się z wieloma ogólnymi zasadami. Nie oznacza to, że podążanie za nimi w sposób ogólny jest zawsze TRT.
Drew
2
Zgadzam się z Drew: ponieważ to pytanie dotyczy w szczególności rozróżnienia przypadków użycia autoloadi requiremyślę, że te tagi są uzasadnione. W rzeczywistości nazywanie tego pytania [tylko] librarieszbytnim uogólnieniem. Dla jednego użycia requirewyzwalam ładowanie „my-foobar-cfg”, który, jak sama nazwa wskazuje, zawiera tylko moją konfigurację, a nie bibliotekę.
papryka

Odpowiedzi:

28

autoloadnie zastępuje require. Zwykle requiresłuży do upewnienia się, że określony plik jest załadowany. autoloadz drugiej strony daje Emacsowi wskazówkę, w którym pliku znaleźć daną funkcję bez ładowania pliku od razu. Odpowiedni plik jest ładowany tylko wtedy, gdy wywołana jest funkcja automatycznego ładowania.

Zasadniczo autoloadmożesz opóźnić ładowanie całego pliku do momentu, w którym rzeczywiście go potrzebujesz. Dlatego (szczególnie duże) pakiety zwykle definiują swoje funkcje wejścia jako autoloads.

Jeśli chcesz dokonać ciężkich dostosowań pakietu, zwykle nie masz szczęścia autoload. Jeśli nadal chcesz tego uniknąć require, możesz odroczyć dostosowania do momentu załadowania pliku za pomocą eval-after-load.

Podręcznik Emacsa obejmuje ten temat w następujących sekcjach:

papryka
źródło
2
Być może warto również wspomnieć: autoloadjest (mniej więcej) o dostarczaniu definicji poleceń, abyś mógł ich używać. requirepolega na udostępnianiu wszystkiego w bibliotece (i w bibliotekach, których wymaga biblioteka rekurencyjnie). Emacs to coś więcej niż komendy. (Ale tak, oczywiście po uruchomieniu autoloadera cała biblioteka jest ładowana.)
Drew,
4

Jeśli chodzi o inicjalizację Emacsa, nie dokonuj wyboru. Użytkownik GitHub, jwiegley, ma doskonałe makro deklaracji use-package , które będzie wymagało lub automatycznie ładowało pakiet zgodnie z potrzebą. Najlepiej stosować, aby odłożyć ładowanie pakietów, które można ładować na żądanie.

Andy
źródło
3

Jeśli chcesz, aby pewna funkcja była ładowana i dostępna bezpośrednio po uruchomieniu Emacsa, użyj opcji wymaganej, w przeciwnym razie użyj funkcji automatycznego ładowania. Osobiście bardzo cenię czas uruchamiania (faktycznie uruchamiam ponownie Emacsa kilka razy w tygodniu, czasem kilka razy dziennie), więc zgadzam się, że zajmie to trochę czasu, gdy Emacs automatycznie załaduje określoną funkcję, gdy jej potrzebuję. Pomyśl więc o tym, co chcesz być dostępne bezpośrednio po uruchomieniu Emacsa i co można załadować w razie potrzeby.

Mathias Dahl
źródło