ওয়েবপ্যাক ফাইল-লোডার দিয়ে কীভাবে চিত্র ফাইলগুলি লোড করা যায়


141

আমি একটি প্রতিক্রিয়া প্রকল্প পরিচালনা করতে ওয়েবপ্যাকটি ব্যবহার করছি । আমি ওয়েবপ্যাকের মাধ্যমে জাভাস্ক্রিপ্টে চিত্রগুলি লোড করতে চাই । নীচে ওয়েবপ্যাক.কমফিগ.জেএস :file-loader

const webpack = require('webpack');
const path = require('path');
const NpmInstallPlugin = require('npm-install-webpack-plugin');

const PATHS = {
    react: path.join(__dirname, 'node_modules/react/dist/react.min.js'),
    app: path.join(__dirname, 'src'),
    build: path.join(__dirname, './dist')
};

module.exports = {
    entry: {
        jsx: './app/index.jsx',
    },
    output: {
        path: PATHS.build,
        filename: 'app.bundle.js',
    },
    watch: true,
    devtool: 'eval-source-map',
    relativeUrls: true,
    resolve: {
        extensions: ['', '.js', '.jsx', '.css', '.less'],
        modulesDirectories: ['node_modules'],
        alias: {
            normalize_css: __dirname + '/node_modules/normalize.css/normalize.css',
        }
    },
    module: {
        preLoaders: [

            {
                test: /\.js$/,
                loader: "source-map-loader"
            },
        ],
        loaders: [

            {
                test: /\.html$/,
                loader: 'file?name=[name].[ext]',
            },
            {
                test: /\.jsx?$/,
                exclude: /node_modules/,
                loader: 'babel-loader?presets=es2015',
            },
            {test: /\.css$/, loader: 'style-loader!css-loader'},
            {test: /\.(jpe?g|png|gif|svg)$/i, loader: "file-loader?name=/public/icons/[name].[ext]"},
            {
                test: /\.js$/,
                exclude: /node_modules/,
                loaders: ['babel-loader?presets=es2015']
            }
        ]
    },
    plugins: [
        new webpack.optimize.UglifyJsPlugin({
            compress: {
                warnings: false,
            },
            output: {
                comments: false,
            },
        }),
        new NpmInstallPlugin({
            save: true // --save
        }),
        new webpack.DefinePlugin({
            "process.env": {
                NODE_ENV: JSON.stringify("production")
            }
        }),
    ],
    devServer: {
        colors: true,
        contentBase: __dirname,
        historyApiFallback: true,
        hot: true,
        inline: true,
        port: 9091,
        progress: true,
        stats: {
            cached: false
        }
    }
}

আমি এই লাইনটি ইমেজ ফাইলগুলি লোড করতে এবং সেগুলি ডিস্ট / পাবলিক / আইকন ডিরেক্টরিতে অনুলিপি করতে এবং একই ফাইলটির নাম রাখতে ব্যবহার করেছি।

{test: /\.(jpe?g|png|gif|svg)$/i, loader: "file-loader?name=/public/icons/[name].[ext]"}

তবে এটি ব্যবহার করার সময় আমার দুটি সমস্যা আছে। আমি webpackকমান্ড চালানোর সময় , প্রত্যাশার সাথে চিত্র ফাইলটি ডিস্ট / পাবলিক / আইকন / ডিরেক্টরিতে অনুলিপি করা হয়েছিল । তবে এটি "df55075baa16f3827a57549950901e90.png" ফাইল নামের সাথে ডিস্ট ডিরেক্টরিতেও অনুলিপি করা হয়েছিল।

নীচে আমার প্রকল্প কাঠামোটি রয়েছে: এখানে চিত্র বর্ণনা লিখুন

আরেকটি সমস্যা হ'ল আমি এই চিত্র ফাইলটি আমদানির জন্য কোডের নীচে ব্যবহার করেছি তবে এটি ব্রাউজারে প্রদর্শিত হচ্ছে না। আমি যদি img ট্যাগটিতে url 'সর্বজনীন / আইকন / চিত্রদর্শন_item_normal.png' ব্যবহার করি তবে এটি দুর্দান্ত কাজ করে। কীভাবে ইমেজ ফাইল থেকে আমদানিকৃত জিনিসটি ব্যবহার করবেন?

import React, {Component} from 'react';
import {render} from 'react-dom';
import img from 'file!../../public/icons/imageview_item_normal.png'

export default class MainComponent extends Component {

  render() {
    return (
      <div style={styles.container}>
        download
        <img src={img}/>
      </div>
    )
  }

}

const styles = {
  container: {
    width: '100%',
    height: '100%',
  }
}

1
আপনি কি ইউআরএল-লোডার অপসারণের চেষ্টা করেছেন?
জাইমে

আমি ওয়েবপ্যাক কনফিগার ফাইল থেকে ইউআরএল-লোডার সরিয়েছি এবং ডিস ডিরেক্টরিটি সরিয়ে এবং ওয়েবপ্যাক কমান্ডটি পুনরায় চালু করেছি, এখনও সমস্যা আছে। ফাইলটি তৈরি করা হয়েছিল।
জো ইয়ে ঝাও

উত্তর:


196

সমস্যা সম্পর্কিত # 1

ওয়েবপ্যাক.কনফিগ-এ একবার ফাইল-লোডার কনফিগার করা হয়ে গেলে, আপনি যখনই আমদানি ব্যবহার করেন / প্রয়োজন হয় তখন এটি সমস্ত লোডারগুলির বিরুদ্ধে পাথ পরীক্ষা করে এবং যদি কোনও মিল থাকে তবে এটি সেই লোডারটির মাধ্যমে সামগ্রীগুলি পাস করে। আপনার ক্ষেত্রে এটি মিলেছে

{
    test: /\.(jpe?g|png|gif|svg)$/i, 
    loader: "file-loader?name=/public/icons/[name].[ext]"
}

এবং তাই আপনি দেখতে ইমেজ নিঃসৃত

dist/public/icons/imageview_item_normal.png

যা ছিল চাওয়া আচরণ।

আপনি হ্যাশ ফাইলের নামও পাওয়ার কারণটি হ'ল আপনি একটি অতিরিক্ত ইনলাইন ফাইল-লোডার যুক্ত করছেন। আপনি চিত্রটি আমদানি করছেন:

'file!../../public/icons/imageview_item_normal.png'.

প্রিফিক্সিং file!করে ফাইলটি আবার ফাইল-লোডারে পাস করে এবং এবার নাম কনফিগারেশন নেই।

সুতরাং আপনার আমদানি সত্যই হওয়া উচিত:

import img from '../../public/icons/imageview_item_normal.png'

হালনাগাদ

@ সিগাটিয়ান দ্বারা উল্লিখিত হিসাবে, আপনি যদি ওয়েবপ্যাক গ্লোবাল কনফিগারেশনকে উপেক্ষা করে কোনও ইনলাইন ফাইল-লোডার ব্যবহার করতে চান তবে আপনি দুটি বিস্ময়কর চিহ্ন (!!) দিয়ে আমদানির উপস্থাপন করতে পারেন:

import '!!file!../../public/icons/imageview_item_normal.png'.

সমস্যা সম্পর্কে # 2

পিএনজি আমদানির পরে, imgচলকটি কেবল ফাইল-লোডার "সম্পর্কে" জানায়, যা public/icons/[name].[ext](ওরফে "file-loader? name=/public/icons/[name].[ext]") থাকে। আপনার আউটপুট দির "ডিস" অজানা। আপনি এটি দুটি উপায়ে সমাধান করতে পারেন:

  1. আপনার সমস্ত কোড "ডিস" ফোল্ডারের অধীনে চালান
  2. publicPathআপনার আউটপুট কনফিগারেশনে সম্পত্তি যুক্ত করুন , এটি আপনার আউটপুট ডিরেক্টরিতে নির্দেশ করে (আপনার ক্ষেত্রে। / তালিকাতে)।

উদাহরণ:

output: {
  path: PATHS.build,
  filename: 'app.bundle.js',
  publicPath: PATHS.build
},

153
এটি সমগ্র ইন্টারনেটের একমাত্র ডকুমেন্ট যা বলে যে "পাবলিকপথ" ফাইল লোডার দ্বারা ব্যবহৃত ইউআরএল পরিবর্তন করবে।
টাইলার জোন্স

@ টাইলার জোনস আপনার অর্থ কি?
সাগিভ বিজি

1
@ সাগ ১ ভি, আমার মনে হয় আপনার ওয়েবপ্যাক কনফিগারেশন সহ আরও তথ্যের সাথে একটি নতুন প্রশ্ন পোস্ট করা আপনার পক্ষে ভাল
ইমের্টস

1
শুধু উত্তর যুক্ত করতে। (দয়া করে আমি এটি দরকারী হিসাবে সম্পাদনা করুন) আপনি যদি এমন একটি পরিস্থিতিতে নিজেকে খুঁজে পান যেখানে আপনি প্রয়োজনীয় বিবৃতিতে ওয়েবপ্যাক কনফিগারেশনটি বাইপাস করতে চান তবে আপনি আমদানির আগে দুটি অতিরিক্ত bangs যোগ করতে পারেনrequire('!!file-loader!wenis.png');
cgatian

2
উপরের দাবির পর থেকে ডকুমেন্টেশন ব্যাপকভাবে উন্নত হয়েছে :) - দেখুন: github.com/webpack-contrib/file-loader#options এবং পাবলিকপথের আরও তথ্য: github.com/webpack-contrib/file-loader#publicpath
পাভেলোজ

15

আমার প্রতিক্রিয়া জেএস প্রকল্পে ছবি আপলোড করার ক্ষেত্রে আমার সমস্যা ছিল। আমি ছবি লোড করতে ফাইল-লোডার ব্যবহার করার চেষ্টা করছিলাম; আমি আমার প্রতিক্রিয়াতে বাবেল-লোডারও ব্যবহার করছিলাম।

আমি ওয়েবপ্যাকটিতে নিম্নলিখিত সেটিংস ব্যবহার করেছি:

{test: /\.(jpe?g|png|gif|svg)$/i, loader: "file-loader?name=app/images/[name].[ext]"},

এটি আমার চিত্রগুলি লোড করতে সহায়তা করেছিল, তবে লোড হওয়া চিত্রগুলি এক ধরণের দূষিত ছিল। তারপরে কিছু গবেষণা করার পরে আমি জানতে পারলাম যে ব্যাবেল-লোডার ইনস্টল হওয়ার পরে ফাইল-লোডারের মধ্যে ইমেজগুলি দূষিত করার একটি বাগ রয়েছে।

সুতরাং, ইস্যুটি নিয়ে কাজ করার জন্য আমি ইউআরএল-লোডারটি ব্যবহার করার চেষ্টা করেছি যা আমার জন্য পুরোপুরি কাজ করেছিল worked

আমি আমার ওয়েবপ্যাকটি নীচের সেটিংসের সাথে আপডেট করেছি

{test: /\.(jpe?g|png|gif|svg)$/i, loader: "url-loader?name=app/images/[name].[ext]"},

আমি ইমেজগুলি আমদানি করতে নিম্নলিখিত কমান্ডটি ব্যবহার করেছি

import img from 'app/images/GM_logo_2.jpg'
<div className="large-8 columns">

      <img  style={{ width: 300, height: 150 }} src={img} />
</div>

6

প্রথমে ফাইল লোডার ইনস্টল করুন:

$ npm install file-loader --save-dev

এবং এই নিয়মটি ওয়েবপ্যাক.কনফিগ.জেজে যুক্ত করুন

           {
                test: /\.(png|jpg|gif)$/,
                use: [{
                    loader: 'file-loader',
                    options: {}
                }]
            }

5

বিকল্পভাবে আপনি একই লিখতে পারেন

{
    test: /\.(svg|png|jpg|jpeg|gif)$/,
    include: 'path of input image directory',
    use: {
        loader: 'file-loader',
        options: {
            name: '[path][name].[ext]',
            outputPath: 'path of output image directory'
        }
    }
}

এবং তারপরে সাধারণ আমদানি ব্যবহার করুন

import varName from 'relative path';

এবং জেএসএক্সে লিখুন <img src={varName} ..../>

.... অন্যান্য চিত্র বৈশিষ্ট্য জন্য


1
Jsx ধন্যবাদ @ গৌরব-পালিওয়াল দ্বারা সন্নিবেশিত চিত্রগুলির জন্য এই শেষ অংশটি খুব গুরুত্বপূর্ণ। ইমপ্যাম্পথ আমদানি ব্যবহার করে এটি সমাধানে আমাকে সহায়তা করেছিল এবং চিত্রগুলি ডিস্ট / বিল্ড ফোল্ডারে অনুলিপি করা হয়েছিল
ইব্রাহিম

1
এই outputPathকীটি আমাকে সাবফোল্ডার এবং আরও কিছুর সাথে ফাইলগুলি কোথায় স্থাপন করতে হবে তা নির্ধারণ করতে সহায়তা করেছিল। অন্যান্য উত্তর এখানে কাজ করে না। অনেক ধন্যবাদ.
থিলিসিয়াস


0

এটি আমাদের সাধারণ ভ্যু উপাদানটির আমার কাজের উদাহরণ।

<template functional>
    <div v-html="require('!!html-loader!./../svg/logo.svg')"></div>
</template>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.