Jest to możliwe: możesz dołączyć biblioteki za pomocą <script>
(tj. Użyć biblioteki z CDN) lub dołączyć je do wygenerowanego pakietu.
Jeśli załadujesz go za pomocą <script>
tagu, możesz użyć externals
opcji, aby zezwolić na zapis require(...)
w swoich modułach.
Przykład z biblioteką z CDN:
<script src="https://code.jquery.com/jquery-git2.min.js"></script>
externals: { jquery: "jQuery" }
var $ = require("jquery");
Przykład z biblioteką zawartą w pakiecie:
copy `jquery-git2.min.js` to your local filesystem
resolve: { alias: { jquery: "/path/to/jquery-git2.min.js" } }
var $ = require("jquery");
ProvidePlugin
Może odwzorowywać moduły do (wolnych) zmiennych. Tak można określić: „Za każdym razem używam (bezpłatny) zmienną xyz
wewnątrz modułu, który (WebPack) należy ustawić xyz
na require("abc")
”.
Przykład bez ProvidePlugin
:
var _ = require("underscore");
_.size(...);
Przykład z ProvidePlugin
:
plugins: [
new webpack.ProvidePlugin({
"_": "underscore"
})
]
_.size(...)
Podsumowanie:
- Biblioteka z CDN: użyj
<script>
tagu i externals
opcji
- Biblioteka z systemu plików: dołącz bibliotekę do pakietu. (Może zmodyfikuj
resolve
opcje, aby znaleźć bibliotekę)
externals
: Udostępnij zmienne globalne jako moduł
ProvidePlugin
: Udostępnij moduły jako wolne zmienne wewnątrz modułów
new
przedwebpack.ProvidePlugin
webpack.github.io/docs/list-of-plugins.html{__esModule: true, default: MY_DEFAULT_EXPORT}
zamiastMY_DEFAULT_EXPORT
w plikach.Warto zauważyć, że jeśli użyjesz atrybutu
ProvidePlugin
w połączeniu zexternals
właściwością, pozwoli ci tojQuery
przejść do zamknięcia modułu webpacka bez konieczności jawnegorequire
tego. Może to być przydatne do refaktoryzacji starszego kodu z odwołaniami do wielu różnych plików$
.//webpack.config.js module.exports = { entry: './index.js', output: { filename: '[name].js' }, externals: { jquery: 'jQuery' }, plugins: [ new webpack.ProvidePlugin({ $: 'jquery', }) ] };
teraz w index.js
console.log(typeof $ === 'function');
będzie miał skompilowane wyjście z czymś takim jak poniżej przekazanym do
webpackBootstrap
zamknięcia:/******/ ([ /* 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; /***/ } /******/ ])
Dlatego widzisz, że
$
odwołuje się do global / windowjQuery
z CDN, ale jest przekazywany do zamknięcia. Nie jestem pewien, czy jest to zamierzona funkcjonalność, czy szczęśliwy hack, ale wydaje się, że działa dobrze w moim przypadku użycia.źródło
require/import
.$
zadziała, ponieważ bez względu na wszystko osiągnie zasięg globalny.ProviderPlugin
Wymaga analizowania AST więc jest to drogie wtyczki i doda do czasu kompilacji zauważalnie. Więc to w zasadzie marnotrawstwo.ProvidePlugin
zwrócił obiekt taki jak,myModule.default
chyba że dodałem moduł do zewnętrznych? Nigdy nie wiedziałem, że będzie jakikolwiek bezpośredni związek.Wiem, że to stary post, ale pomyślałem, że warto wspomnieć, że moduł ładujący skrypt pakietu webpack może być przydatny również w tym przypadku. Z dokumentów pakietu internetowego:
„script: jednorazowo wykonuje plik JavaScript w kontekście globalnym (np. w tagu skryptu), wymagania nie są analizowane”.
http://webpack.github.io/docs/list-of-loaders.html
https://github.com/webpack/script-loader
Zauważyłem, że jest to szczególnie przydatne podczas migracji starszych procesów kompilacji, które łączą ze sobą pliki dostawców JS i pliki aplikacji. Ostrzeżenie jest takie, że moduł ładujący skrypt wydaje się działać tylko przez przeciążenie
require()
i nie działa tak daleko, jak mogę to stwierdzić, ponieważ jest określony w pliku webpack.config. Chociaż wielu twierdzi, że przeciążanierequire
jest złą praktyką, może być całkiem przydatne do łączenia skryptu dostawcy i aplikacji w jednym pakiecie, a jednocześnie ujawniania JS Globals, których nie trzeba umieszczać w dodatkowych pakietach webpack. Na przykład:require('script!jquery-cookie/jquery.cookie'); require('script!history.js/scripts/bundled-uncompressed/html4+html5/jquery.history'); require('script!momentjs'); require('./scripts/main.js');
Spowodowałoby to, że $ .cookie, historia i moment byłyby globalnie dostępne w tym pakiecie i poza nim oraz wiązałyby te biblioteki dostawców ze skryptem main.js i wszystkimi jego
require
plikami d.Przydatne w tej technice jest również:
resolve: { extensions: ["", ".js"], modulesDirectories: ['node_modules', 'bower_components'] }, plugins: [ new webpack.ResolverPlugin( new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"]) ) ]
który używa Bower, przejrzy
main
plik w każdej zrequire
bibliotek pakiet.json. W powyższym przykładzie History.js nie mamain
określonego pliku, więc ścieżka do pliku jest niezbędna.źródło