Подтвердить что ты не робот

Модульное программирование и node

ОБНОВЛЕНИЕ 1. Я сделал большой прогресс в этом вопросе. Я в значительной степени отказался (по крайней мере, на данный момент, но, возможно, в долгосрочной перспективе) от идеи предоставления загруженных пользователем модулей. Тем не менее, я разрабатываю структуру, чтобы можно было определить и загрузить несколько модулей. Модуль будет инициализирован, настроен на собственные маршруты и будет иметь "общедоступный" каталог для обслуживания Javascript. Чем больше я его вижу, тем больше я понимаю, что могу (должен) также перемещать вызовы, которые теперь являются общесистемными в модуле под названием "система".

ОБНОВЛЕНИЕ 2. Я сделал ОГРОМНЫЙ прогресс в этом. Я собираюсь совершить кучу кода на GitHub, который позволит людям действительно делать действительно хорошее модульное программирование (с модулями, отображающими как клиентский, так и серверный код) с помощью Node и Express. Пожалуйста, следите за обновлениями.

ОБНОВЛЕНИЕ 3. Я переписал эту вещь как систему для регистрации модулей и позволяет им общаться через систему событий/крючков. Это происходит очень красиво. У меня есть тонны кода, которые уже хорошо подходят - я просто переношу его в новую систему. Не стесняйтесь взглянуть на проект на GitHub: https://github.com/mercmobily/hotplate)

ОБНОВЛЕНИЕ 4. Это хорошо. Оказывается, моя идея о том, что модуль является клиентом И сервером, действительно работает.

ОБНОВЛЕНИЕ 5. Модуль приближается к чему-то полезному. Я применил новый загрузчик, который будет учитывать, что функция init() будет invokeAll(), и будет убедиться, что сначала будут загружены модули, обеспечивающие этот крючок. Это открывает плиту на совершенно новый уровень.

ОБНОВЛЕНИЕ 6: плита теперь близка к 12000 строкам кода. К моменту его завершения, когда-то в феврале, я предполагаю, что это будет около 20000 строк кода. Он делает много вещей, и все это началось здесь, на StackOverflow! Мне нужно, чтобы он разработал мой собственный SaaS, поэтому мне действительно нужно закончить его к февралю (чтобы я мог спринте до июля и закончить первую версию BookingDojo). Спасибо всем!

Я пишу что-то, что, вероятно, превратится в довольно большое программное обеспечение. Короче говоря, это nodejs + Express + Mongodb/Mongoose + Dojo (клиентская сторона).

ПРИМЕЧАНИЕ. Вопросы в этом тексте отмечены как [Q1], [Q2] и т.д.

Исходя из фона Drupal (и зная, как coooomplex он развился, чего-то, чего я хотел бы избежать), я немного мошенник модуля. На данный момент я выполнил шаблон приложения (hotplate: https://github.com/mercmobily/hotplate). Он делает все скучные вещи (пользователи, рабочие пространства, напоминание пароля и т.д.), И ему не хватает нескольких частей.

Я хотел бы придумать дизайн, который позволит модулям аналогично Drupal (но, возможно, лучше). То есть:

  • Модули могут определять новые маршруты и обрабатывать их
  • Модули устанавливаются в системном масштабе, и тогда каждая рабочая область может включить набор из них.

Первоначальная архитектура может быть чем-то вроде этих строк:

  • Каталог "modules", где есть один каталог для каждого модуля
  • В каждом модуле есть каталог для "общедоступных" файлов для стороны JavaScript.
  • Каждый модуль имеет public/startup.js, который будет включен в приложение javascript
  • Каждый модуль будет иметь сервер / node.js, который будет включен "на лету" сервером, если/при необходимости
  • Определен один маршрут, например, /app/:workspaceid/modules/MODULE_NAME/.* с промежуточным программным обеспечением, которое проверяет, включено ли в это рабочее пространство MODULE_NAME, и если это так, вызывает функцию модуля с переданным параметром

[Q1]: Это немного смутно?

Вопросы:

  • Я хочу сделать эту динамику. Я хотел бы, чтобы модули были необходимы, когда это необходимо на месте. Это должно быть достаточно легко сделать, требуя вещей "на лету".

  • server/node.js будет иметь функцию, но эта функция чувствует/выглядит ужасно много, как сам роутер

[Q2] Есть ли у вас какие-то конкретные подсказки об этом?

Они не кажутся слишком серьезными. Однако реальный вопрос возникает, когда вы говорите о безопасности.

  • Защита

    . Это неприятно. В настоящий момент все вызовы сделают правильные запросы для фильтрации mongoDb с помощью workspaceId. Я хотел бы каким-то образом применить такой механизм, чтобы модули не обладали явным доступом к базе данных, поэтому каждый модуль не имеет доступа к данным, принадлежащим другим рабочим пространствам.

  • Пользовательские модули. Я хотел бы дать пользователям возможность загружать свои собственные модули (и, возможно, сделать их доступными для других пользователей). Но это эффективно означает, что пользователи могут загружать код, который будет выполняться самим Node! Как бы вы это сделали?

[Q3] Как вы относитесь к этим проблемам конфиденциальности/безопасности? Есть ли способ, например, запустить загруженный пользователем код в виде песочницы Node? Как насчет доступа к файловой системе и т.д.?

Спасибо!

4b9b3361

Ответ 1

В конце концов, я сам ответил на это - трудный путь. Ответ: плита, https://github.com/mercmobily/hotplate

Он делает большую часть того, что я описал выше. Что еще более важно, с hotPlate (с использованием hotPage и hotClientPages, доступных по умолчанию), вы можете написать модуль, который

  • Определяет некоторые маршруты
  • Определяет "общедоступный" каталог с пользовательским интерфейсом
  • Определяет определенные файлы CSS и JS, которые должны быть загружены при загрузке этого модуля.
  • В случае необходимости может добавить JSes для конкретных маршрутов

Статус: Я принимаю этот ответ, так как я закончил разработку "основной" плиты, которая была точкой этого ответа. Мне все еще нужно "делать" вещи (например, как только я напишу документы, я убеждаюсь, что "горячая плита" является единственным каталогом в модуле, не имея там пример сервера). Однако фундамент есть. Что касается "ядра", он действительно просто пропускает "аут" сторону истории (что потребует много размышлений, так как я хочу сделать так, чтобы он был агностиком и совпадал с паспортом). Виджеты Dojo являются отличным бонусом, хотя эту структуру можно использовать с чем угодно (и на самом деле код конкретной системы будет sweeeeet).

Какая плита НЕ ДЕЛАЕТ:

Какая плита НЕ делает, дает пользователям возможность загружать модули, которые затем будут загружены в приложение. Это очень сложно. Клиентская сторона не будет настолько плоха (пользователь может определить Javascript для загрузки, и там может быть модуль для этого, не беспокойтесь). Однако серверная сторона в лучшем случае сложна. Есть слишком много вещей, которые могут пойти не так (клиент может загрузить блокирующую часть кода, или они могут начать читать файловую систему, у них будет доступ к полной базе данных и т.д.). Решение этих проблем возможно, но ни один из них не является простым (вы можете привязать среду пользователя node и заставить ее работать на другом порту, например, и т.д.), Но некоторые проблемы останутся. Но всегда есть надежда.