Возможно и то, и другое: вы можете включить библиотеки с помощью <script>
(т.е. использовать библиотеку из CDN) или включить их в сгенерированный пакет.
Если вы загружаете его через <script>
тег, вы можете использовать externals
опцию, позволяющую писать require(...)
в ваших модулях.
Пример с библиотекой из CDN:
<script src="https://code.jquery.com/jquery-git2.min.js"></script>
externals: { jquery: "jQuery" }
var $ = require("jquery");
Пример с библиотекой, входящей в комплект:
copy `jquery-git2.min.js` to your local filesystem
resolve: { alias: { jquery: "/path/to/jquery-git2.min.js" } }
var $ = require("jquery");
Модуль ProvidePlugin
может отображать модули в (бесплатные) переменные. Таким образом , вы можете определить: «Каждый раз , когда я использую (бесплатно) переменный xyz
внутри модуля вы (WebPack) следует установить xyz
в require("abc")
.»
Пример без ProvidePlugin
:
var _ = require("underscore");
_.size(...);
Пример с ProvidePlugin
:
plugins: [
new webpack.ProvidePlugin({
"_": "underscore"
})
]
_.size(...)
Резюме:
- Библиотека из CDN: используйте
<script>
тег и externals
параметр
- Библиотека из файловой системы: Включите библиотеку в комплект. (Возможно, измените
resolve
параметры, чтобы найти библиотеку)
externals
: Сделать глобальные вары доступными как модуль
ProvidePlugin
: Сделать модули доступными как свободные переменные внутри модулей
new
передwebpack.ProvidePlugin
webpack.github.io/docs/list-of-plugins.html{__esModule: true, default: MY_DEFAULT_EXPORT}
вместоMY_DEFAULT_EXPORT
файлов.Стоит отметить, что если вы используете свойство
ProvidePlugin
в сочетании соexternals
свойством, это позволит вам перейтиjQuery
в закрытие модуля webpack без необходимости явно указыватьrequire
это. Это может быть полезно для рефакторинга устаревшего кода со ссылками на множество различных файлов$
.//webpack.config.js module.exports = { entry: './index.js', output: { filename: '[name].js' }, externals: { jquery: 'jQuery' }, plugins: [ new webpack.ProvidePlugin({ $: 'jquery', }) ] };
теперь в index.js
console.log(typeof $ === 'function');
будет скомпилированный вывод с чем-то вроде ниже, переданным в
webpackBootstrap
закрытие:/******/ ([ /* 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; /***/ } /******/ ])
Следовательно, вы можете видеть, что
$
ссылка на global / windowjQuery
из CDN, но передается в закрытие. Я не уверен, предназначена ли это функциональность или удачный взлом, но, похоже, он хорошо работает для моего варианта использования.источник
require/import
его.$
просто будет работать, потому что он достигнет глобального масштаба, несмотря ни на что.ProviderPlugin
Требует разбора AST , так это дорогой плагин и добавить в свое время сборки заметно. Так что это в основном пустая трата.ProvidePlugin
вернули такой объект,myModule.default
если я не добавил модуль во внешние? Я никогда не знал, что будут прямые отношения.Я знаю, что это старый пост, но подумал, что было бы полезно упомянуть, что загрузчик скриптов webpack может быть полезен и в этом случае. Из документов webpack:
«скрипт: однократно выполняет файл JavaScript в глобальном контексте (например, в теге скрипта), требует не анализировать».
http://webpack.github.io/docs/list-of-loaders.html
https://github.com/webpack/script-loader
Я нашел это особенно полезным при миграции старых процессов сборки, которые объединяют файлы поставщиков JS и файлы приложений. Предупреждение: похоже, что загрузчик скриптов работает только через перегрузку
require()
и не работает, насколько я могу судить, указав его в файле webpack.config. Хотя многие утверждают, что перегрузкаrequire
- плохая практика, она может быть весьма полезной для объединения скрипта поставщика и приложения в один пакет и в то же время раскрытия глобальных объектов JS, которые не нужно включать в дополнительные пакеты веб-пакетов. Например:require('script!jquery-cookie/jquery.cookie'); require('script!history.js/scripts/bundled-uncompressed/html4+html5/jquery.history'); require('script!momentjs'); require('./scripts/main.js');
Это сделает $ .cookie, History и moment глобально доступными внутри и вне этого пакета и объединит эти библиотеки поставщиков со скриптом main.js и всеми его
require
d-файлами.Кроме того, с помощью этой техники полезно:
resolve: { extensions: ["", ".js"], modulesDirectories: ['node_modules', 'bower_components'] }, plugins: [ new webpack.ResolverPlugin( new webpack.ResolverPlugin.DirectoryDescriptionFilePlugin("bower.json", ["main"]) ) ]
который использует Bower, будет просматривать
main
файл в каждойrequire
библиотеке d package.json. В приведенном выше примере для History.js неmain
указан файл, поэтому путь к файлу необходим.источник