webpack4 не компилирует все html файлы? - PullRequest
0 голосов
/ 04 февраля 2019

Я изначально не правильно понял суть проблемы, поправляю вопрос, чтобы точнее сформулировать проблему ...

Есть такая сборка webpack:

'use strict';
const webpack = require('webpack');
const path = require('path');
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
const HtmlWebpackPlugin = require('html-webpack-plugin');
const OptimizeCssAssetsPlugin = require('optimize-css-assets-webpack-plugin');


const minimizerBlock = {
  minimizer: [
    new UglifyJsPlugin({
      uglifyOptions: {
        warnings: false,
        parse: {},
        compress: {},
        mangle: true,
        output: null,
        toplevel: false,
        nameCache: null,
        ie8: false,
        keep_fnames: false,
      },
    }),
    new OptimizeCSSAssetsPlugin({})
  ]
}

const config = {
  entry: {
    main: './frontend/src/index.js'
  },
  output: {
    path: path.resolve(__dirname, './public'),
    filename: 'main.js'
  },
  devServer: {
    contentBase: path.join(__dirname, 'public'),
    port: 8888,
    overlay: true,
    proxy: {
      '/api': 'http://localhost:8889'
    }
  },
  module: {
    rules: [{
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.less$/,
        use: [MiniCssExtractPlugin.loader, "css-loader", "less-loader"]
      },
      {
        test: /\.scss$/,
        use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"]
      },
      {
        test: /\.sass$/,
        use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"]
      },
      //{ test: /\.(ttf|eot|woff|woff2|png|jpg|jpeg|svg|gif|webp)$/, loader: 'url-loader', },
      {
        test: /\.(png|jpg|jpeg|svg|gif|webp)$/,
        include: [
          path.resolve(__dirname, './frontend/binary/image/')
        ],
        use: [{
          loader: 'file-loader',
          options: {
            name: 'image/[name].[ext]',
          }
        }]
      },
      {
        test: /\.(eot|svg|ttf|woff|woff2)$/,
        include: [
          path.resolve(__dirname, './frontend/binary/fonts/')
        ],
        use: [{
          loader: 'file-loader',
          options: {
            name: 'fonts/[name].[ext]',
          }
        }]
      },
      {
        test: /\.(mp3)$/,
        include: [
          path.resolve(__dirname, './frontend/binary/audio/')
        ],
        use: [{
          loader: 'file-loader',
          options: {
            name: 'audio/[name].[ext]',
          }
        }]
      },
      {
        test: /\.(html)$/,
        include: [
          path.resolve(__dirname, './frontend/pages/')
        ],
        use: [{
          loader: 'file-loader',
          options: {
            name: '[path][name].[ext]',
          }
        }]
      },
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: './index.css',
    }),
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, 'frontend/src/', 'template.html'),
      filename: 'index.html',
      favicon: 'frontend/binary/image/icons/iconfinder_tech_0001_4023871.png',

    }),

  ]
};
module.exports = (env, options) => {
  let production = options.mode == 'production';
  config.devtool = production ? false : 'inline-cheap-module-source-map';
  config.optimization = production ? minimizerBlock : {};
  return config;
}

Существует файл `src folder - template.html, в котором есть такая частьмакет

 <div id="root">
   <img src="${require(`../binary/image/icons/iconfinder_tech_0001_4023871.png`)}" alt="" />
</div>

, который после компиляции webpack

перевоплощается в папку index.html in the public, я получаю этот результат

<div id="root">
  <img src="images/iconfinder_tech_0001_4023871.png" alt="" />
</div>

И все работает.

В то же время src есть папка pages с разными страницами, в которой есть один и тот же фрагмент набора

<header>
   <img src="${require(`../../../../binary/image/sheelak/0viber-image.jpg`)}" alt=""/>
</header>

и после запуска webpack папка с этими файламии вот результат

 <header>
   <img src="${require(`../../../../binary/image/sheelak/0viber-image.jpg`)}" alt=""/>
</header>

И тогда проблема require для img, которая в header неработа

получение ошибки.

Скажите, что не так с моим веб-пакетом?

Ссылкак проекту

Ответы [ 6 ]

0 голосов
/ 05 июня 2019

Вы должны использовать html-loader с включенным флагом interpolate:

       {
            test: /\.(html)$/,
            include: [
                path.resolve(__dirname, './frontend/pages/')
            ],
            use: [
                {
                    loader: 'file-loader'
                },
                {
                    loader: 'extract-loader'
                },
                {
                    loader: 'html-loader',
                    options: {
                        interpolate: true,
                    }
                }
            ],
            exclude: [
                path.resolve(__dirname, 'frontend/src/', 'template.html')
            ]
        }

Я создал pr, чтобы решить вашу проблему: https://github.com/sarnor/club/pull/1.

Также с учетом этой интерполяцииЭто уродливо, когда вы можете просто написать источник изображения, например: <img src="../../image/icons/iconfinder_tech_0001_4023871.png".

Также отметив, что ваш относительный URL-адрес указывал на неправильный каталог, вы пропустили ../ в своем URL-адресе.

0 голосов
/ 20 февраля 2019

Для использования в ваших html файлах требуются шаблоны.вам нужно включить html-loader для .html files, пока вы используете file-loader для него.что могло бы быть сделано.

, поэтому конфигурация webpack должна выглядеть примерно так:

{
  test: /\.(html)$/,
  include: [
    path.resolve(__dirname, './frontend/pages/')
  ],
  use: [{
    loader: 'html-loader',
    options: {
      name: '[path][name].[ext]',
      attrs: [':data-src']
    }
  }]
}


{
  test: /\.(png|jpg|jpeg|svg|gif|webp)$/,
  include: [
    path.resolve(__dirname, './frontend/binary/image/')
  ],
  use: [{
    loader: 'file-loader',
    options: {
      name: 'image/[name].[ext]',
    }
  }]
}

, а затем использовать require in img tag, как показано ниже:

Подробнее об этом здесь

0 голосов
/ 20 февраля 2019

У вас не проблема загрузчика, а то, как вы используете template literals.Backticks нужно обернуть ${}

<div id="root">
   <img src=`${require("../binary/image/icons/iconfinder_tech_0001_4023871.png")}` alt="" />
</div>

Точно так же вы бы получили

<header>
   <img src=`${require("../../../../binary/image/sheelak/0viber-image.jpg")}` alt=""/>
</header>
0 голосов
/ 20 февраля 2019

вы можете удалить строку ниже из конфигурации и проверить

favicon: 'frontend/binary/image/icons/iconfinder_tech_0001_4023871.png'
0 голосов
/ 18 февраля 2019

Если вы хотите узнать, когда какой загрузчик прочитал:

https://webpack.js.org/loaders/ и

(Webpack) Используя url-загрузчик или загрузчик файлов, выполнитеЯ действительно должен включить require () в мои .js для каждого статического изображения, которое я хочу включить?

здесь для изображений, я думаю, url-loader хорошо, так как он также может отображать кодирование base-64ссылки на изображения в виде изображений.

Попробуйте:

            {
                test: /\.(jpg|png|gif|eot|woff2|woff|ttf|ico|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
                loader: ["url-loader?limit=100&name=static/[name]_[hash].[ext]"]
            }

Что это будет делать?это займет любой файл типа jpg|png|gif|eot|woff2|woff|ttf|ico|svg и отправит его в папку static (может быть любым именем, также необязательным) и добавит хеш к именам.Он не только генерирует изображения и шрифты, но также ограничивает размер любого файла до 100 КБ, а также каждый раз добавляет уникальный хэш к имени статических ресурсов, гарантируя, что любое изменение изображения с таким же именем также обновит кэш.

0 голосов
/ 05 февраля 2019

Вы используете file-loader в своих html-файлах, которые, как я полагаю, не пытаются проанализировать что-либо внутри файла, он просто копирует это в выходную папку.

Я бы предложил попробоватьвместо этого используйте html-loader и посмотрите, решит ли это проблему.

В частности, вам нужно изменить этот раздел:

{
  test: /\.(html)$/,
  include: [
    path.resolve(__dirname, './frontend/pages/')
  ],
  use: [{
    loader: 'file-loader',
    options: {
      name: '[path][name].[ext]',
    }
  }]
}

, чтобы он выглядел так:

{
  test: /\.(html)$/,
  include: [
    path.resolve(__dirname, './frontend/pages/')
  ],
  use: [{
    loader: 'html-loader',
    options: {
      name: '[path][name].[ext]',
    }
  }]
}

И, возможно, установите html-загрузчик, используя:

npm i -D html-loader
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...