ওয়েবপ্যাক ব্যবহার করে কোনও ডিরেক্টরি থেকে গতিশীল চিত্রগুলি আমদানি করুন


104

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']} />

8
আমি ঠিক এ জাতীয় দিকটি .mapপ্রত্যাশা করতে চাই যে কোনও প্রত্যাবর্তনের মান প্রত্যাশা করে। আপনার ক্ষেত্রে, এর forEachপরিবর্তে কেউ একটি ভাল ওল ব্যবহার করতে পারে ।
ব্রাম ভ্যানরোয়

4
ব্রামভানরোয় বা কেবল এটিকে ওয়ান-লাইনার তৈরি করুন এবং r.keys.().map(...)সরাসরি ফিরে
আসুন

উত্তর:


124

আমি মনে করি যে কোনও নামীকরণের সম্প্রসারণ হিসাবে একটি নির্দিষ্ট ডিরেক্টরি থেকে সমস্ত ফাইলকে গতিশীলভাবে আমদানির কোনও উপায় থাকতে হবে এবং তারপরে প্রয়োজনীয় ফাইলগুলি ব্যবহার করুন।

ES6 এ নেই। সমগ্র বিন্দু importএবং exportযে নির্ভরতা নির্ধারিত করা যেতে পারে স্ট্যাটিক্যালি , অর্থাত্ কোড নির্বাহ ছাড়া।

আপনি যেহেতু ওয়েবপ্যাক ব্যবহার করছেন তাই একবার দেখুন require.context। আপনার নিম্নলিখিতগুলি করতে সক্ষম হবেন:

function importAll(r) {
  return r.keys().map(r);
}

const images = importAll(require.context('./', false, /\.(png|jpe?g|svg)$/));

আকর্ষণীয় ... সুতরাং, আমি বর্তমানে আমার ওয়েবপ্যাক কনফিগারেশনে 'ফাইল-লোডার' ব্যবহার করছি apps সমস্ত ফাইলগুলিকে আমার অ্যাপ্লিকেশনগুলিতে একটি একক স্থানে নিয়ে যেতে। এখানে এখানে ঘটছে না। কীভাবে লোডাররা প্রয়োজনীয় কোড কনটেক্সট দিয়ে কাজ করে?
ক্লিনোর

4
"এটি এখানে ঘটছে না" আপনার অর্থ ফাইলগুলি আউটপুট ফোল্ডারে প্রদর্শিত হবে না? আপনি কি উপরের কোডটি সহ এখনও তাদের কাছে পাথ পান? আমি মনে করি না এটি সমর্থন করার জন্য বিশেষ কিছু করা দরকার ...
ফেলিক্স ক্লিং

4
কেন নিশ্চিত তা নয়, আমার লোডারটি কিনে চালানো হচ্ছে না এবং আমি আসল পথ পাচ্ছিলাম। লোডার এখন ঠিকঠাক কাজ করছে এবং সঠিক পথটি সরবরাহ করা হচ্ছে! অসাধারণ. প্রয়োজনীয়.কমটেক্সটে প্রবর্তনের জন্য ধন্যবাদ: ডি!
ক্লিনোর

4
আমার যদি তৈরি-প্রতিক্রিয়া-অ্যাপ (ক্রেট) থাকে তবে কী ব্যবহার করবেন? মধ্যে cra importAllকিছুই ফিরে আসেন।
জিওরজিম

4
এটি আমার পক্ষে কাজ করে তবে আপনি টাইপসক্রিপ্টে একই জিনিসটি কীভাবে লিখবেন? এর সঠিক প্রকারগুলি কী হবে?
ম্যাক্সিমিলিয়ান লিন্ডসে

10

এটি সহজ. আপনি এর মধ্যে require(একটি স্থিতিশীল পদ্ধতি, আমদানি কেবল গতিশীল ফাইলগুলির জন্য) ব্যবহার করতে পারেন render। নীচের উদাহরণ মত:

render() {
    const {
      someProp,
    } = this.props

    const graphImage = require('./graph-' + anyVariable + '.png')
    const tableImage = require('./table-' + anyVariable2 + '.png')

    return (
    <img src={graphImage}/>
    )
}

4
আমি মনে করি ওয়েবপ্যাক দিয়ে এই কাজটি করার জন্য আরও কাজ করা দরকার।
ফেলিক্স ক্লিং

আপনি কি এখানে আপনার ওয়েবপ্যাক কনফিগারেশন ফাইলটি পেস্ট করতে পারেন?
রবসনস্রে

4
এটি গৌরবময়। ধন্যবাদ!
Poweratom

4
আমি বিশ্বব্যাপী ব্যবহার না করার পরামর্শ দিচ্ছি ভালো প্রয়োজন - দেখুন eslint.org/docs/rules/global-require
markyph

7

আমার কাছে পিএনজি দেশীয় পতাকাগুলির ডিরেক্টরি রয়েছে যেমন নাম করা হয়েছে au.png, nl.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;

আমি এর মতো একটি ফাইল পড়েছি:

কান্ট্রিফ্ল্যাগবাইকোড.জেএস

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;

5

এই সমস্যাটি সমাধানের জন্য কার্যকরী পদ্ধতি:

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)$/)
);

ধন্যবাদ! পুরোপুরি কাজ করে!
জাকালওয়ে

4

হালনাগাদ মনে হচ্ছে আমি প্রশ্নটি বেশ বুঝতে পারি নি। @ ফেলিক্স এটি ঠিক পেয়েছে তাই তার উত্তরটি পরীক্ষা করুন। নিম্নলিখিত কোডটি কেবল একটি নোডেজ পরিবেশে কাজ করবে।

ফোল্ডারে একটি 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;

এটি আপনাকে অন্য ফাইল থেকে সমস্ত কিছু আমদানি করার অনুমতি দেবে এবং ওয়েপব্যাক এটিকে বিশ্লেষণ করবে এবং প্রয়োজনীয় ফাইলগুলি লোড করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.