Текстовый плагин RequireJS: невозможно загрузить HTML из другого домена
Я хотел бы получить html из другого домена с помощью require.js. Я знаю, что политика CORS не позволяет это легко. Примечание: я настроил веб-сервер (с Access-Control-Allow-Origin "*" и другими директивами) и require.js настолько, что все файлы JS и CSS (css с плагином require-css) загружаются из другого домена как и следовало ожидать - только получение HTML делает проблемы. Но в сетевом протоколе браузера я вижу, что HTML-контент даже загружается. Однако этот контент не передается в функцию require! Браузер получает контент, но require.js не предоставляет его в качестве параметра...
Моя конфигурация:
requirejs.config({
baseUrl: "http://some.other.domain/",
paths: {
jquery: 'ext/jquery/jquery.min',
htmlTemplate: 'test.html?',
siteCss: '../css/site'
},
shim: {
htmlTemplate: [
'css!siteCss'
]
},
config: {
text: {
useXhr: function (url, protocol, hostname, port) {
return true;
}
}
},
map: {
'*': {
text: 'ext/require/text',
css: 'ext/require/css.min'
}
}
});
require(['text!htmlTemplate'], function (htmlTemplate) {
console.log(htmlTemplate); // prints 'undefined' into the console
});
Два примечания: useXhr
Конфигурация взята из текстового плагина require.js, который добавляет ".js" к имени файла, но не имеет значения, существует он или нет. Я добавил ?
путь к htmlTemplate. С этим .js
не добавляется к URL-адресу, и браузер загружает html-контент - как было сказано ранее, к сожалению, без этого require.js передает его параметру htmlTemplate
,
Что я могу сделать? Я читал, что если я использую оптимизатор require.js, сгенерированный файл больше не будет иметь этой проблемы (однако это работает...). Но мне нужно разрабатывать JS без оптимизации при каждом редактировании.
Обновление: найдено одно решение, но я был бы рад, если бы кто-нибудь смог предоставить "правильное" решение.
3 ответа
Я нашел актуальную проблему! Эта часть:
config: {
text: {
useXhr: function (url, protocol, hostname, port) {
return true;
}
}
},
должен действительно сделать это. Однако я узнал, что это не было вызвано вообще. Вместо этого была вызвана реализация по умолчанию. И это вернуло ложь.
Чтобы это работало, необходимо иметь правильные ключи в разделе конфигурации, поскольку сопоставление, по-видимому, не оценивается для него.
Так что это правильная конфигурация, которая извлекает HTML из другого домена:
requirejs.config({
baseUrl: "http://some.other.domain/",
paths: {
jquery: 'ext/jquery/jquery.min',
htmlTemplate: 'test.html', // // ---> removed the '?'
siteCss: '../css/site'
},
shim: {
htmlTemplate: [
'css!siteCss'
]
},
config: {
'ext/require/text': { // ---> full path is required!!!
useXhr: function (url, protocol, hostname, port) {
return true;
}
}
},
map: {
'*': {
text: 'ext/require/text',
css: 'ext/require/css.min'
}
}
});
require(['text!htmlTemplate'], function (htmlTemplate) {
console.log(htmlTemplate); // now prints HTML into the console!!!
});
Аллилуйя!
Нашел правильную подсказку здесь. Другим вариантом может быть установка пути для текста. По крайней мере, конфигурация должна быть настроена так, чтобы функция вызывалась...
Я получаю Нет заголовка "Access-Control-Allow-Origin" на запрошенном ресурсе. после добавления кода
config: {
'ext/re`enter code here`quire/text': { required!!!
useXhr: function (url, protocol, hostname, port) {
return true;
}
}
},
Я думаю, что нашел решение. Документ requirejs / text:
Поэтому, если текстовый плагин определяет, что запрос ресурса находится в другом домене, он попытается получить доступ к версии ресурса ".js" с помощью тега script. Скрипт тега GET-запросы разрешены для разных доменов. Версия ресурса.js должна быть просто скриптом с вызовом define(), который возвращает строку для значения модуля.
Из-за этого я изменил конфигурацию на эту, поэтому текст больше не используется:
requirejs.config({
baseUrl: "http://some.other.domain/",
paths: {
jquery: 'ext/jquery/jquery.min',
htmlTemplate: 'test.html', // removed the '?'
siteCss: '../css/site'
},
shim: {
htmlTemplate: [
'css!siteCss'
]
},
map: {
'*': {
// removed the text plugin
css: 'ext/require/css.min'
}
}
// removed the useXhr configuration for the text plugin
});
require(['htmlTemplate'], function (htmlTemplate) {
console.log(htmlTemplate); // prints '<div>Here I am!</div>' into the console
});
Сейчас http://some.other.domain/test.html.js
загружается. Содержимое test.html:
define(function () {
return '<div>Here I am!</div>';
});
Поэтому я окружил HTML немного JS - для меня это не проблема. И сейчас htmlTemplate
устанавливается на ожидаемую строку. Это больше не чистый HTML, но так как это фиксированный шаблон (т.е. не сгенерированный), он может быть приемлемым.