Saya menggunakan aplikasi create-react-app. Saya mencoba memanggil gambar dari folder publik saya dari file di dalam folder saya src/components
. Saya menerima pesan kesalahan ini.
./src/components/website_index.js Modul tidak ditemukan: Anda berusaha mengimpor ../../public/images/logo/WC-BlackonWhite.jpg yang berada di luar direktori src / direktori proyek. Impor relatif di luar src / tidak didukung. Anda dapat memindahkannya di dalam src /, atau menambahkan symlink ke sana dari node_modules proyek /.
import logo from '../../public/images/logo_2016.png';
<img className="Header-logo" src={logo} alt="Logo" />
Saya telah membaca banyak hal yang mengatakan bahwa Anda dapat melakukan impor ke jalan tetapi itu masih tidak berfungsi untuk saya. Bantuan apa pun akan sangat dihargai. Saya tahu ada banyak pertanyaan seperti ini tetapi mereka semua mengatakan kepada saya untuk mengimpor logo atau gambar sehingga jelas saya kehilangan sesuatu di gambar besar.
sumber
../public/images/logo_2016.png
Anda naik dua kali, pertama keluar dari folder komponen, lalu keluar dari folder src.public
folder Anda berada langsung di dalamsrc
folder Anda . Komentar tanpa komentar Anda menampilkan jalur lama yang dimulai dengan../..
begitu tidak yakin apa maksud Anda?Jawaban:
Ini adalah batasan khusus yang ditambahkan oleh pengembang aplikasi create-react-app. Ini diterapkan
ModuleScopePlugin
untuk memastikan file beradasrc/
. Plugin itu memastikan bahwa impor relatif dari direktori sumber aplikasi tidak mencapai di luarnya.Anda dapat menonaktifkan fitur ini tetapi hanya setelah
eject
operasi proyek create-react-app.Sebagian besar fitur dan pembaruannya disembunyikan di bagian dalam sistem create-react-app. Jika Anda membuatnya,
eject
Anda tidak akan lagi memiliki beberapa fitur dan pembaruannya. Jadi jika Anda belum siap untuk mengelola dan mengkonfigurasi aplikasi yang disertakan untuk mengkonfigurasi webpack dan sebagainya - jangan lakukaneject
operasi.Mainkan dengan aturan yang ada (pindahkan ke src). Tapi sekarang Anda bisa tahu cara menghapus pembatasan: lakukan
eject
dan hapusModuleScopePlugin
dari file konfigurasi webpack .Sejak membuat-bereaksi-aplikasi v0.4.0 yang
NODE_PATH
variabel lingkungan memungkinkan untuk menentukan path untuk impor mutlak. Dan sejak v3.0.0NODE_PATH
tidak digunakan lagi karena pengaturanbaseUrl
padajsconfig.json
atautsconfig.json
.Impor absolut memungkinkan penggunaan
import App from 'App'
alih - alihimport App from './App'
relatif terhadap nilai yang ditentukan dalam url basis.Fitur ini secara khusus berguna untuk monorepos atau pertanyaan konfigurasi lain tetapi tidak untuk mengimpor gambar atau apa pun dari
public
folder.Isi dari
public
folder akan ditempatkan dibuild
folder dan tersedia dengan url relatif. Juga, semua yang diimpor akan diproses oleh webpack dan akan ditempatkan juga dibuild
folder.Jika Anda mengimpor sesuatu dari
public
folder mungkin benda itu akan diduplikasi dalambuild
folder dan akan tersedia oleh dua url yang berbeda (atau dengan berbagai cara memuat), yang pada akhirnya memperburuk ukuran unduhan paket.Mengimpor dari folder src lebih disukai dan memiliki kelebihan. Semuanya akan dikemas oleh webpack ke bundel dengan potongan ukuran optimal dan untuk efisiensi pemuatan terbaik .
Ada solusi perantara, yaitu sistem rewire yang memungkinkan Anda untuk memodifikasi konfigurasi webpack secara terprogram. Tapi menghapus yang
ModuleScopePlugin
Plugin tidak baik sebuah solusi; lebih baik menambahkan direktori tambahan yang berfungsi penuh sepertisrc
.Saat ini,
create-react-app
tidak mendukung direktori tambahan selainsrc
di folder root. Ini dapat dilakukan dengan menggunakan react-app-rewire-aliassumber
create-react-app
untuk mereka yang tidak ingin mengeluarkan konfigurasi webpack. Secara pribadi saya selalu mengeluarkan, tetapi beberapa orang tidak merasa nyaman belum mengacaukan konfigurasi webpacks yang menakutkan.NODE_PATH=./src/..
dalam.env
file. Dengan melakukan itu, Anda dapat mengimpor dari luar folder src tanpa melalui rasa sakit yang terkait dengan mengeluarkan aplikasi Anda.Paket react-app-rewired dapat digunakan untuk menghapus plugin. Dengan cara ini Anda tidak perlu mengeluarkan.
Ikuti langkah-langkah pada halaman paket npm (instal paket dan balikkan panggilan dalam file package.json) dan gunakan
config-overrides.js
file yang mirip dengan ini:Ini akan menghapus ModuleScopePlugin dari plugin WebPack yang digunakan, tetapi biarkan sisanya seperti semula dan menghapus keharusan untuk mengeluarkan.
sumber
react-app-rewired
dengan [ github.com/arackaf/customize-cra[(customize-cra) . Maka konfigurasi akan menggunakan adilbabelInclude([path.resolve('src'), path.resolve('../common')])
danremoveModuleScopePlugin()
.config-overrides.js
file tempat Anda dapat menempatkan kode.ModuleScopePlugin
plugin bukanlah ide yang bagus . Lebih baik menambahkan direktori tambahan yang berfungsi penuh sepertisrc
menggunakan react-app-rewire-aliasUntuk menawarkan sedikit informasi lebih banyak ke jawaban orang lain. Anda memiliki dua opsi tentang cara mengirim file .png ke pengguna. Struktur file harus sesuai dengan metode yang Anda pilih. Dua opsi tersebut adalah:
Gunakan sistem modul (
import x from y
) yang disediakan dengan reaksi-buat-aplikasi dan bundel dengan JS Anda. Tempatkan gambar di dalamsrc
folder.Sajikan dari
public
folder dan biarkan Node melayani file. buat-reaksi-aplikasi juga tampaknya dilengkapi dengan variabel lingkungan mis<img src={process.env.PUBLIC_URL + '/img/logo.png'} />;
. Ini berarti Anda dapat mereferensikannya di aplikasi Bereaksi Anda tetapi masih disajikan melalui Node, dengan browser Anda memintanya secara terpisah dalam permintaan GET normal.Sumber: create-react-app
sumber
Jika gambar Anda ada di folder publik maka Anda harus menggunakan
di
<img>
src
alih-alih mengimporIni akan bekerja
sumber
<img src="...">
, bukan mengimpornya<img src="/images/logo.png" alt="Logo" />
Anda harus pindah
WC-BlackonWhite.jpg
kesrc
direktori . Thepublic
direktori untuk file statis yang akan dihubungkan langsung dalam HTML (seperti favicon), tidak hal-hal yang Anda akan mengimpor langsung ke bundel Anda.sumber
Ada beberapa jawaban yang memberikan solusi
react-app-rewired
, tetapicustomize-cra
memperlihatkanremoveModuleScopePlugin()
API khusus yang sedikit lebih elegan. (Ini solusi yang sama, tetapi disarikan olehcustomize-cra
paket.)npm i --save-dev react-app-rewired customize-cra
package.json
config-overrides.js
sumber
Hapus menggunakan Craco:
sumber
Pembatasan ini memastikan semua file atau modul (ekspor) berada di dalam
src/
direktori, implementasinya dalam./node_modules/react-dev-utils/ModuleScopePlugin.js
, dalam baris kode berikut.Anda dapat menghapus batasan ini dengan
eject
kemudian hapusModuleScopePlugin.js
dari direktori.const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
dari./node_modules/react-scripts/config/webpack.config.dev.js
PS: waspadalah terhadap konsekuensi dari eject .
sumber
instal kedua paket ini
package.json
config-overrides.js
sumber
Anda tidak perlu mengeluarkan, Anda dapat memodifikasi
react-scripts
konfigurasi dengan pustaka reskripIni akan berhasil kemudian:
sumber
Saya pikir solusi Lukas Bach untuk menggunakan reaksi-aplikasi-rewired untuk memodifikasi konfigurasi webpack adalah cara yang baik untuk pergi, namun, saya tidak akan mengecualikan seluruh ModuleScopePlugin tetapi sebaliknya memasukkan daftar putih file tertentu yang dapat diimpor di luar src:
config-overrides.js
sumber
Gambar di dalam folder publik
sumber
Jika Anda hanya perlu mengimpor satu file, seperti README.md atau package.json, maka ini dapat secara eksplisit ditambahkan ke ModuleScopePlugin ()
config / paths.js
config / webpack.config.dev.js + config / webpack.config.prod.js
sumber
solusi terbaik adalah dengan garpu
react-scripts
, ini sebenarnya disebutkan dalam dokumentasi resmi, lihat: Alternatif untuk Mengeluarkansumber
Jika Anda memerlukan banyak modifikasi, seperti saat menggunakan desain semut , Anda dapat menggabungkan beberapa fungsi seperti ini:
sumber
Menambah jawaban Bartek Maciejiczek, beginilah tampilannya dengan Craco:
sumber