Devextreme как внешняя библиотека для фреймворка sharepoint
Я использую очень большую библиотеку в своем решении spfx, и я хотел бы не только поделиться ею с веб-частями в этом приложении, но и с другими веб-частями, которые могут использовать эту библиотеку.
Что я знаю
- Я знаю, что вы можете включить внешние библиотеки, такие как jquery, и некоторые библиотеки, которые имеют типизацию отдельно от их пакета npm.
- Я знаю, что даже если я добавлю ссылку на внешнюю библиотеку в разделе externals, она на самом деле не будет разрушать библиотеку, если я не импортирую ее где-нибудь в своем коде.
- Я понимаю текущие примеры в документации. Мне удалось успешно использовать момент-часовой пояс, и это здорово.
У меня проблема
Я пытаюсь использовать библиотеки DevExtreme и Devextreme. Эта библиотека очень большая, поэтому я хочу включить ее один раз из cdn, когда веб-часть запрашивает ее, и продолжать использовать тот же сценарий для каждого дополнительного экземпляра веб-части. Проблема в том, что библиотека поставляется с включенными в нее типами. Он находится в подпапке bundles / dx.all.d.ts, а не в своем собственном пакете. Он также имеет несколько файлов, которые вы можете включить вместо включения всей библиотеки. Кроме того, devextreme-реакции зависит от библиотеки devextreme, поэтому она также включает файлы из devextreme.
Проект либо не загружает внешние библиотеки, потому что я их не включаю, либо не компилируется, потому что я не импортирую его должным образом..? может быть?
Мой вопрос заключается в том, как мне исключить библиотеку, добавить ее в конфигурацию externals, импортировать ее в файлы моего проекта с наборами текста и по-прежнему компилировать мой проект?
2 ответа
Имейте в виду, что нельзя использовать импорт из devextreme-react напрямую.
//wrong import
import { TextBox } from 'devextreme-react';
Вы должны указать импорт для каждого компонента, который у вас есть.
//Correct import
import { TextBox } from 'devextreme-react/text-box';
Итак, я нашел потенциальное решение, конечно, единственная проблема в том, что я должен прекратить использовать devextreme-реагировать и использовать просто простой 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-реакции, заключается в том, что он использует модули devextreme и вынуждает пакет быть упакованным, несмотря ни на что.
Не идеальное решение, но кажется единственным возможным способом сделать это в конце.