Devextreme 作为共享点框架的外部库

Devextreme as external library for sharepoint framework

我在我的 spfx 解决方案中使用了一个非常大的库,我不仅希望在此应用程序中的 Web 部件之间共享它,而且希望在可能使用此库的任何其他 Web 部件之间共享它。

我所知道的

我遇到的问题

我正在尝试使用 DevExtreme 和 devextreme-react 库。这个库非常大,所以我想在 web 部件请求它时从 cdn 包含一次,并继续对每个额外的 web 部件实例使用相同的脚本。问题是库中包含类型。它位于子文件夹 bundles/dx.all.d.ts 中,而不是在其自己的包中。它还具有多个文件,您可以包含而不是包含整个库。此外,devextreme-react 依赖于 devextreme 库,因此它还包括来自 devextreme 的文件。

项目要么没有加载外部库,因为我没有包含它们,要么编译失败,因为我没有正确导入它..?也许?

我的问题是如何排除该库、将其添加到外部配置、使用类型将其导入我的项目文件并仍然编译我的项目?

所以我找到了一个潜在的解决方案,当然唯一的问题是我必须停止使用 devextreme-react 并只使用普通 jquery.

基本上如果我把这个放在配置中:

"jquery": {
  "path": "https://code.jquery.com/jquery-2.1.1.min.js",
  "globalName": "jQuery"
},
"devextreme/bundles/dx.all": {
  "path": "https://cdn3.devexpress.com/jslib/18.1.6/js/dx.all.js",
  "globalName": "DevExpress",
  "globalDependencies": ["jquery"]
}

然后在任何需要 devextreme 组件的地方,我都必须创建一个包装器并像这样导入 devextreme:

import * as React from 'react';
import * as $ from 'jquery';
import DevExpress from 'devextreme/bundles/dx.all'; DevExpress;

export default class DxButton extends React.Component<DevExpress.ui.dxButtonOptions> {
    private el: HTMLElement;
    private $el: JQuery<HTMLElement>;
    public constructor(props: DevExpress.ui.dxButtonOptions) {
        super(props);
    }
    public componentDidMount() {
        this.$el = $(this.el);
        (this.$el as any).dxButton({
            ...this.props as any
        } as DevExpress.ui.dxButtonOptions);
    }

    public componentWillUnmount() {
        (this.$el as any).dxButton('dispose');
        this.$el.remove();
    }

    public render(): React.ReactElement<DevExpress.ui.dxButtonOptions> {
        return <div ref={el => this.el = el} />;
    }
}

我不能使用 devextreme-react 的原因是因为它使用了 devextreme 的模块并强制捆绑包。

这不是理想的解决方案,但最终似乎是唯一可行的方法。