Дата публикации:

В приложениях зачастую приходится использовать сторонние библиотеки (как правило — в браузере), которые не являются es6-модулями. В данной публикации описано, каким образом подключать сторонние библиотеки, чтобы их можно было использовать внутри платформы TeqFW.

Возьмём, например, пакет tweetnacl. Разработчики пакета предусматривают, что весь функционал пакета загружается в браузер в виде единого бандла:

<script type="application/javascript" src="nacl-fast.min.js"></script>

После чего он становится доступным для использования в браузере в виде глобального объекта:

window.nacl

В TeqFW обращение к элементам кода организуется через пространство имён, а использование контейнера для внедрения зависимостей позволяет подменять одни зависимости другими (например, интерфейсы их реализациями). Поэтому для доступа к глобальным объектам в teq-приложениях необходима обёртка, совместимая с TeqFW DI.

Teq-приложения — это прежде всего PWA. В PWA все необходимые ресурсы подгружаются в кэш браузера, чтобы обеспечить возможность работы приложения в offline. В том числе и внешние библиотеки. Загрузка внешних библиотек и их монтирование в globals производится в оболочке приложения (app shell) стандартными средствами:

<!DOCTYPE html>
…
<script type="application/javascript" src="./src/tweetnacl/nacl-fast.min.js"></script>

Чтобы фронт получил доступ к содержимому npm-пакета tweetnacl, в файле ./teqfw.json (дескрипторе приложения или плагина) нужно добавить инструкции плагину @teqfw/web для обработки статики:

{
  "@teqfw/web": {
    "statics": {
      "/tweetnacl/": "/tweetnacl/"
    }
  }
}

После чего все файлы в каталоге ./node_modules/tweetnacl/… станут доступны с фронта по адресу https://…/src/tweetnacl/…. Сам npm-пакет подключается в приложение обычным способом, в package.json (приложения или плагина):

{
  "dependencies": {
    "tweetnacl": "*"
  }
}

Если сделать всё указанное выше, то библиотека загружается на фронте. Чтобы сделать её функционал доступным через TeqFW DI, нужно создать примерно такой es6-модуль ./src/Front/Lib/Nacl.mjs:

/**
 * Wrap TweetNaCl library to use as ES6 module in TeqFW on the front.
 * @namespace Fl32_Dup_Front_Lib_Nacl
 */
if (window.nacl === undefined) {
  throw new Error(`
Add '<script type="application/javascript" src="./src/tweetnacl/nacl-fast.min.js"></script>'
to your startup HTML to use TweetNaCl.
`);
}
export const {
  box,
  hash,
  lowlevel,
  randomBytes,
  scalarMult,
  secretbox,
  setPRNG,
  sign,
  verify,
} = window.nacl;

Оболочка экспортирует функционал, находящийся в global, в виде, доступном для использования в качестве es6-модуля.

Теперь функционал библиотеки можно использовать через TeqFW DI:

class Vnd_Plugin_Mod {
  constructor(spec) {
    // EXTRACT DEPS
    const {box, secretbox} = spec['Fl32_Dup_Front_Lib_Nacl'];
    // …
  }
}