Quando devo usar o carregamento automático em vez de exigir?

30

Pelo que entendi, requireé usado para carregar grandes pedaços de código (algo como módulos), embora também possa carregar funções individuais.

O carregamento automático, por outro lado, apenas registra funções e adia o carregamento para o tempo de execução.

Recentemente, li um artigo que defende o uso autoloadexclusivo de.

É melhor do autoloadque fazer require? Quais são alguns casos de uso típicos para cada um deles?

caisah
fonte
3
@ Gilles: FWIW, eu discordo de você ter removido tags autoloade requiredesta pergunta. A adição de tags librariesfoi boa, mas agora qualquer um que esteja pesquisando, usando tags, perguntas sobre autoloadou requirenão encontrará essa. Essas são as duas funções importantes do Emacs-Lisp que as pessoas procurarão. Que pena. E pense em como realmente será útil elispe libraries(especialmente elisp) útil para um site do Emacs: eles não distinguem muito no Emacsland, receio. (Mas não, eu não sou contra tê-los e usá-los.)
de Drew
@ Drew Estou indo pela meta discussão aplicável . Se você acha que esse princípio geral não se aplica aqui, aumente-o em meta.
Gilles 'SO- stop be evil'
1
@ Gilles: Feito . Sim, eu li isso e achei que era isso que talvez tivesse motivado você. Não discordo de muitos princípios gerais. Isso não significa que segui-los de maneira geral é sempre TRT.
Drew
2
Eu concordo com Drew: como essa pergunta é especificamente sobre distinguir os casos de uso autoloade requireacho que essas tags são justificadas. De fato, rotular essa pergunta [somente] com librariesé generalizada demais. Eu, pelo menos, uso requirepara acionar o carregamento do "my-foobar-cfg", que, como o nome sugere, contém apenas minha configuração, não uma biblioteca.
Paprika

Respostas:

28

autoloadnão é um substituto para require. Geralmente requireé usado para garantir que um determinado arquivo seja carregado. autoloadpor outro lado, dá ao Emacs uma dica sobre qual arquivo encontrar uma determinada função sem carregá-lo imediatamente. Somente quando a função de carregamento automático é chamada, o arquivo correspondente é carregado.

Basicamente, autoloadvocê pode atrasar o carregamento de um arquivo inteiro para o momento em que você realmente precisa dele. É por isso que pacotes (especialmente grandes) geralmente definem suas funções de entrada como autoloads.

Se você deseja fazer personalizações pesadas para um pacote, geralmente está sem sorte autoload. Se você ainda deseja evitar require, pode adiar suas personalizações até depois que o arquivo tiver sido carregado usando eval-after-load.

O manual do Emacs aborda esse tópico nas seguintes seções:

páprica
fonte
2
Talvez valha a pena mencionar também: autoloadé (mais ou menos) fornecer definições de comandos, para que você possa usá-los. requiretrata-se de disponibilizar tudo em uma biblioteca (e em bibliotecas que essa biblioteca exige, recursivamente). Há mais no Emacs do que comandos. (Mas sim, é claro que uma vez que um comando carregado automaticamente é chamado, toda a sua biblioteca é carregada.) #
277
4

Em termos de inicialização do Emacs, não faça nenhuma escolha. O usuário do GitHub, jwiegley, possui a excelente macro de declaração de pacote de uso , que exigirá ou carregará automaticamente um pacote, conforme a necessidade. Melhor usado para adiar o carregamento de pacotes que podem ser carregados sob demanda.

Andy
fonte
3

Se você deseja que um determinado recurso seja carregado e esteja disponível diretamente quando o Emacs for iniciado, use require, caso contrário, use o carregamento automático. Pessoalmente, valorizo ​​muito o tempo de inicialização (na verdade, reinicio o Emacs algumas vezes por semana, às vezes várias vezes por dia), então aceito que levará um pouco de tempo quando o Emacs carregar automaticamente uma determinada função quando necessário. Portanto, pense sobre o que você quer que esteja disponível diretamente após o Emacs ser iniciado e o que pode ser carregado quando necessário.

Mathias Dahl
fonte