node.js - con - install bower windows
bower init-diferencia entre amd, es6, globals y node (3)
Inicial
Estoy usando bower init
por primera vez también.
Las opciones deben referirse a las diferentes formas de modularizar algunos códigos JavaScript:
- amd: usando AMD
define
, como requirejs. - nodo: usando Node.js
require
. - globales: usando el patrón del módulo JavaScript para exponer una variable global (como window.JQuery).
- es6: utilizando la próxima característica del módulo EcmaScript6.
En mi caso escribí un dflow módulo Node.js pero estoy usando browserify para crear un archivo dist / dflow.js que exporta una var de dflow global: así que seleccioné globales .
Otras actualizaciones
El comando que utilicé para examinar dflow como un objeto global de ventana era
browserify -s dflow -e index.js -o dist/dflow.js
Lo cambié porque prefiero usar requiere también dentro del navegador, así que ahora estoy usando
browserify -r ./index.js:dflow -o dist/dflow.js
y así cambié bower.moduleType a node en mi archivo bower.json .
La principal motivación fue que si el nombre de mi módulo tiene un guión, por ejemplo, la flow-view mi proyecto, debo camelizar el nombre global en flowView .
Este nuevo enfoque tiene otros dos beneficios:
- El nodo y la interfaz del navegador son los mismos. El uso de require tanto en el lado del cliente como en el del servidor, me permite escribir solo una vez los ejemplos de código y reutilizarlos fácilmente en ambos contextos.
- Utilizo los scripts npm y, por lo tanto, puedo aprovechar la variable
${npm_package_name}
y escribir una vez el script que utilizo para buscar.
Este es otro tema, pero realmente vale la pena que considere la utilidad del último beneficio: permítame compartir el atributo npm.scripts.browserify
que utilizo en mi package.json
"browserify": "browserify -r ./index.js:${npm_package_name} -o dist/${npm_package_name}.js"
Estoy creando mi primer componente Bower. Después de ejecutar bower init
el script me pregunta ''¿qué tipos de módulos expone este paquete?'' con estas opciones:
- amd
- es6
- globales
- nodo
¿Cuál es la diferencia entre estas opciones?
Si no lo sabes, es muy probable que los globales sean la respuesta correcta para ti.
De cualquier manera, necesitas entender:
- qué es y por qué AMD
- ¿Qué es un módulo nodejs?
- ¿Qué es ecmascript 6 y especialmente los módulos de es6?
[ACTUALIZAR]
Esta característica se introdujo muy recientemente en Bower y aún no está documentada (AFAIK). Básicamente, describe el tipo de moduleType
, que indica para qué tecnología de módulo se debe consumir el paquete (ver más arriba).
En este momento, no tiene ningún efecto aparte de establecer la propiedad moduleType
en el archivo bower.json
del paquete.
Consulte https://github.com/bower/bower/pull/934 para obtener la solicitud de extracción original.
[ACTUALIZACIÓN # 2]
Algunos puntos adicionales, para responder a los comentarios:
- En este momento, AFAIK, no se realiza ninguna validación en la propiedad
moduleType
, lo que significa que las personas técnicamente pueden usar el valor que deseen para ello, incluidos losangularjs
si se sienten inclinados a hacerlo. - El comité de Bower parece no estar interesado en la inclusión de nuevos
non-interoperable/proprietary moduleTypes
(piense en compositor, angular, etc.), lo cual es fácilmente comprensible, pero una vez más, nada realmente impide que las personas utilicen el valor demoduleType
que desean. - una excepción a la anterior es la inclusión (algo) reciente del
yui moduleType
, por lo tanto, hay "excepciones" que se deben hacer, asumiendo que son parte de un plan concertado
¿Qué haría si tuviera que crear un paquete para un administrador de paquetes no listado y publicarlo en bower?
Sería autor de un módulo es6, y utilizaría / patch es6-transpiler para generar el formato del paquete que necesito. Entonces me gustaría / y:
- pida a los chicos de la lista que incluyan la tecnología de mi paquete como una opción (basado en el hecho de que es6-transpiler como objetivo)
- publicar mi paquete incluyendo tanto la versión del módulo es6 como la versión XXX transpilada del mismo, y usar
es6
como un tipo demoduleType
Descargo de responsabilidad: no tengo experiencia en la vida real creando módulos angulares.
Solo como referencia, esto es precisamente lo que especifica Bower con respecto a los tipos de módulos:
El tipo de módulo definido en el archivo JavaScript
main
. Puede ser una o una matriz de las siguientes cadenas:
globals
: módulo de JavaScript que se agrega al espacio de nombres global, usandowindow.namespace
o la sintaxis dethis.namespace
amd
: módulo de JavaScript compatible con AMD, como RequireJS , utilizando la sintaxisdefine()
node
: módulo de JavaScript compatible con el node y CommonJS usando la sintaxis demodule.exports
es6
: módulo de JavaScript compatible con los módulos ECMAScript 6 , usandoexport
sintaxis deexport
eimport
yui
: módulo de JavaScript compatible con los módulos YUI , utilizando la sintaxisYUI.add()
Enlace relevante: https://github.com/bower/spec/blob/master/json.md#moduletype