Ambos son posibles: puede incluir bibliotecas con <script>
(es decir, usar una biblioteca de un CDN) o incluirlas en el paquete generado.
Si lo carga a través de una <script>
etiqueta, puede usar la externals
opción para permitir escribir require(...)
en sus módulos.
Ejemplo con biblioteca de CDN:
<script src="https://code.jquery.com/jquery-git2.min.js"></script>
externals: { jquery: "jQuery" }
var $ = require("jquery");
Ejemplo con biblioteca incluida en el paquete:
copy `jquery-git2.min.js` to your local filesystem
resolve: { alias: { jquery: "/path/to/jquery-git2.min.js" } }
var $ = require("jquery");
El ProvidePlugin
puede asignar a los módulos de variables (gratis). Así se podría definir: "Cada vez que utilice la variable (gratis) xyz
dentro de un módulo (webpack) debe fijar xyz
a require("abc")
".
Ejemplo sin ProvidePlugin
:
var _ = require("underscore");
_.size(...);
Ejemplo con ProvidePlugin
:
plugins: [
new webpack.ProvidePlugin({
"_": "underscore"
})
]
_.size(...)
Resumen:
- Biblioteca de CDN: use
<script>
etiqueta y externals
opción
- Biblioteca del sistema de archivos: incluye la biblioteca en el paquete. (Tal vez modifique las
resolve
opciones para encontrar la biblioteca)
externals
: Hacer que las vars globales estén disponibles como módulo
ProvidePlugin
: Hacer que los módulos estén disponibles como variables libres dentro de los módulos
new
antes dewebpack.ProvidePlugin
webpack.github.io/docs/list-of-plugins.html{__esModule: true, default: MY_DEFAULT_EXPORT}
lugar deMY_DEFAULT_EXPORT
en los archivos.Algo interesante a tener en cuenta es que si usa el
ProvidePlugin
en combinación con laexternals
propiedad, le permitirá haberjQuery
pasado al cierre del módulo webpack sin tener que hacerlo explícitamenterequire
. Esto puede ser útil para refactorizar código heredado con una gran cantidad de referencias de archivos diferentes$
.//webpack.config.js module.exports = { entry: './index.js', output: { filename: '[name].js' }, externals: { jquery: 'jQuery' }, plugins: [ new webpack.ProvidePlugin({ $: 'jquery', }) ] };
ahora en index.js
console.log(typeof $ === 'function');
tendrá una salida compilada con algo como a continuación pasado al
webpackBootstrap
cierre:/******/ ([ /* 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; /***/ } /******/ ])
Por lo tanto, puede ver que
$
hace referencia a la ventana global /jQuery
de la CDN, pero se pasa al cierre. No estoy seguro de si se trata de una funcionalidad prevista o un truco afortunado, pero parece funcionar bien para mi caso de uso.fuente
require/import
utilizar.$
simplemente funcionaría porque alcanzará el alcance global sin importar qué. ElProviderPlugin
requiere analizar el AST así que es un plugin caro y se sumará a su tiempo de construcción notablemente. Entonces es básicamente un desperdicio.ProvidePlugin
devolvió un objeto como, amyModule.default
menos que agregue el módulo a los externos? Nunca supe que habría una relación directa.Sé que esta es una publicación antigua, pero pensé que sería útil mencionar que el cargador de scripts del paquete web también puede ser útil en este caso. De los documentos del paquete web:
"script: ejecuta un archivo JavaScript una vez en el contexto global (como en la etiqueta de script), los requisitos no se analizan".
http://webpack.github.io/docs/list-of-loaders.html
https://github.com/webpack/script-loader
He encontrado esto particularmente útil al migrar procesos de compilación más antiguos que combinan archivos de proveedores JS y archivos de aplicaciones. Una advertencia es que el cargador de scripts parece funcionar solo a través de la sobrecarga
require()
y no funciona hasta donde puedo decir al estar especificado en un archivo webpack.config. Aunque, muchos argumentan que la sobrecargarequire
es una mala práctica, puede ser bastante útil para combinar el proveedor y el script de la aplicación en un paquete y, al mismo tiempo, exponer JS Globals que no es necesario incluir en paquetes web adicionales. Por ejemplo:require('script!jquery-cookie/jquery.cookie'); require('script!history.js/scripts/bundled-uncompressed/html4+html5/jquery.history'); require('script!momentjs'); require('./scripts/main.js');
Esto haría que $ .cookie, History y moment estén disponibles globalmente dentro y fuera de este paquete, y agruparían estas librerías de proveedores con el script main.js y todos sus
require
archivos d.Además, es útil con esta técnica:
resolve: { extensions: ["", ".js"], modulesDirectories: ['node_modules', 'bower_components'] }, plugins: [ new webpack.ResolverPlugin( new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"]) ) ]
que está usando Bower, verá el
main
archivo en cadarequire
paquete de bibliotecas d.json. En el ejemplo anterior, History.js no tiene unmain
archivo especificado, por lo que la ruta al archivo es necesaria.fuente