Несколько приложений с ember-cli

Я пытаюсь перейти на ember-cli с некоторых старых самодельных инструментов сборки. Наше приложение довольно велико и фактически разделено на несколько одностраничных приложений ember.js (например, index, admin, reports и т. Д.), Которые используют общий набор утилит и компонентов.

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

Я не придирчив к структуре каталогов или деталям. Но я думаю, что это то, как я это себе представляю:

[app]
  - [controllers]
  - [models]
  - [routes]
  - [views]
  - index.html
[admin]
  - [controllers]
  - [models]
  - [routes]
  - [views]
  - index.html
[reports]
  - [controllers]
  - [models]
  - [routes]
  - [views]
  - index.html
[shared_code]
  - [components]
  - [utils]
Brocfile.js
etc

Любой совет будет очень признателен. Даже просто отправная точка была бы чрезвычайно полезной.


Изменить (28 января 2015 г.):

Аддоны Ember-cli теперь более стабильны и могут использоваться для этого приложения. Но IMHO у них все еще есть некоторые недостатки для этого варианта использования. Они создают больше шаблонов, поскольку вам все равно нужно импортировать отдельные модели / контроллеры / компоненты / и т. Д. В пространство вашего приложения. См. Раздел «Компоненты» под надстройками здесь: http://www.ember-cli.com/#managing-addon-dependencies

Существует также интересный RFC для поддержки ember и ember-cli, например, движка, который также может удовлетворить это: https://github.com/emberjs/rfcs/pull/10


Изменить (3 октября 2015 г.):

Есть новое обновление для Engines RFC, которое выглядит многообещающим для многих пользователей. Однако у нас все еще есть потребность в нескольких приложениях, которые на самом деле разные. Другой разработчик, с которым я работаю, потратил какое-то время, чтобы прояснить детали того, как лучше всего использовать этот шаблон.

Я задокументировал это и создал демонстрацию в репо: https://github.com/workmanw/ember-multi-app < / а>


person Wesley Workman    schedule 09.07.2014    source источник
comment
Итак, Уэсли, что ты решил в итоге сделать, ведь я сейчас тоже думаю об этой проблеме (обсудить.emberjs.com/t/sharing-models-via-ember-cli-addons/6311/)   -  person cjroebuck    schedule 26.09.2014
comment
@cjroebuck Я вижу ваше обсуждение, это именно то, что я пытался сделать. Сначала мне удалось создать два экземпляра EmberApp и третье дерево с моими общими файлами в моем Brocfile.js, а затем использовать деревья слияния, чтобы все они заработали. Но текущая волатильность ember-cli пока что оказалась слишком большой. Я использовал чистую брокколи. Я надеюсь вернуться к решению ember-cli, когда оно станет более стабильным.   -  person Wesley Workman    schedule 30.09.2014
comment
@cjroebuck Кроме того, я думаю, что существует явная потребность в таком поведении. Надеюсь, в будущем это станет простой функцией ember-cli.   -  person Wesley Workman    schedule 30.09.2014
comment
На данный момент я пошел по пути ember-addon, поэтому весь мой общий код находится в «общем» проекте, который является аддоном ember, который я добавляю в оба своих приложения, используя ссылку npm в dev - это не пока все плохо, но я согласен, что было бы неплохо, если бы этот рабочий процесс официально поддерживался ember-cli в качестве фактического варианта использования.   -  person cjroebuck    schedule 01.10.2014


Ответы (2)


Ember-cli не поддерживает сразу несколько приложений. (Кстати, я до сих пор удивляюсь, сколько вещей, которые были обычными для SproutCore, по-прежнему проблематичны для Ember). Модули < / a>, которые вы упомянули, поддерживаются инструментами, от которых зависит ember-cli, поэтому большинство команд ember-cli будут работать нормально. То, как преобразователь (зависимость ember-cli) объединяет все вместе, описано в его запрос на вытягивание. Но вы не сможете использовать генераторы, потому что они еще не знают о модулях. Аддоны Ember в основном расширяют ember-cli или сам Ember, хотя они могут решить вашу проблему, но это не тот инструмент.

Я думаю, что вам лучше всего дождаться появления большего количества команд ember-cli, поддерживающих pods, или самостоятельно реализовать эту функцию в ember-cli.

Лучше всего разбить ваш проект на несколько проектов, по одному для каждого приложения, и включить общий код через Bower, NPM или другое решение. Все они обычно позволяют импортировать зависимости через git или файловую систему, если у вас есть собственные частные компоненты. У вас может быть суперпроект, в котором все работает вместе (через NPM или подмодули Git) и где у вас все еще есть какое-то самодельное решение для оркестровки всего (в основном делегируя его ember-cli).

person F4-Z4    schedule 18.07.2014
comment
Аддоны ember-cli - это новинка, и это отличный способ поделиться исходным кодом между проектами. Стоит проверить. - person Sam Selikoff; 18.07.2014
comment
@SamSelikoff Я согласен, я просто не думаю, что они предназначены для приложений. Они отлично подходят для кода, совместно используемого множеством приложений, и для чего-то более общего. - person F4-Z4; 19.07.2014
comment
определенно не для приложений. но если он воспользуется предложенным вами подходом к разделению на разные приложения, но захочет поделиться некоторым кодом, они могут использовать надстройки. - person Sam Selikoff; 19.07.2014
comment
Извините, что звоню поздно. Я пытался использовать аддоны с npm link, но они не подходили для этого, мне действительно казалось, что я плыву против течения. Для начала, они не отслеживаются, изменение кода надстройки не вызывает перестройки приложения. Во-вторых, они оказываются зажатыми в пути, разрешенном приложением. Таким образом, my-addon / controllers / alpha становится app / controllers / alpha ... что может привести к конфликтам. Наконец, я не смог смоделировать производство. То, что было /, / admin, / report в продукте, стало: localhost: 4200 /, localhost: 5200 / admin и / localhost: 6200 / report с уважением. - person Wesley Workman; 19.07.2014
comment
Все сказанное ^^, я ценю ваш ответ. По крайней мере, я смог признать, что я не один. Я тоже старый парень SproutCore. Есть определенные вещи, на которые я спотыкаюсь и вспоминаю, как SC с этим справляется. Но в целом, с маршрутизатором, шаблонами, обещаниями, преобразователями и т. Д .; Я бы по-прежнему руководил ЕМ над SC каждый день недели. - person Wesley Workman; 19.07.2014

Если вам нужно выполнить несколько приложений с помощью Ember CLI, в соответствии с вашим изменением 2015/1/28, вам нужно дождаться дополнительной поддержки модулей или движков.

Однако рассмотрите здесь наивное решение «сделай сам»: превратите свои n отдельные приложения Ember в n отдельные приложения Ember CLI. Сами обслужите их в рамках единственного суперпроекта.

Недостатки

Как и в случае с вашим исследованием аддонов, у вас будет повторяющийся шаблон, package.json, environment.js и т. Д. Вы понесете накладные расходы на поддержку версий Ember, Ember CLI и т. Д. Для каждого приложения отдельно. Вы должны сами придумать способ обслуживать их всех в суперпроекте. Даже если несколько приложений используют одну и ту же версию библиотеки, клиентам, скорее всего, придется загружать повторяющийся код vendor.js.

Это сильные недостатки, которые вам придется взвесить.

Преимущества

  1. Вы сохраняете свою текущую организацию кода.

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

    Дублирование намного дешевле неправильной абстракции. В мире динамического JavaScript, где все входит в систему типов и у всех разные реализации модуля, слишком раннее абстрагирование / извлечение создает проблемы. Когда общий код аккуратно извлекается в отдельную библиотеку - возможно, с использованием правила трех - это приводит к получению микролиба более высокого качества. Обслуживание библиотеки может быть сосредоточено на оптимизации только общих функций и ее обратной совместимости. Вы можете не получить этого, если общий код останется в вашем приложении, используя импортные спагетти.

    Как и в случае с ответом frzng, включите общий код через надстройки Bower, NPM и Ember.

  3. Технический долг одного приложения не повреждает другое приложение.

    Это особенно хорошо в экосистеме Ember. Несмотря на то, что его девиз - стабильность без застоя, новые модели Ember выходят каждый день. Хотите попробовать одну из этих передовых техник Ember, но не хотите тратить время на обновление всего монолита Ember? Вместо этого обновите только одно приложение меньшего размера!

    Я работал с огромным приложением Ember, технический долг которого в небольших областях не позволял обновлять все приложение. С этой схемой больше не нужно говорить «нет».

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

Суперпроект

Организация

Вы можете исследовать поддеревья Git (* shudder *) или артефакты NPM. Вы будете перепрыгивать через обручи, чтобы все они синхронизировались.

В моей ситуации запускать одно приложение без остальных не имеет смысла. Я добился успеха с монорепозиторием.

Обслуживание

Моя схема URL-адресов работала для разделения моих приложений Ember, аналогичного философии Unix. Каждый из них может обслуживаться одним сервером, но каждый из них сгруппирован по логически отдельному контекстному пути. Например, все запросы к /app1/* направляются в скомпилированный файл index.html приложения №1. Все запросы к /app2/* направляются в скомпилированный файл index.html приложения №2. И так далее. Оттуда Ember берет на себя маршрутизацию.

Возможно, вы сможете сделать то же самое с /index/*, /admin/* и /reports/*.

Чтобы подключить эти приложения к различным общедоступным URL-адресам, добавьте несколько метаданных в package.json каждого, чтобы сообщить серверу, как это сделать. При запуске сервер просматривает метаданные и динамически генерирует маршруты веб-фреймворка.

for packageJson in packageJsons:
    path = packageJson.contextPath                               # e.g. '/app1/*'
    indexHtml = packageJson.abspath.dirname + '/dist/index.html' # Ember CLI's conventional location

    # Dynamically mount the route.
    # Normally you'd hardcode your routes, something like  
    #     yourWebFramework.GET('/hello', echo('Hello world'))
    yourWebFramework.GET(path + '/*', serveStaticFile(indexHtml))
person Bluu    schedule 16.07.2015