无法访问 includeScript 函数包含的外部 JS 库

External JS lib included by includeScript function is not accessible

我尝试测试 includeScript 函数以在加载 UI5 页面后加载外部 js 库。它适用于所有情况,这意味着在加载脚本后,它就可以访问了。但是,如果有 ChartContainer 控件,则无法访问加载的 JS 库。


var includeScript = sap.ui.require("sap/ui/dom/includeScript");
try {
  dateFns.isToday(new Date());
} catch (err) {
  new Promise(function(fnResolve, fnReject) {
    includeScript(
          "https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min.js", 
          "datefns_js", fnResolve, fnReject);
 }).then(function() {
     console.log("datefns_js is loaded!!!")
     console.log(dateFns.isToday(new Date()));
 });
}
<script src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js"></script>

加载 dateFns 后,执行下一条命令:

dateFns.isToday(new Date());

在控制台中 returns 为真,因为 dateFns js 已加载并可访问。

我希望我的 UI.

中的任何控件都可以访问加载的外部 js 库

来自SAPUI5 documentation

Modules that use Unified Module Definition (UMD) syntax, can be loaded, but only when no AMD loader is present or when they expose their export also to the global namespace, even when an AMD loader is present

不幸的是,SAPUI5 图表使用另一个 AMD 加载程序 (RequireJS),因此您的模块 date-fns 将使用 RequireJS 加载并且不可用于全局 window 对象。

要解决此问题,您可以强制模块始终通过 RequireJS 加载,然后通过 require 方法可用:

<script src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js"></script>

<script>
var declareLibs = new Promise(function (resolve, reject) {
    sap.ui.require(["sap/ui/thirdparty/require"], function () {
        requirejs.config({
            paths: {
                "date_fns": ["//cdnjs.cloudflare.com/ajax/libs/date-fns/1.30.1/date_fns.min"]
            }
        });

        resolve();
    });
});

declareLibs.then(require(["date_fns"], function (dateFns) {
    console.log("datefns_js is loaded!")
    console.log(dateFns.isToday(new Date()));
}));
</script>