0

I'm using webpack to create multiple HTML files. I need to organize my files into multiple directories because I have many files and I can't have all in the main root. In this post explain how to create multiple files using HTMLWebpackPlugin. But the structure of my project is different because I need one js and CSS file for multiple HTML files in different folders:

/
|- package.json
|- webpack.config.js
  /src
   |- index.html
   |- index.js
   |- stylesheet.css
   | /folder1
      |- htmlfile.html
      |- htmlfile1.html
      |- htmlfile2.html
      |- htmlfile3.html
   | /folder2
      |- htmlfile4.html
      |- htmlfile5.html
      |- htmlfile6.html

I set the base tag in this form.

<base href="/">

It works in development mode but when I compile my project, files and asset routes appear broken. It's only HTML files with CSS and little functionalities in javascript, so for example, if I open a file in local mode all routes are pointing to the C:// folder and not to my project folder.

I've tried to configure the publicPath in my webpack.config in this way

output: {
      publicPath: './'
},

But in this case, all files are relative to the folders. So, for example, my stylesheet is in the main root and files appear in this way [foldername]/stylesheet.css

My webpack.config.js file:

const HtmlWebPackPlugin = require('html-webpack-plugin');
const TerserJSPlugin = require('terser-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const autoprefixer = require('autoprefixer');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const path = require('path');

module.exports = (env, options) => {
  return {
    output: {
      publicPath: './',
    },
    devtool: options.mode === 'development' ? 'eval-source-map' : false,
    module: {
      rules: [
        {
          test: /\.js$/,
          exclude: /node_modules/,
          use: {
            loader: 'babel-loader'
          }
        },
        {
          test: /\.html$/,
          use: [
            {
              loader: 'html-loader',
              options: {interpolate: true} //, minimize: true 
            }
          ]
        },
        {
          test: /\.(scss|css)$/,
          use: [
            MiniCssExtractPlugin.loader,

            {
              loader: 'css-loader'
            },
            {
              loader: 'postcss-loader',
              options: {
                autoprefixer: {
                  browsers: ['last 2 versions']
                },
                plugins: () => [autoprefixer],
              }
            },
            {
              loader: 'sass-loader'
            }
          ]
        },
        {
          test: /\.(woff|woff2|eot|ttf|svg|jpg|png|gif|mp3|m4a|ico)$/,
          use: {
            loader: 'file-loader?limit=100000000',
            options: {
              name: '[path][name].[ext]',
            },
          }
        }
      ]
    },
    optimization: {
      minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})],
    },
    plugins: [
      new CleanWebpackPlugin(),
      new MiniCssExtractPlugin({
        filename: 'stylesheet.css', //[name].css
        chunkFilename: 'stylesheet.css', //[id].css
      }),
      new HtmlWebPackPlugin({
        filename: 'index.html',
        template: './src/index.html'
      }),
      new HtmlWebPackPlugin({
        filename: 'folder1/file1.html',
        template: './src/folder1/file1.html'
      }),
      new HtmlWebPackPlugin({
        filename: 'folder2/file2.html',
        template: './src/folder2/file2.html'
      }),
    ]
  };
};
6
  • Webpack config ? Commented Oct 6, 2019 at 8:57
  • Webpack.config.js file Commented Oct 6, 2019 at 12:27
  • Please paste your webpack config Commented Oct 7, 2019 at 8:56
  • I've just pasted my webpack.config.js file Commented Oct 7, 2019 at 15:23
  • 1
    Did you tried to specify __dirname for template value? template: __dirname + '/src/folder2/file2.html. Also try with various values of publicPath ( ./, /, __dirname). Also specify output.path value. I didn't checked locally and it may be not valid Commented Oct 8, 2019 at 9:10

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.