Question confusion sur autoload_paths vs eager_load_paths dans les rails 4


Je lis un post sur les rails load_paths, voici le lien.

Mais, je suis toujours confus au sujet de la différence entre le autoload_paths et eager_load_paths:

Je les ai testés dans un projet Rails 4 nouvellement créé. Il semble qu'ils fonctionnent de la même manière, cela se recharge automatiquement en mode développement mais en mode production.


37
2017-11-04 17:18


origine


Réponses:


Auteur de l'article lié ici. Voici une tentative pour dissiper la confusion, allant de la réponse de @fkreusch.

En Ruby, vous devez exiger chaque .rb fichier afin de faire exécuter son code. Cependant, notez que dans Rails, vous n’avez jamais besoin de vos modèles, contrôleurs ou autres fichiers de manière spécifique. app/ dir. Pourquoi donc? C'est parce que dans Rails app/* est dans autoload_paths. Cela signifie que lorsque vous exécutez votre application rails en développement (par exemple via rails console) - aucun des modèles et des contrôleurs n’est requis par ruby ​​pour le moment. Rails utilise une fonction magique spéciale de ruby ​​pour attendre que le code mentionne une constante, par exemple Book, et seulement alors il courrait require 'book' qu'il trouve dans l'un des autoload_paths. Cela vous permet de démarrer plus rapidement la console et le serveur en développement, car rien n'est requis lorsque vous le démarrez, uniquement lorsque le code en a réellement besoin.

Maintenant, ce comportement est bon pour le développement local, mais qu'en est-il de la production? Imaginez qu'en production, votre serveur effectue le même type de chargement constant magique (chargement automatique). Ce n'est pas vraiment la fin du monde, vous démarrez votre serveur en production, et les gens commencent à parcourir vos pages légèrement plus lentement, car certains fichiers devront être chargés automatiquement. Oui, il est plus lent pour ces quelques demandes initiales, alors que le serveur "chauffe", mais ce n'est pas si grave. Sauf que ce n'est pas la fin de l'histoire.

Si vous utilisez ruby ​​1.9.x (si je me souviens bien), les fichiers nécessitant automatiquement cette fonctionnalité ne sont pas sécurisés pour les threads. Donc, si vous utilisez un serveur comme puma, vous rencontrerez des problèmes. Même si vous n'utilisez pas un serveur multithread, il est probablement préférable que toute votre application soit requise "de manière proactive" au démarrage. Cela signifie que dans la production, vous voulez que tous les modèles, tous les contrôleurs, etc., soient tous nécessaires lorsque vous démarrez votre application, et le temps de démarrage ne vous dérange pas. Ceci s'appelle le chargement impatient. Tous les fichiers ruby ​​sont chargés avec impatience, obtenez-les? Mais comment pouvez-vous faire cela si votre application rails n’a pas un seul require déclaration? C'est là que eager_load_paths entrez. Quoi que vous y mettiez, tous les fichiers dans tous les répertoires sous ces chemins seront nécessaires au démarrage de la production. J'espère que cela éclaircit.

Il est important de noter que eager_load_paths ne sont pas actifs dans l'environnement de développement, donc tout ce que vous y insérez ne sera pas requis immédiatement dans le développement, uniquement en production.

Il est également important de noter que simplement mettre quelque chose dans autoload_paths ne le rendra pas chargé dans la production. Malheureusement. Vous devez explicitement le mettre dans eager_load_pathsainsi que.

Un autre aspect intéressant est que, dans chaque application de rail, tous les répertoires sous app/ sont automatiquement dans les deux autoload_paths et eager_load_paths, ce qui signifie que l'ajout d'un répertoire ne nécessite aucune autre action.


113
2017-11-08 06:24



Fondamentalement, autoload_paths sont les chemins que Rails utilisera pour essayer de charger vos classes automatiquement. Par exemple. quand vous appelez Book, si cette classe n'est pas encore chargée, elle passera par le autoload_paths et le chercher dans ces chemins.

En production, il peut être préférable de charger ces derniers pour éviter les problèmes de chargement automatique simultanés. Pour cela, il fournit la eager_load_paths. Les chemins de cette liste seront requis au démarrage de votre application.


6
2017-11-04 17:43