J'utilise create-react-app. J'essaye d'appeler une image de mon dossier public à partir d'un fichier dans mon src/components
. Je reçois ce message d'erreur.
./src/components/website_index.js Module non trouvé: Vous avez tenté d'importer ../../public/images/logo/WC-BlackonWhite.jpg qui se trouve en dehors du répertoire src / du projet. Les importations relatives en dehors de src / ne sont pas prises en charge. Vous pouvez soit le déplacer dans src /, soit y ajouter un lien symbolique à partir de node_modules / du projet.
import logo from '../../public/images/logo_2016.png';
<img className="Header-logo" src={logo} alt="Logo" />
J'ai lu beaucoup de choses disant que vous pouvez faire une importation sur le chemin, mais cela ne fonctionne toujours pas pour moi. Toute aide serait grandement appréciée. Je sais qu'il y a beaucoup de questions comme celle-ci, mais elles me disent toutes d'importer un logo ou une image si clairement qu'il me manque quelque chose dans la vue d'ensemble.
la source
../public/images/logo_2016.png
Vous êtes monté deux fois, d'abord hors du dossier des composants, puis hors du dossier src.public
dossier se trouve directement dans votresrc
dossier. Votre commentaire sans commentaire présente l'ancien chemin commençant par../..
donc vous ne savez pas quel est votre point de vue?Réponses:
Il s'agit d'une restriction spéciale ajoutée par les développeurs de create-react-app. Il est implémenté dans
ModuleScopePlugin
pour garantir que les fichiers résident danssrc/
. Ce plugin garantit que les importations relatives depuis le répertoire source de l'application n'atteignent pas en dehors de celui-ci.Vous pouvez désactiver cette fonctionnalité mais uniquement après l'
eject
opération du projet create-react-app.La plupart des fonctionnalités et ses mises à jour sont cachées dans les composants internes du système create-react-app. Si vous faites
eject
vous n'aurez plus certaines fonctionnalités et sa mise à jour. Donc, si vous n'êtes pas prêt à gérer et configurer l'application incluse pour configurer Webpack et ainsi de suite, n'effectuez pas l'eject
opération.Jouez avec les règles existantes (passez à src). Mais maintenant vous pouvez savoir comment supprimer la restriction: faire
eject
et supprimerModuleScopePlugin
du fichier de configuration Webpack .Depuis create- react -app v0.4.0, la
NODE_PATH
variable d'environnement permet de spécifier un chemin pour l'importation absolue. Et puisque la v3.0.0NODE_PATH
est obsolète au profit de la configurationbaseUrl
dejsconfig.json
outsconfig.json
.L'importation absolue permet d'utiliser à la
import App from 'App'
place parimport App from './App'
rapport à la valeur spécifiée dans l'URL de base.Cette fonctionnalité est particulièrement utile pour les monorepos ou autres questions de configuration, mais pas pour importer des images ou quoi que ce soit d'autre à partir d'un
public
dossier.Le contenu du
public
dossier sera placé dans lebuild
dossier et disponible par URL relative. De plus, tout ce qui est importé sera traité par webpack et sera également placé dans unbuild
dossier.Si vous importez quelque chose à partir d'un
public
dossier, ce dernier sera probablement dupliqué dans lebuild
dossier et sera disponible par deux URL différentes (ou avec différentes façons de charger), ce qui finira par aggraver la taille de téléchargement du package.L'importation depuis le dossier src est préférable et présente des avantages. Tout sera emballé par webpack dans le bundle avec des morceaux de taille optimale et pour une meilleure efficacité de chargement .
Il existe des solutions intermédiaires, à savoir le système rewire qui vous permet de modifier par programmation la configuration du webpack. Mais supprimer le
ModuleScopePlugin
plugin n'est pas une bonne solution; il est préférable d'ajouter des répertoires supplémentaires entièrement fonctionnels similaires àsrc
.Actuellement,
create-react-app
ne prend pas en charge les répertoires supplémentaires autres quesrc
dans le dossier racine. Cela peut être fait en utilisant react-app-rewire-aliasla source
create-react-app
pour ceux qui ne veulent pas éjecter la configuration de webpack. Personnellement, j'éjecte toujours, mais certaines personnes ne se sentent pas à l'aise encore avec une configuration intimidante de webpacks.NODE_PATH=./src/..
dans le.env
fichier. Ce faisant, vous pouvez importer depuis l'extérieur du dossier src sans passer par la douleur associée à l'éjection de votre application.Le package react-app-rewired peut être utilisé pour supprimer le plugin. De cette façon, vous n'avez pas à vous éjecter.
Suivez les étapes de la page du package npm (installez le package et retournez les appels dans le fichier package.json) et utilisez un
config-overrides.js
fichier similaire à celui-ci:Cela supprimera le ModuleScopePlugin des plugins WebPack utilisés, mais laissera le reste tel quel et supprimera la nécessité de l'éjecter.
la source
react-app-rewired
avec [ github.com/arackaf/customize-cra unity ( customize-cra) . Ensuite, la configuration utilisera justebabelInclude([path.resolve('src'), path.resolve('../common')])
etremoveModuleScopePlugin()
.config-overrides.js
fichier dans lequel vous pourrez placer le code.ModuleScopePlugin
plugin n'est pas une bonne idée. Il est préférable d'ajouter des répertoires supplémentaires entièrement fonctionnels similaires à l'src
utilisation de react-app-rewire-aliasPour offrir un peu plus d'informations aux réponses des autres. Vous avez deux options concernant la façon de fournir le fichier .png à l'utilisateur. La structure du fichier doit être conforme à la méthode choisie. Les deux options sont:
Utilisez le module system (
import x from y
) fourni avec react-create-app et associez-le à votre JS. Placez l'image dans lesrc
dossier.Servez-le à partir du
public
dossier et laissez Node servir le fichier. create-react-app est également apparemment livré avec une variable d'environnement, par exemple<img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
. Cela signifie que vous pouvez le référencer dans votre application React tout en le faisant servir via Node, votre navigateur le demandant séparément dans une requête GET normale.Source: create-react-app
la source
Si vos images sont dans le dossier public, vous devez utiliser
dans votre
<img>
src
au lieu d'importerCela fonctionnera
la source
<img src="...">
, pas de l'importer<img src="/images/logo.png" alt="Logo" />
Vous devez vous déplacer
WC-BlackonWhite.jpg
dans votresrc
répertoire. Lepublic
répertoire est destiné aux fichiers statiques qui seront liés directement dans le HTML (comme le favicon), et non aux fichiers que vous allez importer directement dans votre bundle.la source
Il y a quelques réponses qui fournissent des solutions
react-app-rewired
, mais quicustomize-cra
expose uneremoveModuleScopePlugin()
API spéciale qui est un peu plus élégante. (C'est la même solution, mais abstraite par lecustomize-cra
package.)npm i --save-dev react-app-rewired customize-cra
package.json
config-overrides.js
la source
Retirez-le en utilisant Craco:
la source
Cette restriction garantit que tous les fichiers ou modules (exportations) sont à l'intérieur du
src/
répertoire, l'implémentation est dans./node_modules/react-dev-utils/ModuleScopePlugin.js
, dans les lignes de code suivantes.Vous pouvez supprimer cette restriction en
eject
puis retirerModuleScopePlugin.js
du répertoire.const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
de./node_modules/react-scripts/config/webpack.config.dev.js
PS: attention aux conséquences de l' éjection .
la source
installez ces deux packages
package.json
config-overrides.js
la source
Vous n'avez pas besoin d'éjecter, vous pouvez modifier la
react-scripts
configuration avec la bibliothèque de rescriptsCela fonctionnerait alors:
la source
Je pense que la solution de Lukas Bach pour utiliser react-app-rewired afin de modifier la configuration de webpack est un bon moyen de procéder, cependant, je n'exclurais pas tout le ModuleScopePlugin mais mettrais plutôt en liste blanche le fichier spécifique qui peut être importé en dehors de src:
config-overrides.js
la source
Image dans le dossier public
la source
Si vous n'avez besoin d'importer qu'un seul fichier, tel que README.md ou package.json, cela peut être explicitement ajouté à ModuleScopePlugin ()
config / paths.js
config / webpack.config.dev.js + config / webpack.config.prod.js
la source
la meilleure solution est de fork
react-scripts
, cela est en fait mentionné dans la documentation officielle, voir: Alternatives à l'éjectionla source
Si vous avez besoin de plusieurs modifications, comme lors de l'utilisation de la conception de fourmis , vous pouvez combiner plusieurs fonctions comme celle-ci:
la source
Pour ajouter à la réponse de Bartek Maciejiczek, voici à quoi ça ressemble avec Craco:
la source