Использование 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
Автор: Андрей Кольтяков