Поделиться через


Добавление внешней библиотеки в клиентскую веб-часть SharePoint

Вам может понадобиться добавить в веб-часть одну или несколько библиотек JavaScript. В этой статье описано, как добавить внешнюю библиотеку в пакет и использовать библиотеки в нескольких веб-частях.

Добавление сценария в пакет

По умолчанию средство увязки веб-частей в пакеты автоматически добавляет библиотеки, которые представляют собой зависимости для модуля веб-части. Это означает, что такие библиотеки развертываются в том же файле пакета JavaScript, что и веб-часть. Это удобно в случае небольших библиотек, которые не используются в нескольких веб-частях.

Пример

  1. Добавьте библиотеку проверки строк в веб-часть.

  2. Скачайте пакет средств проверки, используя NPM:

    npm install validator --save
    

    Примечание.

    Так как вы используете TypeScript, скорее всего, вам понадобятся объявления типов для добавляемого пакета. Это полезно при написании кода, так как TypeScript — это просто надмножество JavaScript. Весь код TypeScript по-прежнему преобразуется в код JavaScript при компиляции. Объявления типов можно установить с помощью NPM, например npm install @types/{package} --save-dev.

  3. Создайте в папке веб-части файл с именем validator.d.ts и добавьте следующее:

    declare module "validator" {
        export function isEmail(email: string): boolean;
        export function isAscii(text: string): boolean;
    }
    

    Примечание.

    Для некоторых библиотек нет объявлений типов. Хотя в библиотеке проверки имеется созданный сообществом файл объявлений типов, но для этого сценария предположим, что его нет. В этом случае нужно задать собственный файл определений объявлений типов .d.ts для библиотеки. Ниже приведен пример.

  4. Импортируйте объявления типов в файле веб-части:

    import * as validator from 'validator';
    
  5. Укажите библиотеку проверки в коде веб-части:

    validator.isEmail('someone@example.com');
    

Использование библиотеки несколькими веб-частями

Клиентское решение может включать несколько веб-частей. Для них может потребоваться импортировать или использовать одну и ту же библиотеку. В таких случаях не добавляйте библиотеку в пакет, а включите ее в отдельный файл JavaScript, чтобы повысить эффективность и улучшить кэширование. Особенно это касается больших библиотек.

Пример

В этом примере пакет marked (компилятор markdown) помещается в отдельный пакет для совместного использования.

  1. Скачайте пакет marked с помощью NPM:

    npm install marked --save
    
  2. Установите пакет объявлений типов в свой проект:

    npm install @types/marked --save-dev
    
  3. Измените config/config.json и добавьте запись в схему externals. В результате средство увязки поместит эту библиотеку в отдельный файл, а не добавит в пакет:

    "marked": "node_modules/marked/marked.min.js"
    
  4. Теперь, когда мы добавили пакет и объявления типов для библиотеки, добавьте оператор для импорта библиотеки marked в веб-части:

    import * as marked from 'marked';
    
  5. Укажите библиотеку в своей веб-части:

    console.log(marked('I am using __markdown__.'));
    

Загрузка сценария из сети CDN

Вы можете не загружать библиотеку из пакета NPM, а загрузить сценарий из сети доставки содержимого (CDN). Для этого измените файл config.json, чтобы обеспечить загрузку библиотеки с использованием URL-адреса CDN.

Пример

В этом примере вы загрузите jQuery из CDN. Вам не нужно устанавливать пакет NPM. Однако по-прежнему необходимо установить объявления типов.

  1. Установка объявлений типов для jQuery:

    npm install --save-dev @types/jquery
    
  2. Обновите файл config.json в папке config , чтобы загрузить jQuery из CDN. Добавьте запись в поле externals:

    "jquery": "https://code.jquery.com/jquery-3.1.0.min.js"
    
  3. Импортируйте jQuery в веб-часть:

    import * as $ from 'jquery';
    
  4. Используйте jQuery в своей веб-части:

    alert( $('#foo').val() );
    

Загрузка модуля, отличного от AMD-модуля

Некоторые скрипты следуют устаревшей схеме JavaScript хранения библиотеки в глобальном пространстве имен. Этот шаблон теперь не рекомендуется использовать в пользу универсальных определений модулей (UMD)/асинхронных определений модулей (AMD) или модулей ES6. Однако может потребоваться загрузить такие библиотеки в веб-части.

Совет

Трудно определить вручную, является ли загружаемый сценарий сценарием AMD, особенно если он минифицирован.

Если ваш сценарий размещен по общедоступному URL-адресу, вы можете использовать бесплатный инструмент Rencore SharePoint Framework Script Check, чтобы автоматически определить тип сценария. Кроме того, этот инструмент позволяет узнать, правильно ли настроен место размещения, с которого загружается сценарий. Этот инструмент также доступен в расширении VS Code Rencore SPFx Script Check

Чтобы загрузить модуль, созданный не с помощью AMD, добавьте дополнительное свойство в запись в файле config.json.

Пример

В этом примере вы загрузите вымышленный модуль, отличный от AMD, из сети CDN Компании Contoso. Эти действия применяются для любого сценария, отличного от AMD, в каталоге src/ или node_modules/.

Скрипт называется Contoso.js и хранится в https://contoso.com/contoso.js. Его содержимое:

var ContosoJS = {
  say: function(text) { alert(text); },
  sayHello: function(name) { alert('Hello, ' + name + '!'); }
};
  1. Создайте объявления типов для сценария в файле contoso.d.ts в папке веб-части.

    declare module "contoso" {
      interface IContoso {
        say(text: string): void;
        sayHello(name: string): void;
      }
      var contoso: IContoso;
      export = contoso;
    }
    
  2. Включите этот сценарий в файл config.json. Добавьте запись в схему externals:

    {
      "contoso": {
        "path": "https://contoso.com/contoso.js",
        "globalName": "ContosoJS"
      }
    }
    
  3. Добавьте операцию импорта в код веб-части:

    import contoso from 'contoso';
    
  4. Используйте библиотеку contoso в своем коде:

    contoso.sayHello(username);
    

Загрузка библиотеки с зависимостью от другой библиотеки

Многие библиотеки содержат зависимости от другой библиотеки. Такие зависимости можно указать в файле config.json с помощью свойства globalDependencies.

Важно!

Обратите внимание, что это поле не нужно указывать для AMD-модулей. Они импортируют друг друга правильно. Однако AMD-модуль не может зависеть от модуля, отличного от AMD. В некоторых случаях можно загрузить сценарий AMD в виде сценария, отличного от AMD. Это часто требуется при работе с библиотекой jQuery, которая сама по себе является сценарием AMD, и подключаемыми модулями jQuery, которые в большинстве случаев распространяются как сценарии, отличные от AMD, и зависят от jQuery.

Ниже приведены два примера.

Для модуля, отличного от AMD-модуля, предусмотрена соответствующая зависимость

В этом примере используются два вымышленных сценария. Они хранятся в папке src/, но их также можно загрузить из CDN.

ContosoUI.js

Contoso.EventList = {
  alert: function() {
    var events = Contoso.getEvents();
    events.forEach( function(event) {
      alert(event);
    });
  }
}

ContosoCore.js

var Contoso = {
  getEvents: function() {
    return ['A', 'B', 'C'];
  }
};
  1. Добавление или создание объявлений типов для этого класса. В этом случае вы создадите Contoso.d.ts, который содержит объявления типов для обоих файлов JavaScript.

    contoso.d.ts

    declare module "contoso" {
      interface IEventList {
        alert(): void;
      }
      interface IContoso {
        getEvents(): string[];
        EventList: IEventList;
      }
      var contoso: IContoso;
      export = contoso;
    }
    
  2. Обновите файл config.json. Добавьте две записи в externals:

    {
      "contoso": {
        "path": "/src/ContosoCore.js",
        "globalName": "Contoso"
      },
      "contoso-ui": {
        "path": "/src/ContosoUI.js",
        "globalName": "Contoso",
        "globalDependencies": ["contoso"]
      }
    }
    
  3. Добавьте операции импорта для Contoso и ContosoUI:

    import contoso = require('contoso');
    require('contoso-ui');
    
  4. Укажите библиотеки в своем коде:

    contoso.EventList.alert();
    

Загрузка JSOM SharePoint

Модели JSOM SharePoint загружаются практически так же, как сценарии с зависимостями, отличные от AMD-сценариев. Это означает использование globalName параметров и globalDependency .

Важно!

Обратите внимание, что приведенный ниже подход вызовет ошибки на классических страницах SharePoint, где модель JSOM уже загружена. Если ваша веб-часть должна работать как с классическими, так и современными страницами, нужно сначала проверить, доступна ли модель JSOM, а если нет, загрузить ее динамически с помощью SPComponentLoader.

  1. Установите объявления типов для Microsoft Ajax, которые являются зависимостью для объявлений типов JSOM:

    npm install @types/microsoft-ajax --save-dev
    
  2. Установите объявления типов для JSOM:

    npm install @types/sharepoint --save-dev
    
  3. Добавьте записи в файл config.json:

    {
      "sp-init": {
        "path": "https://CONTOSO.sharepoint.com/_layouts/15/init.js",
        "globalName": "$_global_init"
      },
      "microsoft-ajax": {
        "path": "https://CONTOSO.sharepoint.com/_layouts/15/MicrosoftAjax.js",
        "globalName": "Sys",
        "globalDependencies": [ "sp-init" ]
      },
      "sp-runtime": {
        "path": "https://CONTOSO.sharepoint.com/_layouts/15/SP.Runtime.js",
        "globalName": "SP",
        "globalDependencies": [ "microsoft-ajax" ]
      },
      "sharepoint": {
        "path": "https://CONTOSO.sharepoint.com/_layouts/15/SP.js",
        "globalName": "SP",
        "globalDependencies": [ "sp-runtime" ]
      }
    }
    
  4. Добавьте в веб-часть следующие операторы require:

    require('sp-init');
    require('microsoft-ajax');
    require('sp-runtime');
    require('sharepoint');
    

Загрузка локализованных ресурсов

В файле config.json вы можете использовать схему localizedResources, чтобы описать принцип загрузки локализованных ресурсов. Пути в этой схеме заданы относительно папки lib и не должны содержать начальную косую черту (/).

В этом примере у вас есть папка src/strings/. В этой папке есть несколько файлов JavaScript с такими именами, как en-us.js, fr-fr.js ,de-de.js. Так как каждый из этих файлов должен загружаться загрузчиком модулей, они должны содержать оберточный код CommonJS. Например, в случае файла en-us.js:

  define([], function() {
    return {
      "PropertyPaneDescription": "Description",
      "BasicGroupName": "Group Name",
      "DescriptionFieldLabel": "Description Field"
    }
  });
  1. Измените файл config.json. Добавьте запись в localizedResources. {locale} — это замещающий токен для имени языкового стандарта.

    {
      "strings": "strings/{locale}.js"
    }
    
  2. Добавьте объявления типов для строк. В этом случае у вас есть файл MyStrings.d.ts:

    declare interface IStrings {
      webpartTitle: string;
      initialPrompt: string;
      exitPrompt: string;
    }
    
    declare module 'mystrings' {
      const strings: IStrings;
      export = strings;
    }
    
  3. Добавьте операции импорта для строк в проекте:

    import * as strings from 'mystrings';
    
  4. Используйте строки в своем проекте:

    alert(strings.initialPrompt);
    

См. также