J'essaie de faire quelque chose qui, à mon avis, devrait être possible, mais je ne comprends vraiment pas comment le faire uniquement à partir de la documentation du Webpack.
J'écris une bibliothèque JavaScript avec plusieurs modules qui peuvent ou non dépendre les uns des autres. En plus de cela, jQuery est utilisé par tous les modules et certains d'entre eux peuvent avoir besoin de plugins jQuery. Cette bibliothèque sera ensuite utilisée sur plusieurs sites Web différents qui peuvent nécessiter certains ou tous les modules.
Définir les dépendances entre mes modules était très facile, mais définir leurs dépendances tierces semble être plus difficile que je ne le pensais.
Ce que je voudrais réaliser : pour chaque application, je souhaite avoir deux fichiers bundle, l'un avec les dépendances tierces nécessaires et l'autre avec les modules nécessaires de ma bibliothèque.
Exemple : imaginons que ma bibliothèque comporte les modules suivants:
- a (nécessite: jquery, jquery.plugin1)
- b (nécessite: jquery, a)
- c (nécessite: jquery, jquery.ui, a, b)
- d (nécessite: jquery, jquery.plugin2, a)
Et j'ai une application (voyez-la comme un fichier d'entrée unique) qui nécessite les modules a, b et c. Webpack dans ce cas doit générer les fichiers suivants:
- bundle fournisseur : avec jquery, jquery.plugin1 et jquery.ui;
- ensemble de sites Web : avec les modules a, b et c;
En fin de compte, je préférerais avoir jQuery en tant que global afin de ne pas avoir besoin de l'exiger sur chaque fichier (je pourrais l'exiger uniquement sur le fichier principal, par exemple). Et les plugins jQuery ne feraient qu'étendre le $ global au cas où ils seraient nécessaires (ce n'est pas un problème s'ils sont disponibles pour d'autres modules qui n'en ont pas besoin).
En supposant que cela soit possible, quel serait un exemple de fichier de configuration Webpack dans ce cas? J'ai essayé plusieurs combinaisons de chargeurs, d'externals et de plugins sur mon fichier de configuration, mais je ne comprends pas vraiment ce qu'ils font et lesquels dois-je utiliser. Je vous remercie!
la source
Réponses:
dans mon fichier webpack.config.js (Version 1,2,3), j'ai
dans mon tableau de plugins
Maintenant, j'ai un fichier qui n'ajoute que des bibliothèques tierces à un fichier selon les besoins.
Si vous souhaitez obtenir plus de précision lorsque vous séparez vos fournisseurs et vos fichiers de point d'entrée:
Notez que l'ordre des plugins compte beaucoup.
De plus, cela va changer dans la version 4. Quand c'est officiel, je mets à jour cette réponse.
Mise à jour: changement de recherche d'indexOf pour les utilisateurs de Windows
la source
isExternal
enminChunks
fait ma journée. Comment cela n'est-il pas documenté? Il y a des inconvénients?options.minChunks (number|Infinity|function(module, count) -> boolean):
je ne vois pas encore d'inconvénient.module.userRequest
(et le chargeur est probablement dansnode_modules
). Mon code pourisExternal()
:return typeof module.userRequest === 'string' && !!module.userRequest.split('!').pop().match(/(node_modules|bower_components|libraries)/);
Je ne sais pas si je comprends parfaitement votre problème, mais comme j'ai eu un problème similaire récemment, je vais essayer de vous aider.
Bundle fournisseur.
Vous devriez utiliser CommonsChunkPlugin pour cela. dans la configuration, vous spécifiez le nom du bloc (par exemple
vendor
) et le nom du fichier qui sera généré (vendor.js
).Maintenant, partie importante, vous devez maintenant spécifier ce que cela signifie
vendor
bibliothèque et vous le faites dans une section d'entrée. Un élément de plus dans la liste d'entrée avec le même nom que le nom du bloc nouvellement déclaré (c'est-à-dire «vendeur» dans ce cas). La valeur de cette entrée doit être la liste de tous les modules que vous souhaitez passer àvendor
regrouper. dans votre cas, cela devrait ressembler à quelque chose comme:JQuery comme global
J'ai eu le même problème et l'a résolu avec providePlugin . ici, vous ne définissez pas un objet global mais une sorte de raccourcis vers les modules. c'est à dire que vous pouvez le configurer comme ça:
Et maintenant, vous pouvez simplement utiliser
$
n'importe où dans votre code - webpack le convertira automatiquement enJ'espère que cela a aidé. vous pouvez également consulter mon fichier de configuration webpack qui est ici
J'adore webpack, mais je suis d'accord que la documentation n'est pas la plus belle du monde ... mais bon ... les gens disaient la même chose à propos de la documentation Angular au début :)
Éditer:
Pour avoir des segments de fournisseur spécifiques aux points d'entrée, utilisez simplement CommonsChunkPlugins plusieurs fois:
puis déclarez différentes bibliothèques extenrales pour différents fichiers:
Si certaines bibliothèques se chevauchent (et pour la plupart d'entre elles) entre les points d'entrée, vous pouvez les extraire dans un fichier commun en utilisant le même plugin avec une configuration différente. Voyez cet exemple.
la source
Si vous souhaitez regrouper automatiquement vos scripts séparément de ceux des fournisseurs:
Vous pouvez en savoir plus sur cette fonctionnalité dans la documentation officielle .
la source
vendor : Object.keys(pkg.dependencies)
cela ne fonctionne pas toujours et dépend de la façon dont le package est construit.package.json
réglé. Cette solution de contournement fonctionne dans la plupart des cas, mais il existe des exceptions où vous devrez emprunter un chemin différent. Il pourrait être intéressant de publier votre propre réponse à la question pour aider la communauté.Object.keys(pkg.dependencies)
ils regrouperont tout !!!! disons que vous avez un tas de chargeurs listés là-bas ... ouais qui seront inclus !!! alors faites attention ... séparez soigneusement ce qui est devDependency et ce qu'est la dépendancedependencies
?Je ne sais pas non plus si je comprends parfaitement votre cas, mais voici un extrait de configuration pour créer des blocs de fournisseur distincts pour chacun de vos ensembles:
Et lien vers la
CommonsChunkPlugin
documentation: http://webpack.github.io/docs/list-of-plugins.html#commonschunkpluginla source
react
ne doit être présent dans le bundle du fournisseur que s'il est explicitement requis par bundle1 et bundl2. Je ne devrais pas avoir à le spécifier sur le fichier de configuration ... Cela a-t-il un sens? Des idées?