ES6を介してwebpackに画像とアイコンをインポートする現在のワークフローは次のとおりです。
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']} />
特定のディレクトリからすべてのファイルを名前の拡張子として動的にインポートし、必要に応じてそれらのファイルを使用する何らかの方法が必要だと思います。
ES6ではありません。 import
とexport
のポイントは、依存関係を静的に、つまりコードを実行せずに決定できることです。
しかし、webpackを使用しているので、 require.context
を見てください。次のことができるはずです。
function importAll(r) {
return r.keys().map(r);
}
const images = importAll(require.context('./', false, /\.(png|jpe?g|svg)$/));
それは簡単です。 require
内でrender
(静的メソッド、インポートは動的ファイル専用)を使用できます。以下の例のように:
render() {
const {
someProp,
} = this.props
const graphImage = require('./graph-' + anyVariable + '.png')
const tableImage = require('./table-' + anyVariable2 + '.png')
return (
<img src={graphImage}/>
)
}
UPDATE質問をよく理解していないようです。 @Felixが正解だったので、彼の答えを確認してください。次のコードは、Nodejs環境でのみ機能します。
images
フォルダーにindex.js
ファイルを追加します
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はそれを解析して必要なファイルをロードします。
Au.png、nl.pngなどの名前のpng国旗のディレクトリがあります。
-svg-country-flags
--png100px
---au.png
---au.png
--index.js
--CountryFlagByCode.js
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)$/)
);