Aunque existen excelentes soluciones para administrar las dependencias en el lado del servidor, no pude encontrar ninguna que satisfaga todas mis necesidades de tener un flujo de trabajo coherente de administración de dependencias de JavaScript en el lado del cliente. Quiero satisfacer estos 5 requisitos:
- Administrar mis dependencias del lado del cliente en un formato similar al de la NGP package.json o Bower s'
bower.json
- Debería tener la flexibilidad de apuntar a git repo o archivos js reales (ya sea en la web o localmente) en mi
dependency.json
archivo para bibliotecas menos conocidas (npm le permite apuntar a git repos) - Debería minificar y asignar un espacio de nombres a todas las bibliotecas en un solo archivo como ender ; ese es el único archivo js que necesitaría poner en mi
<script>
etiqueta en el lado del cliente - Debería tener soporte listo para usar para CoffeeScript como BoxJS 4 (ahora muerto)
En el navegador, debería poder usar el estilo require :
var $ = require('jquery'); var _ = require('underscore');
O mejor aún, haz el estilo headjs :
head.js(['jquery', 'underscore', 'mylib'], function($, _, mylib) { // executed when all libraries are loaded });
Si no existe tal herramienta única, ¿cuál es la mejor combinación de herramientas, es decir, una cadena de herramientas que puedo combinar usando algo como volo (o gruñido )?
Ya he investigado todas las herramientas a las que me he vinculado aquí y satisfacen solo hasta 3 de mis requisitos, en el mejor de los casos, individualmente. Por lo tanto, no vuelva a publicar sobre estas herramientas. Solo aceptaría una respuesta que proporcione una única herramienta que satisfaga mis 5 requisitos o si alguien publica un flujo de trabajo / script / ejemplo de trabajo concreto de una cadena de herramientas de múltiples herramientas de este tipo que también satisfaga todos mis requisitos. Gracias.
fuente
require
sintaxis del nodo al navegador, considere browserifyRespuestas:
require.js hace todo lo que necesitas.
Mi respuesta a esta pregunta puede ayudarte
Ejemplo:
Jerarquía del proyecto de la aplicación cliente:
main.js es donde inicializa su aplicación cliente y configura require.js:
Las dependencias usarán el complemento cs cuando estén precedidas por "cs!". El complemento cs compila el archivo coffeescript.
Cuando vas en prod, puede pre-compilar todo el proyecto con r.js .
Estos son sus requisitos:
Administre las dependencias del lado del cliente en un formato similar al package.json de npm o al component.json de bower. ¡Diferente pero TAN BUENO!
Debería tener la flexibilidad de apuntar a git repo o archivos js reales (ya sea en la web o localmente) en mi archivo dependency.json para bibliotecas menos conocidas (npm le permite apuntar a git repos). SI
Debería minificar y asignar un espacio de nombres a todas las bibliotecas en un solo archivo como ender; ese es el único archivo js que necesitaría poner en mi etiqueta de script en el lado del cliente. SÍ con r.js.
Debería tener soporte listo para usar para coffeescript como Box. SI
En el navegador puedo usar require style o headjs. SI
fuente
r.js
, ¿puedo simplemente extraer versiones no minificadas de todas las bibliotecas, o cómo debo decidir entre bibliotecas minificadas y no minificadas?http://requirejs.org/ es el que estás buscando, creo
fuente
Como @ Guillaume86, creo que el dobladillo te acercará más a donde quieres estar.
En hem, las dependencias se gestionan mediante una combinación de npm y hem. Utilice npm para instalar explícitamente todas las dependencias externas de sus proyectos. Use hem para especificar qué dependencias (tanto externas como locales) se deben unir para las operaciones del lado del cliente.
Creé un proyecto esqueleto de esto para que pueda ver cómo funcionaría esto; puede verlo en https://github.com/dsummersl/clientsidehem
Agregar dependencias
Use npm para buscar una dependencia específica y luego modifique el archivo package.json para asegurarse de que se realice un seguimiento de la dependencia en el futuro. Luego, especifique la dependencia para su aplicación en slug.json.
Por ejemplo, suponga que desea agregar la dependencia de script de café. Simplemente use npm para instalar la dependencia y guárdelo en su archivo package.json:
Suponga que desea incluir su propio módulo 'bloomfilters' y no está en el registro de npm. Puede agregarlo a su proyecto de la siguiente manera:
Módulos locales
Si desea incluir su propio café o javascript, puede hacerlo agregando esos archivos a la aplicación / carpeta. Tenga en cuenta que para exponer su script a través del método 'require' debe convertirlo en un módulo CommonJS. Es muy simple: consulte los documentos del dobladillo .
Archivos locales
Si desea incluir un código que no sea CommonJS y que no sea 'obligatorio', también puede unirlo haciendo referencia a su JavaScript personalizado o coffeescript a través de la lista 'libs' en slug.json.
CSS
Hem unirá su CSS también, si lo desea. Consulte los documentos de dobladillo .
edificio
Una vez que tenga sus dependencias en la lista, puede usar el dobladillo para unirlas todas.
Notas
Hem estaba destinado al proyecto spinejs , pero no es necesario que lo uses para eso. Ignore cualquier documento que mencione la columna vertebral como desee ...
fuente
Bueno, me sorprende que nadie haya mencionado todavía Browserify .
fuente
napa
o no? npmjs.org/package/napaEstoy bastante seguro de que Hem cumple con sus requisitos (yo uso una bifurcación personal con compiladores adicionales, jade y lápiz, es fácil de personalizar según sus necesidades). Utiliza npm para gestionar las dependencias.
fuente
Es posible que desee echar un vistazo a Yeoman , que utiliza varias técnicas para ayudarlo con sus requisitos.
Soporte integrado para CoffeeScript, Compass y más. Funciona con r.js ( RequireJS ), unittesting, etc.
En cuanto a sus requisitos:
Todas las características:
fuente
Bower puede adaptarse a sus necesidades (1) y (2) para el resto que necesite. Desde el archivo Léame:
Para instalar un paquete:
fuente
Mira el administrador de paquetes Jam . A continuación se muestra la descripción de su página de inicio.
Parece muy similar a npm en cómo funciona.
Instale el paquete como a continuación
mantener los paquetes actualizados ejecutando
Optimice los paquetes para la producción
Las dependencias de jam se pueden agregar en el
package.json
archivo.Para obtener la documentación completa, lea la documentación de Jam
fuente
Me encontré con inject.js
Algunas de las características, desde el sitio del proyecto :
fuente
Hay un par de opciones:
El componente también puede ser de interés, no administra las dependencias per se, pero le permite usar versiones cortadas de bibliotecas grandes.
fuente
Utilizo hem con npm y quería agregar algunos beneficios adicionales que creo que no estaban cubiertos hasta ahora.
hem build
menos que esté publicando una aplicación.cake
método anterior, simplemente puede vincular directamente a coffeescript desde proyectos dependientes.eco
(Coffeescript incrustado) para vistas y Stylus para CSS, y compila todo eso, junto con su Coffeescript, en un archivo JS y un archivo CSS.Aquí hay una lista básica para configurar una aplicación Spine, hem, coffeescript. Siéntase libre de ignorar las partes de la columna vertebral. De hecho, a veces utilizo
spine app
para configurar una estructura de directorio para una aplicación que no es de Spine, luego editoslug.json
para cambiar a una estructura de compilación diferente.curl http://npmjs.org/install.sh | sh
en un sistema * nix. Asumiré que está disponible desde la línea de comandos.npm install -g hem
). El desarrollo se ha ramificado últimamente, por lo que es posible que desee obtenerlo directamente de github ( https://github.com/spine/hem ), verificar una rama ynpm install -g .
en esa carpeta.npm install -g spine.app
hará que spine esté disponible como un comando globalspine app folder
hará que la columna vertebral de un proyecto llamadoapp
enfolder
, la generación de la estructura de directorios de la derecha y un montón de archivos de esqueleto para empezar.cd
a la carpeta y editedependencies.json
las bibliotecas que necesite. Agréguelos paraslug.json
que Hem sepa dónde encontrarlos también.npm link
cualquiera de sus paquetes locales en desarrollo paranode_modules
, y puede agregarlos aslug.json
para hem (ya seaindex.js
para incluirlo directamente oindex.coffee
si desea que hem lo compile).npm install .
para descargar todas las dependencias que acaba de ingresar.Si echa un vistazo a la configuración predeterminada de la columna vertebral, hay un lugar
app/lib/setup.coffee
donde se encuentranrequire
todas las bibliotecas que necesita de sus dependencias. Ejemplos:En
index.coffee
, solo tiene querequire lib/setup
cargar el controlador principal de su aplicación. Además, necesitarequire
cualquier otra clase en esos otros controladores. Puede utilizarspine controller something
ospine model something
para generar plantillas para controladores y modelos. El controlador Spine típico tiene el siguiente aspecto, utilizando nodosrequire
:El generado predeterminado
index.html
generalmente estará bien para cargar su aplicación, pero modifíquelo según sea necesario. Según sus requisitos, solo extraejs
uncss
archivo y uno , que nunca necesita modificar.css
carpeta. Es mucho más flexible que CSS :)folder
, ejecutehem server
para iniciar un servidor de hem y navegue hastalocalhost:9294
para ver su aplicación. (Si instaló hem globalmente). Tiene algunos argumentos ocultos, por ejemplo,--host 0.0.0.0
escucha en todos los puertos.Una cosa más: normalmente,
hem server
se actualizará automáticamente a medida que actualiza su código y guarda archivos, lo que hace que sea muy fácil de depurar. La ejecuciónhem build
compilará su aplicación en dos archivosapplication.js
, que está minificado yapplication.css
. Si ejecutahem server
después de esto, usará esos archivos y ya no se actualizará automáticamente. Así que no lo hagashem build
hasta que realmente necesites una versión reducida de tu aplicación para la implementación.Referencias adicionales: introducción a Spine.js y hem
fuente
Aquí hay una solución que adopta un enfoque muy diferente: empaque todos los módulos en un objeto JSON y requiera módulos leyendo y ejecutando el contenido del archivo sin solicitudes adicionales.
Implementación de demostración pura del lado del cliente: http://strd6.github.io/editor/
https://github.com/STRd6/require/blob/master/main.coffee.md
STRd6 / require depende de tener un paquete JSON disponible en tiempo de ejecución. La
require
función se genera para ese paquete. El paquete contiene todos los archivos que su aplicación podría requerir. No se realizan más solicitudes http porque el paquete agrupa todas las dependencias. Esto es lo más cerca que se puede llegar al estilo Node.js que requiere el cliente.La estructura del paquete es la siguiente:
A diferencia de Node, un paquete no conoce su nombre externo. Depende del pacakge, incluida la dependencia, nombrarlo. Esto proporciona una encapsulación completa.
Dada toda esa configuración, aquí hay una función que carga un archivo desde dentro de un paquete:
Este contexto externo proporciona alguna variable a la que tienen acceso los módulos.
Una
require
función se expone a los módulos, por lo que pueden requerir otros módulos.También se exponen propiedades adicionales, como una referencia al objeto global y algunos metadatos.
Finalmente ejecutamos el programa dentro del módulo y contexto dado.
Esta respuesta será más útil para aquellos que deseen tener un estilo sincrónico de node.js require una declaración en el navegador y no estén interesados en soluciones de carga de scripts remotos.
fuente
Consulte cartero si usa node / express en el backend.
fuente
Le sugiero que consulte el kit de herramientas del dojo que parece cumplir con la mayoría de sus requisitos. El que no estoy seguro es CoffeeScript.
dojo trabaja con módulos escritos en el formato de definición de módulo asincrónico (AMD). Tiene un sistema de compilación con paquetes y puedes agregarlos en uno o varios archivos (llamados capas). Aparentemente acepta repositorios de tipo git, más detalles sobre el sistema de compilación aquí:
http://dojotoolkit.org/documentation/tutorials/1.8/build/
Para el registro, se espera la versión beta v1.9 el próximo mes.
fuente
Otro marco que satisface todos mis criterios lanzado recientemente: http://duojs.org/ (y también admite el tratamiento de otros recursos como CSS como dependencias).
fuente
La inyección de dependencia con carga asincrónica + browserify será otra buena opción, en comparación con requirejs
gestión-de-dependencia-frontend-asincrónica-sin-AMD
fuente