Estoy usando create-react-app. Estoy tratando de llamar una imagen desde mi carpeta pública desde un archivo dentro de mi src/components
. Estoy recibiendo este mensaje de error.
./src/components/website_index.js Módulo no encontrado: intentó importar ../../public/images/logo/WC-BlackonWhite.jpg que queda fuera del directorio src / del proyecto. Las importaciones relativas fuera de src / no son compatibles. Puede moverlo dentro de src / o agregarle un enlace simbólico desde los módulos_nodo / del proyecto.
import logo from '../../public/images/logo_2016.png';
<img className="Header-logo" src={logo} alt="Logo" />
He leído muchas cosas que dicen que puedes importar a la ruta, pero eso todavía no me funciona. Cualquier ayuda sería muy apreciada. Sé que hay muchas preguntas como esta, pero todas me dicen que importe el logotipo o la imagen con tanta claridad que me falta algo en el panorama general.
fuente
../public/images/logo_2016.png
Subiste dos veces, primero fuera de la carpeta de componentes, luego fuera de la carpeta src.public
carpeta está directamente dentro de susrc
carpeta. Su comentario sin comentarios presenta el camino anterior que comienza,../..
así que ¿no está seguro de cuál es su punto?Respuestas:
Esta es una restricción especial agregada por los desarrolladores de create-react-app. Se implementa
ModuleScopePlugin
para garantizar que los archivos residansrc/
. Ese complemento garantiza que las importaciones relativas del directorio de origen de la aplicación no lleguen fuera de él.Puede deshabilitar esta función, pero solo después de la
eject
operación del proyecto create-react-app.La mayoría de las funciones y sus actualizaciones están ocultas en las partes internas del sistema create-react-app. Si lo hace
eject
, ya no tendrá algunas características y su actualización. Entonces, si no está listo para administrar y configurar la aplicación incluida para configurar el paquete web, etc., no realice laeject
operación.Juega según las reglas existentes (muévete a src). Pero ahora puede saber cómo eliminar la restricción: hacer
eject
y eliminarModuleScopePlugin
del archivo de configuración del paquete web .Desde create-react-app v0.4.0, la
NODE_PATH
variable de entorno permite especificar una ruta para la importación absoluta. Y desde v3.0.0NODE_PATH
está en desuso a favor de establecerbaseUrl
enjsconfig.json
otsconfig.json
.La importación absoluta permite usar en
import App from 'App'
lugarimport App from './App'
del valor especificado en la URL base.Esta característica es específicamente útil para monorepos u otras preguntas de configuración, pero no para importar imágenes o cualquier otra cosa desde la
public
carpeta.El contenido de la
public
carpeta se colocará en labuild
carpeta y estará disponible por URL relativa. Además, todo lo importado será procesado por webpack y se colocará también en labuild
carpeta.Si importa algo de la
public
carpeta, probablemente esa cosa se duplicará en labuild
carpeta y estará disponible por dos URL diferentes (o con diferentes formas de carga), lo que finalmente empeorará el tamaño de descarga del paquete.Importar desde la carpeta src es preferible y tiene ventajas. Todo será empaquetado por paquete web con el paquete con trozos de tamaño óptimo y para la mejor eficiencia de carga .
Hay soluciones intermedias, a saber, el sistema de cableado que le permite modificar mediante programación la configuración del paquete web. Pero eliminar el
ModuleScopePlugin
complemento no es una buena solución; es mejor agregar directorios adicionales totalmente funcionales similares asrc
.Actualmente,
create-react-app
no admite directorios adicionales que no seansrc
en la carpeta raíz. Esto se puede hacer usando react-app-rewire-aliasfuente
create-react-app
para aquellos que no desean expulsar la configuración del paquete web. Personalmente, siempre me expulsan, pero algunas personas no se sienten cómodas pero juegan con la desalentadora configuración de los paquetes web.NODE_PATH=./src/..
el.env
archivo. Al hacerlo, puede importar desde fuera de la carpeta src sin pasar por el dolor asociado con la expulsión de su aplicación.El paquete react-app-rewired se puede usar para eliminar el complemento. De esta manera no tienes que expulsar.
Siga los pasos en la página del paquete npm (instale el paquete y voltee las llamadas en el archivo package.json) y use un
config-overrides.js
archivo similar a este:Esto eliminará el ModuleScopePlugin de los complementos de WebPack utilizados, pero dejará el resto como estaba y elimina la necesidad de expulsar.
fuente
react-app-rewired
con [ github.com/arackaf/customize-crafont>(customize-cra) . Entonces la configuración usará justbabelInclude([path.resolve('src'), path.resolve('../common')])
yremoveModuleScopePlugin()
.config-overrides.js
archivo en el que puede colocar el código.ModuleScopePlugin
complemento no es una buena idea. Es mejor agregar directorios adicionales que funcionen de manera similar alsrc
uso de react-app-rewire-aliasOfrecer un poco más de información a las respuestas de otros. Tiene dos opciones con respecto a cómo entregar el archivo .png al usuario. La estructura del archivo debe ajustarse al método que elija. Las dos opciones son:
Use el sistema de módulos (
import x from y
) provisto con react-create-app y combínelo con su JS. Coloque la imagen dentro de lasrc
carpeta.Servirlo desde la
public
carpeta y dejar que Node sirva el archivo. create-react-app también aparentemente viene con una variable de entorno, por ejemplo<img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
. Esto significa que puede hacer referencia a él en su aplicación React, pero aún así se puede servir a través de Node, con su navegador solicitándolo por separado en una solicitud GET normal.Fuente: create-react-app
fuente
Si sus imágenes están en la carpeta pública, entonces debe usar
en su
<img>
src
lugar de importarEsto funcionará
fuente
<img src="...">
, no importarlo<img src="/images/logo.png" alt="Logo" />
Necesita moverse
WC-BlackonWhite.jpg
a susrc
directorio. Elpublic
directorio es para archivos estáticos que se vincularán directamente en el HTML (como el favicon), no cosas que va a importar directamente en su paquete.fuente
Hay algunas respuestas que brindan soluciones
react-app-rewired
, perocustomize-cra
expone unaremoveModuleScopePlugin()
API especial que es un poco más elegante. (Es la misma solución, pero abstraída por elcustomize-cra
paquete).npm i --save-dev react-app-rewired customize-cra
package.json
config-overrides.js
fuente
Eliminarlo con Craco:
fuente
Esta restricción asegura que todos los archivos o módulos (exportaciones) estén dentro del
src/
directorio, la implementación está./node_modules/react-dev-utils/ModuleScopePlugin.js
en las siguientes líneas de código.Puede eliminar esta restricción mediante
eject
luego retireModuleScopePlugin.js
del directorio.const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
de./node_modules/react-scripts/config/webpack.config.dev.js
PD: cuidado con las consecuencias de la expulsión .
fuente
instale estos dos paquetes
package.json
config-overrides.js
fuente
No necesita expulsar, puede modificar la
react-scripts
configuración con la biblioteca de rescriptsEsto funcionaría entonces:
fuente
Creo que la solución de Lukas Bach para usar react-app- rewired para modificar la configuración del paquete web es una buena manera de hacerlo, sin embargo, no excluiría todo el ModuleScopePlugin, sino que incluiría en la lista blanca el archivo específico que se puede importar fuera de src:
config-overrides.js
fuente
Imagen dentro de la carpeta pública
fuente
Si solo necesita importar un solo archivo, como README.md o package.json, esto se puede agregar explícitamente a ModuleScopePlugin ()
config / paths.js
config / webpack.config.dev.js + config / webpack.config.prod.js
fuente
la mejor solución es bifurcar
react-scripts
, esto realmente se menciona en la documentación oficial, vea: Alternativas a la expulsiónfuente
Si necesita múltiples modificaciones, como cuando usa el diseño de hormigas , puede combinar múltiples funciones como esta:
fuente
Agregando a la respuesta de Bartek Maciejiczek, así es como se ve con Craco:
fuente