什么时候应该使用自动加载而不是require?


30

据我了解,require虽然它也可以加载单个功能,但它通常用于加载大块代码(类似于模块)。

另一方面,自动加载仅注册功能,并将加载推迟到执行时间。

我最近读了一篇提倡autoload专有使用的文章

它是更好地autoloadrequire?每种情况都有哪些典型用例?


3
@吉尔斯:FWIW,我不同意您删除标签autoload以及require这个问题。添加标签libraries很好,但是现在任何人都在使用标签搜索有关autoloadrequire找不到该标签的问题。这些都是人们将要搜索的重要的Emacs-Lisp函数。太糟糕了。而且想怎么乐于助人elisplibraries(特别是elisp真的会在实践中的Emacs的):他们不Emacsland区别很大,我害怕。(但不,我不反对拥有并使用它们。)
Drew

@Drew我正在进行适用的meta讨论。如果您认为此一般原则不适用于此处,请在meta上提出。
吉尔斯(Gillles)“所以-别再作恶了”

1
@吉尔斯:完成。是的,我读了一下,发现这也许是激发您动机的原因。我不同意许多一般原则。这并不意味着总会跟随TRT。
Drew

2
我同意Drew的观点:由于这个问题专门针对区分用例,autoload因此require我认为这些标签是合理的。实际上,仅将此问题标记libraries为“过分笼统”。我有一种用途require来触发“ my-foobar-cfg”的加载,顾名思义,该文件仅包含我的配置,而不包含库。
辣椒粉

Answers:


28

autoload不能代替require。通常require用于确保已加载特定文件。 autoload另一方面,Emacs可以在不立即加载文件的情况下,在哪个文件中找到给定功能的提示。仅当调用自动加载的函数时,才会加载相应的文件。

基本上,autoload您可以将整个文件的加载延迟到实际需要的时候。这就是为什么(特别是大)包通常将其入口函数定义为autoloads的原因。

如果您想对软件包进行大量的自定义设置,通常您会碰运气autoload。如果仍要避免,require则可以将自定义设置推迟到使用加载文件之后eval-after-load

Emacs手册的以下各节介绍了此主题:


2
也许还值得一提:(autoload或多或少)关于提供命令定义,因此您可以使用这些命令。require即将做的一切在库(在库,库需要,递归)可用。Emacs的功能远不止命令。(但是,是的,当然,一旦调用了自动加载的命令,就会加载整个库。)
Drew

4

在Emacs初始化方面,不要选择任何一个。GitHub用户jwiegley具有出色的使用包声明宏,该宏将需要或根据需要自动加载包。最适合用于延迟可按需加载的软件包的加载。


3

如果要在Emacs启动时直接加载某些功能并直接使用,请使用require,否则请使用autoload。我个人非常重视启动时间(实际上,我实际上每周会重启几次Emacs,有时每天会重启几次),因此我接受Emacs在需要时自动加载某个功能会花费一些时间。因此,请考虑一下您希望在Emacs启动后直接使用哪些内容,以及在需要时可以加载哪些内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.