اذهب إلى المحتوى

السؤال

نشر

 هذا هو سير العمل الحالي الخاص بي لاستيراد الصور والأيقونات في webpack عبر 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} />

هل هناك طريقة ما لاستيراد جميع الملفات ديناميكيًا من دليل معين كملحق لاسمها ، ثم استخدام هذه الملفات حسب الحاجة.

Recommended Posts

  • 1
نشر

هذه الدالة سوف تحل المشكلة تماما

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

أو يمكنك عمل require ل static method وظيفتها استيراد للملفات داخل ملف العرض. مثل المثال التالي

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

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

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

 

  • 1
نشر

لا توجد طريقة مباشرة في ES6 لإستيراد جميع الملفات التي لديها صيغة معينة، لكن بدلًا من ذلك يمكنك أن تقوم بإستخدم require.context التي يوفرها Webpack لكي تستطيع إستيراد كل الملفات التي لديها صيغة معينة من مجلد معين، كالتالي:

const importImages = (r)=> r.keys().map(r);
const images = importImages(require.context('./', false, /\.(png|gif|jpe?g|svg)$/));

يقبل التابع require.context أربع مدخلات الأول إجباري والباقي مدخلات إختياريه، وهم كالتالي:

  • directory: المجلد الذي تريد إستيراد الملفات منه،  "./" في المثال السابق تعبر عن المجلد الحالي current directory

  • useSubdirectories: إستيراد الملفات من المجلدات الفرعية أم لا، القيمة الإفتراضية هي True أي أنه سيتم إستيراد جميع الصور من كل المجلدات الفرعية.

  • regExp: عبارة عن regular expression لكي تقوم بإستيراد الملفات التي تنطبق عليها قاعدة regEx هذه، في المثال السابق سوف يتم إستيردا كل الملفات التي لها الصيغة (png أو gif أو jpeg أو jpg أو svg) فقط.

  • mode: القيمة الإفتارضية هي 'sync'، لإستيراد الملفات بشكل متزامن.

  • 1
نشر

يمكنك القيام بذلك من خلال التابع التالي:

//importAll تعريف تابع
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']} />

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...