ember.js - started - ember startup
MĂșltiples "aplicaciones" con ember-cli (2)
Ember-cli no es compatible con múltiples aplicaciones listas para usar. (Por cierto, todavía estoy sorprendido de cuántas cosas que eran comunes en SproutCore siguen siendo problemáticas con Ember). Los pods que mencionaste son compatibles con las herramientas de las que depende ember-cli, por lo que la mayoría de los comandos ember-cli funcionarán bien. El modo resolver (una dependencia ember-cli) pone todo junto se describe en su solicitud de extracción . Pero no podrá usar generadores porque todavía no están al tanto de las cápsulas. Los complementos de Ember en su mayoría extienden ember-cli o Ember, aunque pueden resolver su problema, no son la herramienta adecuada.
Creo que lo mejor para ti es esperar a que más módulos conozcan los comandos de ember-cli o aplicar esta característica a ember-cli.
La mejor alternativa es dividir su proyecto en varios proyectos, uno por aplicación, e incluir código compartido a través de Bower, NPM u otra solución. Todos ellos generalmente permiten importar dependencias a través de git o sistema de archivos si tiene sus propios componentes privados. Es posible que tenga un superproyecto en el que todo vaya de la mano (a través de los submódulos de NPM o Git ) y donde todavía tenga una solución interna para organizar todo (básicamente delegándolo a ember-cli).
Estoy intentando migrar a ember-cli desde algunas herramientas de compilación de cosecha propia. Nuestra aplicación es bastante grande y en realidad está dividida en varias aplicaciones de una sola página de ember.js (por ejemplo, índice, administrador, informes, etc.) que comparten un conjunto común de utilidades y componentes.
Estoy tratando de averiguar si eso es posible con ember-cli y si es así, ¿cómo lo hago? Vi a algunas personas hablando de pods, otras hablando de complementos y otra serie de personas hablando sobre repositorios de bower privados. Traté de encontrar información sobre cada uno de estos, pero parece que todo está en un poco de flujo.
No soy exigente con la estructura del directorio o los detalles. Pero supongo que así es como lo visualizaría:
[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
Cualquier consejo sería muy apreciado. Incluso solo un punto de partida sería inmensamente útil.
Editar (28 de enero de 2015):
Los complementos Ember-cli son más estables ahora y podrían usarse para esta aplicación. Pero en mi humilde opinión todavía tienen algunas deficiencias para este caso de uso. Crean más placa de caldera ya que todavía tiene que importar modelos individuales / controladores / componentes / etc. en su espacio de aplicación. Consulte la sección "Componentes" debajo de los complementos aquí: http://www.ember-cli.com/#managing-addon-dependencies
También hay un RFC interesante para traer soporte de motor a brasas y ember-cli que podría satisfacer esto también: https://github.com/emberjs/rfcs/pull/10
Editar (3 de octubre de 2015):
Hay una nueva actualización de Engines RFC y parece prometedora para muchos usuarios. Sin embargo, todavía tenemos la necesidad de múltiples aplicaciones que son realmente diferentes. Otro desarrollador con el que trabajo pasó algún tiempo para aclarar los detalles de la mejor manera de utilizar este patrón.
Documenté eso y creé la demostración en un repositorio: https://github.com/workmanw/ember-multi-app
Si debe cumplir varias aplicaciones con Ember CLI , según su edición del 28/1/28, querrá esperar a obtener más soporte para pods o motores.
Sin embargo, considere la ingenua solución de bricolaje aquí: haga que su n
aplicaciones de Ember separadas en n
aplicaciones Ember CLI . Servirlos usted mismo en un único superproyecto .
Desventajas
Al igual que con su investigación de complementos, tendrá repitiendo repetidamente, package.json
, environment.js
, etc. Usted incurrirá en la sobrecarga de mantener las versiones de Ember, Ember CLI, etc. de cada aplicación por separado. Tendrá que crear una forma de servirlos a todos en un superproyecto. Incluso si hay varias aplicaciones en la misma versión de la biblioteca, es probable que los clientes tengan que descargar el código duplicado de vendor.js.
Estas son fuertes desventajas que tendrá que sopesar.
Ventajas
- Mantiene su organización de código actual.
Debe ser disciplinado sobre el código que extrae para compartir.
"La duplicación es mucho más barata que la abstracción equivocada". En el mundo de JavaScript dinámico, donde todo va en el sistema de tipos, y todo el mundo tiene una implementación de módulo diferente, abstraer / extraer demasiado pronto te causa problemas. Cuando el código compartido se extrae cuidadosamente en una biblioteca separada, tal vez utilizando la Regla de 3 , se obtiene un microlib de mayor calidad. El mantenimiento de la lib puede centrarse en optimizar solo la funcionalidad compartida y su compatibilidad con versiones anteriores. Es posible que no obtenga eso si el código compartido permanece en su aplicación, empleado a través de importación de espagueti.
Al igual que con la respuesta de frzng , "incluye código compartido a través de Bower, NPM" y complementos Ember.
La deuda tecnológica de una aplicación no corrompe a otra aplicación.
Esto es bueno particularmente en el ecosistema Ember. Aunque su lema es "estabilidad sin estancamiento", salen nuevos patrones de Ember todos los días. ¿Quieres probar una de esas técnicas de Ember de punta de sangría, pero no quieres pasar tiempo mejorando tu monolito de Ember entero? ¡Actualiza solo una aplicación más pequeña!
He trabajado con una aplicación Ember masiva cuya deuda tecnológica en áreas pequeñas prohibía actualizar toda la aplicación . Con este esquema, no necesita decir no más.
( Detener la propagación de la deuda tecnológica es parte de por qué los microservicios son tan populares últimamente. Muchas aplicaciones pequeñas de Ember podrían llamarse un enfoque de microservicios).
El superproyecto
Organizando
Puede explorar los subárboles de Git (* shudder *) subárboles o artefactos de NPM. Saltará a través de aros para mantenerlos sincronizados.
En mi situación, no tiene sentido ejecutar 1 aplicación sin los demás. He tenido éxito con un monorepo .
Servicio
Mi esquema de URL funcionó para la separación de mis aplicaciones Ember, similar a la filosofía. Cada uno podría ser servido por un solo servidor, pero cada uno agrupado bajo una ruta de contexto lógicamente separada. Por ejemplo, todas las solicitudes para /app1/*
se enrutan a la aplicación n. ° 1 compilada index.html. Todas las solicitudes para /app2/*
se enrutan a la aplicación n.º 2 compilada index.html. Y así. Ember se encarga del enrutamiento desde allí.
Es posible que pueda hacer lo mismo con /index/*
, /admin/*
y /reports/*
.
Para montar estas aplicaciones en sus diversas URL públicas, agregue algunos metadatos en el package.json
de cada uno. package.json
para indicarle al servidor cómo hacerlo. Al inicio, el servidor recorre los metadatos y genera dinámicamente las rutas del marco web.
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))