Salida de un módulo ES usando webpack
Con Rollup puedo generar un módulo ES simplemente configurando la opción format
en 'es'
. ¿Cómo puedo hacer lo mismo con webpack? Si no es posible ahora, ¿webpack tiene planes de agregarlo?
Lo único que he encontrado en la documentación de para output.libraryTarget
que menciona módulos ES es este:
libraryTarget: "commonjs-module"
- Expose it using themodule.exports
object (output.library
is ignored),__esModule
is defined (it's threaded as ES2015 Module in interop mode)
Sin embargo, es bastante no me queda claro. ¿Es lo mismo que libraryTarget: "commonjs2"
con la única diferencia que __esModule
se define? ¿Qué es el "modo interop"?
2 answers
Webpack2 aún no tiene libraryTarget relevante, no genera paquetes ES6. Desde el otro lado, si usted empaqueta su biblioteca en los bundlers de CommonJS, no podrá ejecutar Tree Shaking, no pudiendo eliminar los módulos no utilizados. Eso se debe a que los módulos ES todavía se están desarrollando, por lo que nadie envía paquetes ES al navegador, mientras que webpack se usa principalmente para crear paquetes habilitados para el navegador.
Desde el otro lado, si está publicando una biblioteca, puede proporcionar CommonJS (umd) y ES objetivos, gracias a "módulo" clave en el paquete. json . En realidad no necesita webpack para publicar ES target, todo lo que necesita hacer es ejecutar babel en cada archivo para llevarlo al estándar es2015, por ejemplo, si está utilizando react puede ejecutar babel con solo el preajuste "react". Si su fuente ya es ES 2015 sin características adicionales, puede apuntar el módulo directamente a su src/index.js:
//package.json
...
"module": "src/index.js"
"main": "dist/your/library/bundle.js
...
Me pareció conveniente usar babel para manejar export v from 'mod'
instrucciones en mi índice principal.js, así que tengo 1 archivo de módulo exportando todos mis módulos. Eso se logra con babel-plugin-transform-export-extensions (también incluido en el preajuste stage-1).
Detecto este enfoque desde la biblioteca react-bootstrap, puedes ver scripts en su github (son webpack1). He mejorado un poco sus scripts en mi react-sigma repo , siéntete libre de copiar los siguientes archivos que harán lo que necesites:
config/babel.config.js
scripts/buildBabel.js
scripts/es/build.js
scripts/build.js // this is command line controller, if you need just ES you don't need it
También mira el objetivo lib (scripts/lib/build.js and .babelrc), proporciono lib transpiled módulos para que los usuarios de la biblioteca puedan incluir solo los módulos que necesitan, incluso sin especificar explícitamente require ("react-sigma / lib / Sigma/"), especialmente útil si su lib es pesada y modular!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-31 10:18:15
En primer lugar me gustaría señalar la diferencia entre el commonJS
y commonJS2
CommonJS
no soporta el uso de module.exports = function() {}
que es usado por node.js
y muchas otras implementaciones commonJS
.
Webpack2
emplea el concepto de la agrupación del código de la biblioteca y para el uso generalizado de la misma y para hacerlo compatible de trabajar en diferentes entornos utilizamos la optionlibraryTarget opción
Ahora la parte aquí responderá tanto a su preguntas
Las posibles opciones de biblioteca soportadas en webpack2
son
libraryTarget: "umd", // enum
libraryTarget: "umd-module", // ES2015 module wrapped in UMD
libraryTarget: "commonjs-module", // ES2015 module wrapped in CommonJS
libraryTarget: "commonjs2", // exported with module.exports
libraryTarget: "commonjs", // exported as properties to exports
libraryTarget: "amd", // defined with AMD defined method
libraryTarget: "this", // property set on this
libraryTarget: "var", // variable defined in root scope
Interlop tiene el siguiente significado
Para fomentar el uso de CommonJS y módulos ES6 , al exportar un
default export
sin ningún otroexports
module.exports
se establecerá además deexports["default"]
como se muestra en el siguiente ejemplo
export default test;
exports["default"] = test;
module.exports = exports["default"];
Así que, básicamente, significa que el commonJS-module
puede ser utilizado por exponer como module.exports
mediante la interloping
con ES2015 módulo envuelto en commonJS
Más información sobre el interloping
se puede encontrar en este blogpost y el stackoverflow enlace a él.
La idea básica está en ES6
las propiedades de exportación e importación en tiempo de ejecución no se pueden cambiar commonJS
esto funciona bien como el requerir cambios ocurren en tiempo de ejecución por lo tanto tiene ES2015 es entrelazado con el CommonJS.
Update
Webpack 2 da la opción de crear la biblioteca que se puede agrupar e incluir .
Si desea que su módulo se utilice en diferentes entornos , puede agruparlo como una biblioteca agregando las opciones de biblioteca y enviarlo a su entorno específico. Procedimiento mencionado en los documentos .
Otro ejemplo sencillo sobre cómo usar commonjs-module
Un punto importante a tener en cuenta aquí es babel
agrega exports.__esModule = true
a cada es6 module
y al importarlo llama a _interopRequire
para verificar esa propiedad.
__esModule = true
necesita ser configurado solo en exportación de biblioteca. Debe configurarse en el exports
del módulo de entrada . Los módulos internos no necesitan __esModule
, es solo un truco de babel.
Como se menciona en los documentos
__esModule
se define (está enhebrado como ES2015 Módulo en modo interop)
Uso como se menciona en los casos de prueba
export * from "./a";
export default "default-value";
export var b = "b";
import d from "library";
import { a, b } from "library";
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:26