344 votes

La restriction d'importation de create-react-app en dehors du répertoire src

J'utilise create-react-app. J'essaye d'appeler une image de mon dossier public à partir d'un fichier dans mon application. src/components . Je reçois ce message d'erreur.

./src/components/website_index.js Module non trouvé : Vous avez tenté de d'importer le fichier ../../public/images/logo/WC-BlackonWhite.jpg qui se situe 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 à l'intérieur de src/, soit ajouter un lien symbolique à partir du répertoire 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 vers le chemin mais cela ne fonctionne toujours pas pour moi. Toute aide serait la bienvenue. Je sais qu'il y a beaucoup de questions de ce genre, mais elles me disent toutes d'importer un logo ou une image, donc il est clair que quelque chose m'échappe.

4 votes

Vous devez ../public/images/logo_2016.png Vous êtes monté deux fois, d'abord hors du dossier des composants, puis hors du dossier des src.

1 votes

./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 supportées. Vous pouvez soit le déplacer à l'intérieur de src/, soit ajouter un lien symbolique vers celui-ci à partir du node_modules/ du projet.

0 votes

Mon commentaire suppose que votre public se trouve directement dans votre src dossier. Votre commentaire sans commentaire présente l'ancien chemin commençant par ../.. Je ne vois pas où vous voulez en venir.

250voto

oklas Points 3235

Il s'agit d'une restriction spéciale ajoutée par les développeurs de create-react-app. Elle est implémentée dans ModuleScopePlugin pour s'assurer que les fichiers résident dans src/ . Ce plugin assure que les importations relatives du répertoire source de l'application n'atteignent pas l'extérieur de celui-ci.

Vous pouvez désactiver cette fonction (l'une des façons) en eject opération du projet create-react-app.

La plupart des fonctionnalités et leurs mises à jour sont cachées dans les 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 une application, y compris à configurer webpack et ainsi de suite, ne le faites pas. eject fonctionnement.

Jouer selon les règles existantes (passer au src). Mais maintenant vous pouvez savoir comment supprimer la restriction : faire eject et retirer ModuleScopePlugin à partir du fichier de configuration de webpack .


Au lieu de eject il existe des solutions intermédiaires, comme rebrancher qui vous permet de modifier de manière programmatique la configuration de webpack sans eject . Mais enlever le site ModuleScopePlugin plugin n'est pas bon - cela perd une certaine protection et n'ajoute pas certaines fonctionnalités disponibles dans src .

La meilleure façon de procéder est d'ajouter des répertoires supplémentaires entièrement fonctionnels semblables à src . Cela peut être fait en utilisant react-app-rewire-alias


Ne pas importer de public qui sera dupliqué dans le dossier build et seront disponibles par deux url différentes (ou avec différentes façons de les charger), ce qui, au final, aggrave la taille du téléchargement du paquet.

Importation depuis le src Le dossier est préférable et présente des avantages. Tout sera empaqueté par webpack dans le bundle avec des chunks taille optimale et pour meilleure efficacité de chargement .

12 votes

Si vous créez un lien symbolique dans ./src, et que vous importez à partir de là, la compilation ne fonctionne pas (le plugin babel ne transforme pas les sources dans les dossiers liés par un lien symbolique). Ainsi, avec cette restriction et l'absence de lien symbolique sous src, vous êtes effectivement placé dans une prison "sans partage de code avec d'autres projets" (à moins que vous ne choisissiez d'émigrer/de vous éjecter complètement de l'ARC).

2 votes

@VP mais l'erreur dit d'"ajouter un lien symbolique à partir du node_modules/." du projet, cela ne fonctionne pas ?

0 votes

Ils devraient créer un drapeau pour désactiver cette fonction lors de l'exécution. 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 encore à l'aise de jouer avec la configuration de webpack.

80voto

Lukas Bach Points 891

Le paquet react-app-rewired peut être utilisé pour supprimer le plugin. De cette façon, vous n'avez pas besoin de l'éjecter.

Suivez les étapes de la page du paquet npm (installez le paquet et retournez les appels dans le fichier package.json) et utilisez un fichier config-overrides.js similaire à celui-ci :

const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');

module.exports = function override(config, env) {
    config.resolve.plugins = config.resolve.plugins.filter(plugin => !(plugin instanceof ModuleScopePlugin));

    return config;
};

Cela supprimera le ModuleScopePlugin des plugins WebPack utilisés, mais laissera le reste tel quel et supprimera la nécessité d'éjecter.

10 votes

Excellente réponse. Vous pouvez exploiter davantage react-app-rewired avec [ github.com/arackaf/customize-cra\](https://github.com/arackaf/customize-cra](customize-cra)) . Ensuite, la configuration utilisera seulement babelInclude([path.resolve('src'), path.resolve('../common')]) et removeModuleScopePlugin() .

0 votes

Pouvez-vous me confirmer où je dois placer cet extrait de code ?

1 votes

@bijayshrestha Lisez le fichier readme du projet react-app-rewired, il y est expliqué comment le configurer. Pendant l'installation, vous allez créer un config-overrides.js dans lequel vous pouvez placer le code.

53voto

Abhinav bhardwaj Points 1243

Si vos images sont dans le dossier public, vous devriez utiliser

"/images/logo_2016.png"

dans votre <img> src au lieu d'importer

'../../public/images/logo_2016.png'; 

Cela va fonctionner

<img className="Header-logo" src="/images/logo_2016.png" alt="Logo" />

13 votes

Cela ne fonctionne pas pour moi. J'obtiens le même message - "en dehors du répertoire src/ du projet. Les importations relatives en dehors de src/ ne sont pas prises en charge".

4 votes

Votre réponse est correcte OMI mais j'ai pris la liberté de préciser que vous parlez du chemin d'accès en <img src="..."> et non l'importer

3 votes

C'est exactement ce que je cherchais ! J'ai simplement ajouté un dossier "images" au répertoire "src" de mon CRA, puis j'ai pu utiliser <img src="/images/logo.png" alt="Logo" />

34voto

danielgormly Points 674

Pour apporter un peu plus d'informations aux réponses des autres. Vous avez deux options concernant la façon de livrer le fichier .png à l'utilisateur. La structure du fichier doit être conforme à la méthode que vous choisissez. Les deux options sont les suivantes :

  1. Utilisez le système de modules ( import x from y ) fourni avec react-create-app et l'empaqueter avec votre JS. Placez l'image dans le fichier src dossier.

  2. Servez-la à partir du public et laisser Node servir le fichier. create-react-app est aussi apparemment livré avec une variable d'environnement, par ex. <img src={process.env.PUBLIC_URL + '/img/logo.png'} />; . Cela signifie que vous pouvez le référencer dans votre application React, mais qu'il est toujours servi par Node, votre navigateur le demandant séparément dans une requête GET normale.

Source : create-react-app

1 votes

La suggestion n°2 est exactement ce qui provoque l'erreur suivante pour moi : Module non trouvé : Vous avez tenté d'importer ./../../../public/CheersBar-Drinks-147.jpg qui se trouve en dehors du répertoire src/ du projet. Les importations relatives à l'extérieur de src/ ne sont pas prises en charge. Vous pouvez soit le déplacer à l'intérieur de src/, soit ajouter un lien symbolique vers celui-ci à partir de node_modules/ du projet.

16voto

Joe Clay Points 14166

Vous devez bouger WC-BlackonWhite.jpg dans votre src répertoire. Le site public est destiné aux fichiers statiques qui seront liés directement dans le HTML (comme le favicon), et non aux éléments que vous importerez directement dans votre paquet.

0 votes

J'ai vu d'autres personnes le faire de cette façon. C'est pourquoi j'ai pensé que c'était la bonne méthode.

0 votes

@DavidBrierton : Cette précaution pourrait avoir été ajoutée dans une version plus récente de create-react-app.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X