Разработка решений на платформе ELMA365 / Серверные зависимости пакетов npm

Серверные зависимости пакетов npm

В ELMA365 On-Premises вы можете подключать серверные зависимости в сценариях виджетов. Это позволит решить ряд специфичных задач при разработке без написания своего микросервиса.
 
Вместо этого используйте богатую экосистему npm пакетов при разработке серверных скриптов. Для этого упакуйте готовую папку node_modules и файл package.json в архив с названием dependencies.tar.gz. Затем загрузите архив в настройки виджета в дизайнере интерфейсов на вкладке Файлы. После этого можно использовать упакованные зависимости в коде серверного скрипта.

начало внимание

Подключение серверных зависимостей пакетов npm доступно только в ELMA365 On-Premises.

конец внимание

Например, можно использовать пакет XLSX для чтения данных из excel файла с помощью команд:

import * as XLSX from 'xlsx/xlsx.mjs';
 
const url = await Context.data.file.getDownloadUrl();
const req = await fetch(url);
const data = await req.arrayBuffer();
 
let workbook = XLSX.read(data);
let cell_value = workbook['Лист 1']['A1'].v;

Сборка пакета с серверными зависимостями

Shell скрипт (Linux, MacOS)

# Положить скрипт в пустой каталог
# Сделать его исполняемым $chmod 755 makedeps.sh
# Запустить, передав в качестве параметров список npm пакетов напр. $./makedeps.sh xlsx semver
# По окончании выполнения сформируется пакет с зависимостями dependencies.tar.gz
#
# Для работы требуется docker
 
rm -rf ./deps
docker run -v `pwd`:/data -w /data/deps --platform linux/amd64 --rm node:14.16.0-alpine /bin/sh -c "npm init -y && npm i $*"
docker run -v `pwd`:/data -w /data --platform linux/amd64 --rm busybox tar -zcf dependencies.tar.gz -C /data/deps node_modules package.json
rm -rf ./deps

PowerShell скрипт (Windows)

# Положить скрипт в пустой каталог
# Запустить, передав в качестве параметров список npm пакетов напр. $./makedeps.ps1 xlsx semver
# По окончании выполнения сформируется пакет с зависимостями dependencies.tar.gz
#
# Для работы требуется docker
 
$ErrorActionPreference = "SilentlyContinue" #This will hide errors
Remove-Item -Recurse -Force .\deps
$ErrorActionPreference = "Continue" #Turning errors back on
docker run -v ${PWD}:/data -w /data/deps --platform linux/amd64 --rm node:14.16.0-alpine /bin/sh -c "npm init -y && npm i $args"
docker run -v ${PWD}:/data -w /data --platform linux/amd64 --rm busybox:stable tar -zcf dependencies.tar.gz -C /data/deps node_modules package.json
Remove-Item -Recurse -Force .\deps

Особенности подключения модулей

В пользовательском сценарии:

  • можно импортировать:
    • модули из package.json (раздел dependencies);
  • нельзя импортировать:
    • транзитивные зависимости;
    • модули хоста (по отношению к worker);
    • встроенные модули node.js (fs, path, tty…).

Внутри внешних модулей (импортируемых в сценарии):

  • можно импортировать:
    • любые другие модули, присутствующие в директории с зависимостями;
    • встроенные модули node.js (fs, path, tty…);
  • нельзя импортировать:
    • модули хоста (по отношению к worker).