Как я могу использовать модуль из npm в виджете django-admin, не устанавливая node?
Фон
У меня есть приложение на django, для которого я хочу создать виджет администратора. Виджет будет отображать текст определенным образом (как терминал). Это нужно для того, чтобы администраторы приложения могли видеть пересылаемые логи из аналитического процесса, который организуется django (приложение django-twined).
Для этого я хочу использовать что-то вроде terminal-kit или одну из других библиотек, требующих npm install <whatever>
Создание приложения
Приложение создано в docker, и я не хочу, чтобы весь стек node оказался в моем рабочем образе.
Я мог бы использовать многоэтапную сборку docker; то есть установить node и библиотеку из NPM на первом этапе, затем скопировать библиотеку из node_modules
на втором этапе, но это кажется неоправданно медленным.
Кроме того, поскольку все, что я делаю, это использую необработанные статические активы js, которые поставляются с приложением django, я не уверен, как перейти к импорту модуля (и возможно ли это вообще).
Вопросы
Можно ли установить модуль npm без присутствия стека node и таким образом избежать громоздких многоступенчатых сборок?
Как я могу затем
import
илиrequire
содержимое этого модуля преобразовать в ванильный javascript для использования в виджете django?Возможно ли это вообще? Если это похоже на сдвигание горы, я откажусь и просто налеплю туда текстовую область с моноширинным шрифтом... но было бы неплохо, если бы подсветка журнала и цвета правильно обрабатывались в терминалоподобном виде.
.
Могу ли я установить модуль npm без присутствия стека node и, таким образом, избежать громоздких многоступенчатых сборок?
Вы можете свернуть пакет npm с помощью инструмента разработки, например Browserify. Это можно сделать, свернув весь пакет, используя что-то вроде:
browserify --require terminal-kit
Browserify разберет пакет и создаст один JS-файл, который вы можете попробовать загрузить в браузере. Здесь есть некоторые ограничения, поэтому я бы рекомендовал поэкспериментировать и изучить документацию Browserify.
Как я могу затем импортировать или потребовать содержимое этого модуля в ванильный javascript для использования в виджете django?
Вы можете сделать это, включив ссылку на файл шаблона Django в определение класса бэкенд-администратора. В шаблоне вам нужно будет включить тег html JS source, который указывает на JS скрипт, который вы хотите загрузить. Django может включать статические файлы при сборке, вы можете использовать это для включения JS файла во время сборки, а затем локальную ссылку на ресурс для указания файла шаблона на нужное место.
Возможно ли это вообще в принципе?
В общем случае это определенно возможно, но все зависит от ситуации. Все сводится к сложности пакета npm и к тому, что именно он пытается сделать в браузере.
По шагам я бы сделал следующее:
- Используйте Browserify для преобразования пакета npm в один JS-файл.
- Создайте html-файл, который загружает локальный JS-файл, откройте его в браузере.
- Откройте консоль и посмотрите, работают ли команды/контекст, которые вы надеетесь воспроизвести, как ожидалось, в браузере. Вы также можете написать другой ванильный JS-файл и загрузить его в html-файл для тестирования.
- Включите ссылку на JS файл в шаблон/виджет администратора Django.
- Напишите пользовательский JS код в виджете, который использует/показывает глобально инстанцированный JS скрипт.
Эта стратегия основана на моем личном опыте, я добился успеха, следуя этой стратегии, надеюсь, она будет полезна.