Estou usando o create-react-app. Estou tentando chamar uma imagem da minha pasta pública de um arquivo dentro do meu src/components
. Estou recebendo esta mensagem de erro.
./src/components/website_index.js Módulo não encontrado: você tentou importar ../../public/images/logo/WC-BlackonWhite.jpg que fica fora do diretório src / do projeto. As importações relativas fora de src / não são suportadas. Você pode movê-lo para dentro de src / ou adicionar um link simbólico a partir de node_modules / do projeto.
import logo from '../../public/images/logo_2016.png';
<img className="Header-logo" src={logo} alt="Logo" />
Eu li muitas coisas dizendo que você pode fazer uma importação para o caminho, mas isso ainda não está funcionando para mim. Qualquer ajuda seria muito apreciada. Sei que há muitas perguntas como essa, mas todas estão me dizendo para importar o logotipo ou a imagem, de modo que estou perdendo algo no quadro geral.
fonte
../public/images/logo_2016.png
Subiu duas vezes, primeiro na pasta de componentes e depois na pasta src.public
pasta esteja diretamente dentrosrc
dela. O seu comentário sem comentários apresenta o caminho antigo, começando com,../..
para não ter certeza de qual é o seu ponto?Respostas:
Essa é uma restrição especial adicionada pelos desenvolvedores do create-react-app. Ele é implementado
ModuleScopePlugin
para garantir que os arquivos residamsrc/
. Esse plug-in garante que as importações relativas do diretório de origem do aplicativo não cheguem fora dele.Você pode desativar esse recurso, mas somente após a
eject
operação do projeto create-react-app.A maioria dos recursos e suas atualizações estão ocultos nas partes internas do sistema create-react-app. Se você criar
eject
, não terá mais alguns recursos e sua atualização. Portanto, se você não estiver pronto para gerenciar e configurar o aplicativo incluído para configurar o webpack e assim por diante - não faça aeject
operação.Jogue de acordo com as regras existentes (vá para src). Mas agora você pode saber como remover restrições: faça
eject
e removaModuleScopePlugin
do arquivo de configuração do webpack .Desde create- react -app v0.4.0, a
NODE_PATH
variável de ambiente permite especificar um caminho para importação absoluta. E desde que a v3.0.0NODE_PATH
foi descontinuada em favor da configuraçãobaseUrl
emjsconfig.json
outsconfig.json
.A importação absoluta permite o uso
import App from 'App'
emimport App from './App'
relação ao valor especificado no URL base.Esse recurso é especificamente útil para monorepos ou outras questões de configuração, mas não para importar imagens ou qualquer outra coisa da
public
pasta.O conteúdo da
public
pasta será colocado nabuild
pasta e disponível por URL relativo. Além disso, tudo o que for importado será processado pelo webpack e também será colocado nabuild
pasta.Se você importar algo da
public
pasta, provavelmente esse item será duplicado nabuild
pasta e estará disponível por dois URLs diferentes (ou com formas diferentes de carregar), o que piorará o tamanho do download do pacote.A importação da pasta src é preferível e possui vantagens. Tudo será empacotado pelo webpack no pacote com tamanho ideal para os pedaços e para a melhor eficiência de carregamento .
Existem soluções intermediárias, a saber, o sistema de religação , que permite modificar programaticamente a configuração do webpack. Mas remover o
ModuleScopePlugin
plugin não é uma boa solução; é melhor adicionar diretórios adicionais totalmente funcionais semelhantes asrc
.Atualmente,
create-react-app
não suporta diretórios adicionais alémsrc
da pasta raiz. Isso pode ser feito usando react-app-rewire-aliasfonte
create-react-app
para quem não deseja ejetar a configuração do webpack. Pessoalmente, eu sempre ejeto, mas algumas pessoas ainda não se sentem confortáveis ao mexer com os webpacks assustadores da configuração.NODE_PATH=./src/..
o.env
arquivo. Ao fazer isso, você pode importar de fora da pasta src sem passar pela dor associada à ejeção do aplicativo.O pacote react-app-rewired pode ser usado para remover o plugin. Dessa forma, você não precisa ejetar.
Siga as etapas na página do pacote npm (instale o pacote e ative as chamadas no arquivo package.json) e use um
config-overrides.js
arquivo semelhante a este:Isso removerá o ModuleScopePlugin dos plugins usados do WebPack, mas deixará o resto como estava e remove a necessidade de ejetar.
fonte
react-app-rewired
[ github.com/arackaf/customize-craunette(customize-cra) . Então a configuração usará apenasbabelInclude([path.resolve('src'), path.resolve('../common')])
eremoveModuleScopePlugin()
.config-overrides.js
arquivo no qual poderá inserir o código.ModuleScopePlugin
plugin não é uma boa ideia. É melhor adicionar diretórios adicionais totalmente funcionais, semelhantes aosrc
uso dePara oferecer um pouco mais de informação às respostas de outras pessoas. Você tem duas opções sobre como entregar o arquivo .png ao usuário. A estrutura do arquivo deve estar de acordo com o método escolhido. As duas opções são:
Use o módulo system (
import x from y
) fornecido com o react-create-app e empacote-o com o seu JS. Coloque a imagem dentro dasrc
pasta.Sirva-o da
public
pasta e deixe o Node servir o arquivo. O create-react-app também aparentemente vem com uma variável de ambiente, por exemplo<img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
. Isso significa que você pode referenciá-lo no aplicativo React, mas ainda o veicular no Node, com o navegador solicitando-o separadamente em uma solicitação GET normal.Fonte: create-react-app
fonte
Se suas imagens estiverem na pasta pública, você deverá usar
no seu em
<img>
src
vez de importarIsso vai funcionar
fonte
<img src="...">
, não importá-lo<img src="/images/logo.png" alt="Logo" />
Você precisa entrar
WC-BlackonWhite.jpg
no seusrc
diretório. Opublic
diretório é para arquivos estáticos que serão vinculados diretamente no HTML (como o favicon), não para itens que você importará diretamente para o seu pacote.fonte
Existem algumas respostas que fornecem soluções
react-app-rewired
, mascustomize-cra
expõem umaremoveModuleScopePlugin()
API especial que é um pouco mais elegante. (É a mesma solução, mas abstraída pelocustomize-cra
pacote.)npm i --save-dev react-app-rewired customize-cra
package.json
config-overrides.js
fonte
Remova-o usando o Craco:
fonte
Essa restrição garante que todos os arquivos ou módulos (exportações) estejam dentro do
src/
diretório em que a implementação está./node_modules/react-dev-utils/ModuleScopePlugin.js
, nas seguintes linhas de código.Você pode remover esta restrição
eject
, em seguida, removerModuleScopePlugin.js
a partir do diretório.const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
de./node_modules/react-scripts/config/webpack.config.dev.js
PS: cuidado com as conseqüências de ejeção .
fonte
instale esses dois pacotes
package.json
config-overrides.js
fonte
Você não precisa ejetar, você pode modificar a
react-scripts
configuração com a biblioteca de rescriptsIsso funcionaria então:
fonte
Acho que a solução Lukas Bach para usar o react -app- rewired para modificar a configuração do webpack é um bom caminho, no entanto, não excluiria todo o ModuleScopePlugin, mas coloque na lista branca o arquivo específico que pode ser importado fora do src:
config-overrides.js
fonte
Imagem dentro da pasta pública
fonte
Se você precisar importar apenas um único arquivo, como README.md ou package.json, isso poderá ser explicitamente adicionado ao ModuleScopePlugin ()
config / paths.js
config / webpack.config.dev.js + config / webpack.config.prod.js
fonte
a melhor solução é bifurcar
react-scripts
, isso é realmente mencionado na documentação oficial, consulte: Alternativas à ejeçãofonte
Se você precisar de várias modificações, como ao usar o design de formigas , poderá combinar várias funções como esta:
fonte
Adicionando à resposta de Bartek Maciejiczek, é assim que fica com o Craco:
fonte