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 the module.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"?

Author: Michał Perłakowski, 2016-12-22

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!

 10
Author: Max Vorobjev,
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 otro exports module.exports se establecerá además de exports["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";
 13
Author: Pritish Vaidya,
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