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.pngSubiste dos veces, primero fuera de la carpeta de componentes, luego fuera de la carpeta src.publiccarpeta está directamente dentro de susrccarpeta. 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
ModuleScopePluginpara 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
ejectoperació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 laejectoperación.Juega según las reglas existentes (muévete a src). Pero ahora puede saber cómo eliminar la restricción: hacer
ejecty eliminarModuleScopePlugindel archivo de configuración del paquete web .Desde create-react-app v0.4.0, la
NODE_PATHvariable de entorno permite especificar una ruta para la importación absoluta. Y desde v3.0.0NODE_PATHestá en desuso a favor de establecerbaseUrlenjsconfig.jsonotsconfig.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
publiccarpeta.El contenido de la
publiccarpeta se colocará en labuildcarpeta y estará disponible por URL relativa. Además, todo lo importado será procesado por webpack y se colocará también en labuildcarpeta.Si importa algo de la
publiccarpeta, probablemente esa cosa se duplicará en labuildcarpeta 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
ModuleScopePlugincomplemento no es una buena solución; es mejor agregar directorios adicionales totalmente funcionales similares asrc.Actualmente,
create-react-appno admite directorios adicionales que no seansrcen la carpeta raíz. Esto se puede hacer usando react-app-rewire-aliasfuente
create-react-apppara 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.envarchivo. 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.jsarchivo 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-rewiredcon [ github.com/arackaf/customize-crafont>(customize-cra) . Entonces la configuración usará justbabelInclude([path.resolve('src'), path.resolve('../common')])yremoveModuleScopePlugin().config-overrides.jsarchivo en el que puede colocar el código.ModuleScopePlugincomplemento no es una buena idea. Es mejor agregar directorios adicionales que funcionen de manera similar alsrcuso 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 lasrccarpeta.Servirlo desde la
publiccarpeta 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>srclugar de importarEsto funcionará
fuente
<img src="...">, no importarlo<img src="/images/logo.png" alt="Logo" />Necesita moverse
WC-BlackonWhite.jpga susrcdirectorio. Elpublicdirectorio 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-craexpone unaremoveModuleScopePlugin()API especial que es un poco más elegante. (Es la misma solución, pero abstraída por elcustomize-crapaquete).npm i --save-dev react-app-rewired customize-crapackage.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.jsen las siguientes líneas de código.Puede eliminar esta restricción mediante
ejectluego retireModuleScopePlugin.jsdel directorio.const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');de./node_modules/react-scripts/config/webpack.config.dev.jsPD: 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-scriptsconfiguració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