Использование PnP JS Core за пределами браузера (в среде Node.js)

Расширяем области применения любимых инструментов

Осенью прошлого года я писал об первоначальном опыте использования PnP JS Core, прошло вот уже как 9 месяцев. В том посте я поделился первыми впечатлениями использования библиотеки и решением использовать ее на боевых проектах.

Что же я могу поведать по прошествии времени? Сейчас, для меня и команды, PnP JS Core стала почти обязательной и включаемой по умолчание в шаблоны сборок front-end проектов для SharePoint. Честно говоря, я практически забыл, когда в последний раз приходилось прибегать к помощи старичка JSOM (sp.js) для взаимодействия с объектами SharePoint API в рамках UI-приложений. JS Core предоставляет интерфейс к почти всем доступным часто используемым элементам REST API. Конечно не без проблем самого REST, есть довольно много чего, что в REST по каким-то причинам не реализовано или не работает (нет API для управляемых метаданных, ограничения интерфейса профилей пользователей и пр.), но без этого в принципе можно жить или есть обходные пути. В части поддерживаемых методов PnP JS Core отлично справляется со своими задачами.

В рамках пары проектов я столкнулся с необходимостью коммуникации с SharePoint в рамках работы с данными и метаданными непосредственно из окружения Node.js с использованием REST. При этом поймал себя на мысли, что руки сами пишут строки на PnP JS Core. В целом нет никакой проблемы подготовить URI запроса и JSOM пакет и выполнить REST запрос в чистом виде. Но, как бы было круто максимально унифицировать кодовую базу, когда это можно и применять одни и те же инструменты, что на клиенте в браузере, что на клиенте/сервере вне браузерной сессии.

К счастью, я не один такой и народ уже эксперементировал с данной проблематикой и даже создавал проекты-примеры на GitHub. Поэтому перенять работающие концепты и завести PnP JS Core в Node.js особого труда не составило.

Предлагаемый метод выполнения JS Core в V8 Node.js заключается в "патчинге" глобальной переменной, заголовков запросов и fetch-клиента. Способ отлично работает и зарекомендовал себя в боевых проектах, где подобным образом у нас производится обработка данных.

Чуть позже появилось необходимость повторить реализацию в рамках другого проекта и не одного, встал вопрос, рационального переиспользования без копирования кода между проектами.

Отличная ситуация для того, чтобы подобный инструментарий обернуть в переиспользуемую библиотеку по необходимости подключаемую к проектам. Сказано, сделано. В итоге была создана библиотека sp-pnp-node, которая абстрагирует необходимость натчинга http клиента вручную и минимизирует лишний код.

Установить библиотеку можно с помощью NPM или Yarn:

NPM

npm install sp-pnp-node --save

Yarn

yarn add sp-pnp-node --save

После чего библиотеку можно задействовать в JavaScript'е или, в последнее время предпочитаю, TypeScript'е.

Использование в TypeScript

import { PnpNode } from 'sp-pnp-node';
import { Web } from 'sp-pnp-js';

(new PnpNode()).init().then((settings) => {

    // Далее можно осуществлять вызовы PnP JS Core
    let web: Web = new Web(settings.siteUrl);

});

Использование в ES6

const PnpNode = require('sp-pnp-node').PnpNode;
const pnp = require('sp-pnp-js');

(new PnpNode()).init().then((settings) => {

    // Далее можно осуществлять вызовы PnP JS Core
    let web = new pnp.Web(settings.siteUrl);

});

Несколько строк инициализации и PnP JS Core заработает вне браузера.

При инициализации PnPNode можно указать дополнительные настройки, однако, основная идея при создании библиотеки была в том, чтобы минимизировать и упростить конструкцию инициализации, поэтому настройки по умолчанию подойдут для большинства сценариев. При первоначальном запуске, обертка произведен инициализацию подключения к среде SharePoint, в рамках которой в режиме мастера необходимо будет заполнить авторизационные параметры. Введенные параметры сохраняются в конфигурационный файл, пароль хешируется.

Знакомые с моими проектами знают, что у меня много где задействована библиотека node-sp-auth, отвечающая за аутентификацию в SharePoint. Для того, чтобы между разными проектами был единый подход к настройкам аутентификации приложений была создана библиотека node-sp-auth-config. Она в том числе, интегрирована в sp-pnp-node.

Заключение

Я определенно рекомендую PnP JS Core под задачи, для которых она была спроектирована и создана. Девять месяцев плотного использования библиотеки - довольно убедительный аргумент.

Помимо работы в контексте браузера, PnP JS Core, с использованием таких оберток, как sp-pnp-node, способна на выполнение запросов в рамках приложений на Node.js, таких как консольные приложения, задачи по расписанию, микросервисы, приложения на Electron.


Опубликовано: 19.05.2017
Автор: Андрей Кольтяков