C'est à la fois possible: vous pouvez inclure des bibliothèques avec un <script>
(c'est-à-dire utiliser une bibliothèque à partir d'un CDN) ou les inclure dans le bundle généré.
Si vous le chargez via <script>
tag, vous pouvez utiliser l' externals
option permettant d'écrire require(...)
dans vos modules.
Exemple avec bibliothèque de CDN:
<script src="https://code.jquery.com/jquery-git2.min.js"></script>
externals: { jquery: "jQuery" }
var $ = require("jquery");
Exemple avec bibliothèque incluse dans le bundle:
copy `jquery-git2.min.js` to your local filesystem
resolve: { alias: { jquery: "/path/to/jquery-git2.min.js" } }
var $ = require("jquery");
Le ProvidePlugin
peut mapper des modules à des variables (libres). Donc , vous pouvez définir: « Chaque fois que j'utiliser la variable (gratuit) à l' xyz
intérieur d' un module (webpack) devrait mettre xyz
à require("abc")
. »
Exemple sans ProvidePlugin
:
var _ = require("underscore");
_.size(...);
Exemple avec ProvidePlugin
:
plugins: [
new webpack.ProvidePlugin({
"_": "underscore"
})
]
_.size(...)
Sommaire:
- Bibliothèque à partir du CDN: utilisez la
<script>
balise et l' externals
option
- Bibliothèque à partir du système de fichiers: incluez la bibliothèque dans le bundle. (Peut-être modifier les
resolve
options pour trouver la bibliothèque)
externals
: Rendre les variables globales disponibles en tant que module
ProvidePlugin
: Rendre les modules disponibles en tant que variables libres à l'intérieur des modules
new
avantwebpack.ProvidePlugin
webpack.github.io/docs/list-of-plugins.html{__esModule: true, default: MY_DEFAULT_EXPORT}
au lieu deMY_DEFAULT_EXPORT
dans les fichiers.Il est intéressant de noter que si vous utilisez le
ProvidePlugin
en combinaison avec laexternals
propriété, cela vous permettra d'avoirjQuery
passé la fermeture de votre module Webpack sans avoir à le faire explicitementrequire
. Cela peut être utile pour refactoriser le code hérité avec un grand nombre de références de fichiers différents$
.//webpack.config.js module.exports = { entry: './index.js', output: { filename: '[name].js' }, externals: { jquery: 'jQuery' }, plugins: [ new webpack.ProvidePlugin({ $: 'jquery', }) ] };
maintenant dans index.js
console.log(typeof $ === 'function');
aura une sortie compilée avec quelque chose comme ci-dessous passé dans la
webpackBootstrap
fermeture:/******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function($) { console.log(typeof $ === 'function'); /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1))) /***/ }, /* 1 */ /***/ function(module, exports, __webpack_require__) { module.exports = jQuery; /***/ } /******/ ])
Par conséquent, vous pouvez voir que
$
fait référence à la fenêtre globale / àjQuery
partir du CDN, mais est passé dans la fermeture. Je ne sais pas si c'est une fonctionnalité prévue ou un hack chanceux, mais cela semble bien fonctionner pour mon cas d'utilisation.la source
require/import
.$
fonctionnerait simplement parce qu'il atteindra la portée mondiale quoi qu'il arrive. LeProviderPlugin
nécessite une analyse de l'AST, c'est donc un plugin coûteux et augmentera considérablement votre temps de construction. C'est donc fondamentalement un gaspillage.ProvidePlugin
renvoyé un objet comme, àmyModule.default
moins que j'aie ajouté le module aux externes? Je n'ai jamais su qu'il y aurait une relation directe.Je sais que c'est un ancien article, mais j'ai pensé qu'il serait utile de mentionner que le chargeur de script Webpack peut également être utile dans ce cas. À partir de la documentation Webpack:
"script: exécute un fichier JavaScript une fois dans un contexte global (comme dans la balise script), les exigences ne sont pas analysées."
http://webpack.github.io/docs/list-of-loaders.html
https://github.com/webpack/script-loader
J'ai trouvé cela particulièrement utile lors de la migration d'anciens processus de construction qui concatent les fichiers du fournisseur JS et les fichiers d'application ensemble. Un mot d'avertissement est que le chargeur de script ne semble fonctionner que par surcharge
require()
et ne fonctionne pas pour autant que je sache en étant spécifié dans un fichier webpack.config. Bien que beaucoup soutiennent que la surchargerequire
est une mauvaise pratique, elle peut être très utile pour concilier le script du fournisseur et de l'application dans un seul bundle, et en même temps exposer JS Globals qui n'ont pas besoin d'être transformés en bundles webpack supplémentaires. Par exemple:require('script!jquery-cookie/jquery.cookie'); require('script!history.js/scripts/bundled-uncompressed/html4+html5/jquery.history'); require('script!momentjs'); require('./scripts/main.js');
Cela rendrait $ .cookie, History et moment globalement disponibles à l'intérieur et à l'extérieur de ce bundle, et regrouperait ces bibliothèques du fournisseur avec le script main.js et tous ses
require
fichiers D.De plus, cette technique est utile:
resolve: { extensions: ["", ".js"], modulesDirectories: ['node_modules', 'bower_components'] }, plugins: [ new webpack.ResolverPlugin( new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"]) ) ]
qui utilise Bower, examinera le
main
fichier dans chaquerequire
d bibliothèques package.json. Dans l'exemple ci-dessus, History.js n'a pas demain
fichier spécifié, le chemin d'accès au fichier est donc nécessaire.la source