SapUI5: Добавляем сторонний скрипт с удаленного источника
Мы уже разбирали как добавить к себе в приложение стороннюю JS библиотеку moment.js. Но там мы грузили JS файл локально. Что делать, если надо добавить библиотеку не со своего, а стороннего сервера?
Если версия SapUI5 меньше 1.58.
Добавим CSS
Подгрузим CSS со стороннего сервера:
jQuery.sap.includeStyleSheet("//nickcode.ru/css/style.css"); |
где nickcode.ru/css/style.css — путь до CSS файла на стороннем сервере.
Загрузим JS
Можно воспользоваться аналогичным методом для JS файлов:
jQuery.sap.includeScript({ url: "//nickcode.ru/js/script.js", id: "scriptId" }).then(function() { console.log("Script has been loaded!") }) |
где nickcode.ru/js/script.js — путь до JS файла на стороннем сервере.
Может возникнуть задача передать какие-либо параметры JS скрипту.
Например, вызов скрипта должен выглядеть следующим образом:
<script data-host="http://nickcode.ru" data-id="1234567890" data-style="default" src="//nickcode.ru/js/script.js" id="scriptId"></script> |
Помимо id и пути до JS файла надо предать еще параметры: data-host, data-id, data-style. К сожалению, метод includeScript не поддерживает дополнительных параметров.
Для решения этой задачи погрузимся в исходный код метода includeScript:
var oScript = window.document.createElement("script"); oScript.src = sUrl; oScript.type = "text/javascript"; if (sId) { oScript.id = sId; } |
Чуть преобразуем код для нашего случая, в итоге вызов удаленного JS скрипта с параметрами будет выглядеть следующим образом:
var head = window.document.getElementsByTagName("head")[0]; var oScript = window.document.createElement("script"); oScript.src = "//nickcode.ru/js/script.js"; oScript.type = "text/javascript"; oScript.id = "scriptId"; oScript.setAttribute("data-host", "http://nickcode.ru"); oScript.setAttribute("data-id", "1234567890"); oScript.setAttribute("data-style", "default"); //Добавим в head if (head){ head.appendChild(oScript); } |
Если версия SapUI5 больше 1.58.
Если мы зайдем в документацию по jQuery.sap.includeScript —
https://openui5.hana.ondemand.com/api/jQuery.sap#methods/jQuery.sap.includeScript, то узнаем, что метод уже устарел. Рекомендуют использовать sap/ui/dom/includeScript.
Посмотрим в исходный код нового метода и увидим, что поддержка параметров уже реализована в sap/ui/dom/includeScript:
* @param {object} [vUrl.attributes] map of attributes that should be used for the script tag |
Воспользуемся этим и переделаем подгрузку CSS и JS следующим образом:
sap.ui.define([ "sap/ui/core/Component", "sap/ui/dom/includeScript", "sap/ui/dom/includeStylesheet" ], function(Component, includeScript, includeStylesheet) { return Component.extend("nickcode.Component", { metadata: { "manifest": "json" }, init: function() { //Загрузим CSS includeStylesheet("//nickcode.ru/css/style.css"); //Подготовим объект для JS var oScript = {}; oScript.url = "//nickcode.ru/js/script.js"; oScript.attributes = {}; oScript.attributes["data-host"] = "http://nickcode.ru"; oScript.attributes["data-id"] = "1234567890"; oScript.attributes["data-style"] = "default"; //Загрузим JS includeScript(oScript, "scriptId").then(function(){ console.log("Script has been loaded!"); }); } }); }); |
Ну как Вам, не правда ли так более красиво выглядит загрузка JS библиотек с внешних серверов? 🙂
А теперь самое интересное! В конце заметки посмотрим на еще один интересный метод, при помощи которого можно подгрузить стороннюю JS библиотеку в свой SapUI5 проект.
Специально для подгрузки JS библиотек существует другая библиотека под названием RequireJS.
И о чудо, она по умолчанию используется в SapUI5.
Давайте при помощи RequireJS загрузим библиотеку для работы с датами date-fns.org с cdnjs.
Для этого я накидал небольшой примерчик, который вы можете импортировать в свой WebIDE отсюда https://github.com/kannade/sapui5_external_js.
Посмотрим как это можно сделать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /* global requirejs:true */ sap.ui.define([ "sap/ui/core/mvc/Controller", "sap/ui/thirdparty/require"], function (Controller) { "use strict"; return Controller.extend("nickcode_ru_external_js.controller.View1", { onInit: function () { var oLabel = this.getView().byId("labelId"); var oPromise = new Promise(function (resolve, reject) { requirejs.config({ paths: { "date_fns": ["//cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min.js"] } }); resolve(); }); oPromise.then(require(["date_fns"], function (oDateFns) { oLabel.setText(oDateFns.parse("03.06.2020", "dd.MM.yyyy", new Date())); })); } }); }); |
- 5 — Подгрузили саму RequireJS!
- 14 — Затем подгрузим библиотеку date-fns с серверов cloudflare! (16)
- 24 — А затем в Label преобразуем при помощи date-fns строку с датой в объект типа Date, для демонстрации возможностей date-fns!
На этом, пожалуй, все. Уверен, что существуют еще и другие методы, при помощи которых можно подгрузить JS библиотеку в свой проект. Жду их от вас в комментариях :).