Estoy creando una biblioteca de componentes React que se puede compartir.
La biblioteca contiene muchos componentes, pero es posible que el usuario final solo necesite usar algunos de ellos.
Cuando agrupa el código con Webpack (o Parcel o Rollup), crea un solo archivo con todo el código .
Por razones de rendimiento, no quiero que todo el código sea descargado por el navegador a menos que se use realmente. ¿Estoy en lo cierto al pensar que no debo agrupar los componentes? ¿Debería dejarse la agrupación al consumidor de los componentes? ¿Dejo algo más al consumidor de los componentes? ¿Acabo de transpilar el JSX y listo?
Si el mismo repositorio contiene muchos componentes diferentes, ¿qué debería estar en main.js?
imported
en el código, disminuyendo así el tamaño del paquete.Respuestas:
Esta es una respuesta extremadamente larga porque esta pregunta merece una respuesta extremadamente larga y detallada ya que la forma de "mejor práctica" es más complicada que solo una respuesta de pocas líneas.
Mantuve nuestras bibliotecas internas durante más de 3.5 años en ese tiempo. Me decidí por dos maneras, creo que las bibliotecas deberían agruparse. consumidores
Método 1: Cree un archivo index.ts con todo lo que desea exportar expuesto y el paquete acumulativo de destino en este archivo como entrada. Agrupe toda su biblioteca en un solo archivo index.js e index.css; Con dependencias externas heredadas del proyecto del consumidor para evitar la duplicación del código de la biblioteca. (esencia incluida en la parte inferior de la configuración de ejemplo)
import { Foo, Bar } from "library"
Método 2: Esto es para usuarios avanzados: cree un nuevo archivo para cada exportación y use rollup-plugin-multi-input con la opción "preserveModules: true" dependiendo de cómo el sistema css que esté usando también necesite asegurarse de que su css NO se fusiona en un solo archivo, pero que cada archivo css requiere una declaración (". css") se deja dentro del archivo de salida después del paquete y ese archivo css existe.
next-transpile-modules
paquete npm.import { Foo,Bar } from "library"
y luego con babel lo transformen en ...Tenemos múltiples configuraciones de resumen donde realmente utilizamos ambos métodos; por lo tanto, los consumidores de la biblioteca que no se preocupan por el movimiento de los árboles pueden simplemente hacer
"Foo from "library"
e importar el archivo CSS único; y para los consumidores de la biblioteca que se preocupan por la sacudida de los árboles y que solo usan CSS crítico, pueden activar nuestro complemento babel.Guía de resumen para las mejores prácticas:
ya sea que esté utilizando mecanografiado o no SIEMPRE compile con
"rollup-plugin-babel": "5.0.0-alpha.1"
Asegúrese de que su .babelrc tenga este aspecto.Y con el plugin de babel en rollup con este aspecto ...
Y su package.json parece ATLEAST así:
Y, finalmente, sus elementos externos en el rollup se ven ATLEAST así.
¿Por qué?
Finalmente, aquí hay un resumen de un archivo de configuración de resumen de salida de archivo index.js de ejemplo único. https://gist.github.com/ShanonJackson/deb65ebf5b2094b3eac6141b9c25a0e3 Donde el objetivo src / export / index.ts se ve así ...
Avíseme si tiene algún problema con babel, rollup o si tiene alguna pregunta sobre agrupación / bibliotecas.
fuente
Es posible tener archivos separados generados para cada componente. Webpack tiene esa capacidad al definir múltiples entradas y salidas. Digamos que tiene la siguiente estructura de un proyecto
El archivo de paquete web se vería así
Más información sobre "división de código" está aquí en los documentos de Webpack
Hay un solo campo en el
package.json
archivo llamadomain
, es bueno poner su valor delib/index.js
acuerdo con la estructura del proyecto anterior. Y enindex.js
archivo tienen todos los componentes exportados. En caso de que el consumidor quiera usar un solo componente, es accesible simplemente haciendoBueno, es tu desición. Descubrí que algunas bibliotecas de React se publican de forma original, otras están agrupadas. Si necesita algún proceso de compilación, defínalo y exporte la versión incluida.
Espero que todas tus preguntas sean respondidas :)
fuente
Puede dividir sus componentes como lo está haciendo lodash por sus métodos.
Lo que probablemente tenga son componentes separados que podría permitir importar por separado oa través del componente principal.
Entonces el consumidor podría importar el paquete completo
o sus partes individuales
Los consumidores crearán sus propios paquetes basados en los componentes que importen. Eso debería evitar que se descargue todo el paquete.
fuente
Debería echar un vistazo a Bit , creo que esta es una buena solución para compartir, reutilizar y visualizar componentes.
Es muy fácil de configurar. Puede instalar su biblioteca de bits o simplemente un componente con:
Luego puede importar el componente en su aplicación con:
Lo bueno es que no tiene que preocuparse por configurar Webpack y todo ese jazz. Bit incluso admite el control de versiones de sus componentes. Este ejemplo muestra un componente de reacción de la lista de títulos para que pueda ver si cumple con sus requisitos o no
fuente
Hay una configuración en webpack para crear archivos de fragmentos. Para comenzar, creará el paquete principal en varios fragmentos y lo cargará como se requiera. Si su proyecto tiene módulos bien estructurados, no cargará ningún código que no sea necesario.
fuente