Итак, вот мой текущий рабочий процесс для импорта изображений и значков в веб-пакет через 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} />
Это быстро становится грязным. Вот что я хочу:
import * from './images'
<img src={doggy} />
<img src={turtle} />
Я чувствую, что должен быть какой-то способ динамически импортировать все файлы из определенного каталога в качестве их имени без расширения, а затем использовать эти файлы по мере необходимости.
Кто-нибудь видел, как это делается, или есть какие-то мысли о том, как лучше это сделать?
ОБНОВИТЬ:
Используя выбранный ответ, я смог сделать это:
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
клиноре
источник
источник
.map
такой тип ожидает возвращаемого значения. В вашем случаеforEach
вместо этого можно было бы использовать старый добрый .r.keys.().map(...)
напрямую ...Ответы:
Не в ES6. Весь смысл
import
и вexport
том, что зависимости можно определять статически , т.е. без выполнения кода.Но поскольку вы используете веб-пакет, взгляните на
require.context
. Вы должны уметь делать следующее:function importAll(r) { return r.keys().map(r); } const images = importAll(require.context('./', false, /\.(png|jpe?g|svg)$/));
источник
cra
importAll
ничего не вернул.Это просто. Вы можете использовать
require
(статический метод, импорт предназначен только для динамических файлов) внутриrender
. Как в примере ниже:render() { const { someProp, } = this.props const graphImage = require('./graph-' + anyVariable + '.png') const tableImage = require('./table-' + anyVariable2 + '.png') return ( <img src={graphImage}/> ) }
источник
У меня есть каталог флагов стран png с названиями au.png, nl.png и т. Д. Итак, у меня есть:
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;
Я читал такой файл:
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;
источник
Функциональный подход к решению этой проблемы:
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)$/) );
источник
ОБНОВЛЕНИЕ Похоже, я не совсем понял вопрос. @ Феликс понял все правильно, так что проверьте его ответ. Следующий код будет работать только в среде Nodejs.
Добавить
index.js
файл вimages
папкуconst 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;
Это позволит вам импортировать все из другого файла, а Wepback проанализирует его и загрузит необходимые файлы.
источник