ওয়েবপ্যাক ফাইল-লোডার আউটপুট [অবজেক্ট মডিউল]


40

আমি webpack ব্যবহার করছি HtmlWebpackPlugin, html-loaderএবং file-loader। আমার একটি সাধারণ প্রকল্প কাঠামো রয়েছে যাতে আমি কোনও ফ্রেমওয়ার্ক ব্যবহার করি না, তবে কেবল টাইপস্ক্রিপ্ট। সুতরাং, আমি সরাসরি আমার এইচটিএমএল কোড লিখি index.html। আমি এই এইচটিএমএল ফাইলটিকে আমার টেম্পলেট হিসাবে ব্যবহার করি HtmlWebpackPlugin

সমস্ত ওয়েবসাইট হিসাবে আমার একটি ছবি রাখতে হবে যা আমার সম্পদ ফোল্ডারে কোনও পিএনজি বোঝায়। file-loaderফাইলটি সঠিকভাবে srcট্যাগের ভিতরে নতুন ফাইলের নাম রাখা উচিত তবে যা ঘটছে তা নয়। পরিবর্তে, srcট্যাগ মান হিসাবে , আমি আছে [object Module]। আমি ধরে নিই file-loaderযে কিছু বস্তু নির্গত হয় এবং যখন এটির .toString()পদ্ধতিটি চালানো হয় তখন এটি এটির মতোই উপস্থাপিত হয়। যাইহোক, আমি দেখতে পাচ্ছি যে file-loaderফাইলটি সফলভাবে প্রক্রিয়া করেছে এবং আউটপুট পাথটিতে নতুন নামের সাথে নির্গত হয়েছে। আমি কোন ত্রুটি পাই না। এখানে আমার ওয়েবপ্যাক কনফিগারেশন এবং index.html

const projectRoot = path.resolve(__dirname, '..');

{
  entry: path.resolve(projectRoot, 'src', 'app.ts'),
  mode: 'production',
  output: {
    path: path.resolve(projectRoot, 'dist'),
    filename: 'app.bundle.js'
  },
  resolve: {
    extensions: ['.ts', '.js']
  },
  module: {
    rules: [
      {
        test: /\.html$/i,
        use: 'html-loader'
      },
      {
        test: /\.(eot|ttf|woff|woff2|svg|png)$/i,
        use: 'file-loader'
      },
      {
        test: /\.scss$/i,
        use: [
          {
            loader: MiniCssExtractPlugin.loader,
            options: {
              hmr: false
            }
          },
          {
            loader: 'css-loader',
            options: {
              sourceMap: false
            }
          },
          {
            loader: 'sass-loader',
            options: {
              sourceMap: false
            }
          }
        ]
      },
      {
        exclude: /node_modules/,
        test: /\.ts$/,
        use: 'ts-loader'
      }
    ]
  },
  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({
      template: path.resolve(projectRoot, 'src', 'index.html')
    }),
    new MiniCssExtractPlugin({
      filename: '[name].[hash].css',
      chunkFilename: '[id].[hash].css',
      ignoreOrder: false
    })
  ]
};

index.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title></title>
  </head>
  <body class="dark">
    <header>
      <nav class="navigation">
        <div class="left">
          <img src="assets/logo.png" class="logo"> <!-- This logo is output as [object Module] -->
        </div>
        <div class="right">

        </div>
      </nav>
    </header>
  </body>
</html>

প্রকল্প কাঠামো:

config/
    webpack.config.js
dist/
src/
    styles/
    assets/
        logo.png
    index.html
    app.ts

আমার প্যাকেজ.জসন নির্ভরতা সম্পাদনা করুন :

"clean-webpack-plugin": "^3.0.0",
"css-loader": "^3.2.0",
"file-loader": "^5.0.2",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.8.0",
"node-sass": "^4.13.0",
"sass-loader": "^8.0.0",
"style-loader": "^1.0.0",
"ts-loader": "^6.2.1",
"typescript": "^3.7.2",
"webpack": "^4.41.2",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.9.0"

উত্তর:


69

ফাইল-লোডার ডক্স প্রতি :

ডিফল্টরূপে, ফাইল-লোডার ইএস মডিউলগুলি সিনট্যাক্স ব্যবহার করে এমন জেএস মডিউল তৈরি করে। কিছু ক্ষেত্রে রয়েছে যেগুলিতে ইএস মডিউলগুলি ব্যবহার করা উপকারী, যেমন মডিউল কনটেন্টেশন এবং গাছ কাঁপানোর ক্ষেত্রে।

দেখে মনে হচ্ছে যে ওয়েবপ্যাকটি require()এমন কোনও বস্তুর কাছে ইএস মডিউল কলগুলিকে সমাধান করে: এটি সমতল মডিউলের {default: module}পরিবর্তে। এই আচরণটি কিছুটা বিতর্কিত এবং এই ইস্যুতে আলোচিত ।

সুতরাং, আপনার srcবৈশিষ্ট্যটি সঠিকভাবে সমাধানের জন্য, আপনাকে defaultরফতানি করা মডিউলটির সম্পত্তি অ্যাক্সেস করতে সক্ষম হতে হবে । আপনি যদি কোনও কাঠামো ব্যবহার করছেন তবে আপনার এমন কিছু করতে সক্ষম হওয়া উচিত:

<img src="require('assets/logo.png').default"/>

বিকল্পভাবে, আপনি ফাইল-লোডারের কমনজেএস মডিউল সিনট্যাক্স সক্ষম করতে পারেন, যা ওয়েবপ্যাকটি মডিউলটিতে সরাসরি সমাধান করবে। esModule:falseআপনার ওয়েবপ্যাক কনফিগারেশনে সেট করুন ।

webpack.config.js:

 {
        test: /\.(png|jpe?g|gif)$/i,
        use: [
          {
            loader: 'file-loader',
            options: {
              esModule: false,
            },
          },
        ],
      },

কাজ করেছে। তবে এটি এখনও সামান্য বিট জাদু। কেন এই ঘটনাটি সম্পর্কে আপনার যদি ধারণা থাকে তবে আপনি কী উত্তরটি দিয়ে ব্যাখ্যা করতে পারেন? ধন্যবাদ।
বোরা

@ বোরা - আরও কিছু গবেষণা এবং আপডেট উত্তর করেছেন।
stellr42

ধন্যবাদ, এটি ঠিক আমার কী দরকার
Matan Tubul

এই থেকে একটি আপডেট সময় আমাকে বিট Angular 8করতে Angular 9হিসাবে আনা file-loaderসংস্করণ থেকে 4.2.0থেকে 6.0.0require(...).defaultআমার জন্য এটি স্থির ব্যবহার ।
ebhh2001

8

esModule: falseআপনার file-loaderকনফিগারেশনে @ স্টেলর 42 এর প্রস্তাবিত ফিক্সটি হ'ল বর্তমান সময়ের সেরা কাজ।

তবে এটি আসলে একটি বাগ html-loaderযা এখানে ট্র্যাক করা হচ্ছে: https://github.com/webpack-contrib/html-loader/issues/203

দেখে মনে হচ্ছে ইএস মডিউল সমর্থন মত যোগ করা হয়েছিল file-loader, css-loaderএবং অন্যান্য বন্ধু, কিন্তু html-loaderমিস করেন।

এই বাগটি স্থির হয়ে গেলে , ইএস মডিউলগুলি কিছুটা স্বল্প সুবিধা দেয় ( ডক্সে উল্লিখিত হিসাবে ) এগুলি অপসারণ করা esModule: falseসহজভাবে আপগ্রেড করা ভাল willhtml-loader

বিকল্পভাবে, যদি (আমার মতো), আপনি এই সমস্যাটি খুঁজে পেয়েছেন কারণ আপনাকে সিএসএস (HTML এর পরিবর্তে) থেকে কোনও চিত্র লোড করতে সমস্যা হচ্ছিল , তবে ঠিক ঠিক আপগ্রেড করতে হবে css-loader, ইএস মডিউলগুলি অক্ষম করার দরকার নেই।


2

ফাইল-লোডার সংস্করণ 5.0.2 এ এটি ঘটে, পূর্ববর্তী সংস্করণ defaultসম্পত্তি কল না করে সূক্ষ্মভাবে কাজ করে


0

আমার ফাইল-লোডারটি সবেমাত্র 5.0.2 মিনিট আগে আপডেট করেছে।

আমি জানি esModule: falseপ্রস্তাবিত ফিক্স ছিল কিন্তু এটি আমার পক্ষে কার্যকর হয়নি।

আমার ফিক্সটি ছিল <img src={require('assets/logo.png').default}/>যা অদ্ভুত ছিল। প্রথমবার ব্যবহার করে .defaultকিন্তু এটি কাজ করেছিল।

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