Загрузчик Webpack, эквивалентный загрузке плагина requirejs с XMLHttpRequest
У меня есть пара плагинов requirejs, которые я хотел бы заменить на загрузчик веб-пакетов.
define('firstLoader', {
load: function (name, parentRequire, onload, config) {
var xhr = new XMLHttpRequest();
xhr.addEventListener('load', function () {onload(this.responseText);});
xhr.addEventListener('error', onload.error);
xhr.addEventListener('abort', onload.error);
var url = '...' + name;
xhr.open('GET', url);
xhr.send()
}
})
define('jsonLoader', {
load: function (name, parentRequire, onload, config) {
//This is the nasty part.
req(['firstLoader!' + name], function (text) {
try {
onload(JSON.parse(text));
}
catch (err) {
onload.error(err);
}
})
}
});
Самыми большими проблемами являются отсутствие обещаний на асинхронный запрос и динамическое требование. Есть ли способ обойти это без транспиляции (с помощью `System.load) или дополнительных библиотек (bluebird и т. Д.)?
редактировать
Итак, я решил воспользоваться этим, и теперь я получаю сообщение об ошибке
Module not found: Error: Can't resolve 'future/url'
когда я иду в require('jsonLoader!future/url'
). Разрешает ли веб-пакет загрузчикам работать во время выполнения? Вот обновленный код.
firstPlugin.js
module.exports = function loadAsync (content, callback) {
var host = document.location.host
var url = host + '...' + name
xhr.addEventListener("load", function () {callback(null, this.responseText)})
xhr.open("GET", url)
xhr.send()
}
}
jsonPlugin.js
module.exports = function (content, callback) {
require('firstPlugin!' + content, function (result) {
callback(null, JSON.parse(result))
})
}
1 ответ
Require и Webpack - это просто принципиально разные шаблоны. Они оба относятся к "модулям" и "загрузке", но в остальном...
В общем, Webpack - это инструмент компиляции / сборки. Так что нет, его загрузчики не могут работать во время выполнения. Тем не менее, Webpack может создавать несколько пакетов во время сборки, которые вы можете вызывать / загружать отдельно во время выполнения. В зависимости от того, как вы хотите вызывать эти дополнительные пакеты (из модуля или с определенной "страницы"), концепции Webpack, которые вас интересуют, - это разделение кода и точки входа.