J'essaye de charger automatiquement tous les composants de ma vue à partir d'un dossier, qui fonctionne bien si je n'utilise pas vue " Composants Async ".
Une fois que j'essaye d'utiliser des Composants Async avec import .. J'obtiens cette erreur:
const ComponentContext = require.context('./', true, /\.vue$/i); ComponentContext.keys().forEach((componentFilePath) => { const componentName = componentFilePath.split('/').pop().split('.')[0]; Vue.component(componentName, () => import(componentFilePath)); });
Mon code qui charge tous les composants, qui génère cette erreur:
10:11-36 Critical dependency: the request of a dependency is an expression
Comment résoudre ce problème? ou y a-t-il un autre moyen d'accomplir cela?
3 Réponses :
Au lieu de
Vue.component(componentName, ComponentContext(componentFilePath).default);
Essayez
Vue.component(componentName, ComponentContext(componentFilePath));
Ou
Vue.component(componentName, () => import(componentFilePath));
pas sûr à propos de la partie par défaut.
Cela ne fait plus une importation asynchrone, ce qui est précisément ce que OP veut faire.
D'accord, j'avais besoin d'ajouter "paresseux" dans:
Vue.component(componentName, () => ComponentContext(componentFilePath));
puis:
const ComponentContext = require.context('./', true, /\.vue$/i, 'lazy');
Ok, ce n'est nulle part à trouver, passer des heures à chercher, doit être mentionné n'importe où dans la documentation. Test maintenant, merci.
J'ai dû fusionner la question avec une réponse ici pour obtenir cette solution finale:
require.context('~/components/common', true, /\.vue$/i, 'lazy')
Le troisième paramètre 'paresseux'
a été ajouté à require .context ()
, et () => import ()
a été changé en () => ComponentContext ()
.
I peut voir les bundles dans l'onglet Réseau du volet des outils de développement, et je ne vois pas les bundles lorsque je navigue vers une page qui ne rend aucun des composants chargés automatiquement.
Par conséquent, Je suis raisonnablement certain que le code ci-dessus est un chargement automatique et une importation dynamique. Je confirmerai également que dans mon projet, j'utilise:
const ComponentContext = require.context('./', true, /\.vue$/i, 'lazy'); ComponentContext.keys().forEach((componentFilePath) => { const componentName = componentFilePath.split('/').pop().split('.')[0]; Vue.component(componentName, () => ComponentContext(componentFilePath)); });
Notez où le mien est différent à ~ / components / common
par rapport à ./
. Les besoins de votre projet seront probablement différents. Dans le mien, le ~
est un alias Webpack pour / resources / js
, donc mon chemin complet serait ./resources/js/components/common
. Le reste du code ci-dessus est un algorithme et peut rester intact.