Oto mój bieżący proces importowania obrazów i ikon w pakiecie internetowym za pośrednictwem ES6:
import cat from './images/cat1.jpg'
import cat2 from './images/cat2.svg'
import doggy from './images/doggy.png'
import turtle from './images/turtle.png'
<img src={doggy} />
To szybko się brudzi. Oto, czego chcę:
import * from './images'
<img src={doggy} />
<img src={turtle} />
Wydaje mi się, że musi istnieć sposób na dynamiczne importowanie wszystkich plików z określonego katalogu jako ich nazwy bez rozszerzenia, a następnie używanie tych plików w razie potrzeby.
Czy ktoś widział, jak to się robi, lub ma jakieś przemyślenia na temat najlepszego sposobu, aby to zrobić?
AKTUALIZACJA:
Korzystając z wybranej odpowiedzi, udało mi się to zrobić:
function importAll(r) {
let images = {};
r.keys().map((item, index) => { images[item.replace('./', '')] = r(item); });
return images;
}
const images = importAll(require.context('./images', false, /\.(png|jpe?g|svg)$/));
<img src={images['doggy.png']} />
reactjs
webpack
ecmascript-6
klinore
źródło
źródło
.map
rodzaju oczekuje wartości zwracanej. W twoim przypadkuforEach
zamiast tego użyłbyś starego dobrego .r.keys.().map(...)
bezpośrednio ...Odpowiedzi:
Nie w ES6. Cały sens
import
iexport
jest to, że można określić zależności statycznie , to znaczy bez wykonywania kodu.Ale ponieważ używasz webpacka, spójrz na
require.context
. Powinieneś być w stanie wykonać następujące czynności:function importAll(r) { return r.keys().map(r); } const images = importAll(require.context('./', false, /\.(png|jpe?g|svg)$/));
źródło
cra
importAll
zwrócony nic.To jest łatwe. Możesz użyć
require
(metoda statyczna, import jest tylko dla plików dynamicznych) wewnątrzrender
. Jak w poniższym przykładzie:render() { const { someProp, } = this.props const graphImage = require('./graph-' + anyVariable + '.png') const tableImage = require('./table-' + anyVariable2 + '.png') return ( <img src={graphImage}/> ) }
źródło
Mam katalog z flagami krajów png o nazwach au.png, nl.png itp. Mam:
index.js
const context = require.context('./png100px', true, /.png$/); const obj = {}; context.keys().forEach((key) => { const countryCode = key.split('./').pop() // remove the first 2 characters .substring(0, key.length - 6); // remove the file extension obj[countryCode] = context(key); }); export default obj;
Czytałem taki plik:
CountryFlagByCode.js
import React from 'react'; import countryFlags from './index'; const CountryFlagByCode = (countryCode) => { return ( <div> <img src={countryFlags[countryCode.toLowerCase()]} alt="country_flag" /> </div> ); }; export default CountryFlagByCode;
źródło
Funkcjonalne podejście do rozwiązania tego problemu:
const importAll = require => require.keys().reduce((acc, next) => { acc[next.replace("./", "")] = require(next); return acc; }, {}); const images = importAll( require.context("./image", false, /\.(png|jpe?g|svg)$/) );
źródło
AKTUALIZACJA Wygląda na to, że nie całkiem zrozumiałem pytanie. @Felix ma rację, więc sprawdź jego odpowiedź. Poniższy kod będzie działał tylko w środowisku Nodejs.
Dodaj
index.js
plik doimages
folderuconst testFolder = './'; const fs = require('fs'); const path = require('path') const allowedExts = [ '.png' // add any extensions you need ] const modules = {}; const files = fs.readdirSync(testFolder); if (files && files.length) { files .filter(file => allowedExts.indexOf(path.extname(file)) > -1) .forEach(file => exports[path.basename(file, path.extname(file))] = require(`./${file}`)); } module.exports = modules;
Umożliwi to zaimportowanie wszystkiego z innego pliku, a Wepback przeanalizuje go i załaduje wymagane pliki.
źródło