requireではなくautoloadをいつ使用する必要がありますか?


30

私が理解していることから、require個々の機能をロードすることもできますが、コードの大きなチャンク(モジュールのようなもの)をロードするために使用されます。

反対側の自動ロードでは、関数のみを登録し、ロードを実行時間まで延期します。

私は最近、排他的使用を提唱する記事を読みましautoload

するautoloadよりも良いrequireですか?これらのそれぞれの典型的な使用例は何ですか?


3
@Gilles:FWIW、あなたがタグを削除したことautoloadrequire、この質問から私は同意しません。タグを追加すると、librariesに関する質問のために、タグを使用して、大丈夫だったが、今は誰も検索autoloadやはrequireこれを見つけることができません。これらは両方とも、人々が検索する重要なEmacs-Lisp関数です。残念な。そして、どのように役立つと思うelisplibraries(ESP。elisp本当にEmacsのサイトのための練習になります):彼らはEmacslandではあまり区別しない、私は怖いです。(しかし、いや、私はそれらを持って、それらを使用しないことはないです。)
ドリュー

@Drew 該当するメタディスカッションで説明します。この一般原則がここに当てはまらないと思われる場合は、メタでそれを上げてください。
ジル「SO-悪であるのをやめる」14

1
@Gilles:完了。はい、私はそれを読んで、それがおそらくあなたを動機づけたものであると考えました。私は多くの一般原則に同意しません。それは、それらを毛布状にたどることが常にTRTであることを意味しません。
ドリュー

2
この質問は、のためにユースケースを区別について、具体的であることから:私はドリューに同意autoloadし、require私はそれらのタグが正当化されると思います。実際、この質問に[のみ]のラベルを付けるlibrariesと、過度に一般化されます。私requireは「my-foobar-cfg」のロードをトリガーするために1回使用しますが、これは名前が示すように、ライブラリではなく自分の設定のみを含みます。
パプリカ14年

回答:


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を使用します。それ以外の場合はautoloadを使用します。私は個人的に起動時間を非常に大切にしています(実際には週に数回、時には1日に数回Emacsを再起動します)ので、必要なときにEmacsが特定の関数を自動ロードするのに少し時間がかかることを受け入れます。ですから、Emacsを起動した直後に利用可能にしたいものと、必要なときにロードできるものについて考えてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.