3

My current folder structure

- app
- build
- public
  - simulation
    - index.html
- server

I have a .html file in the public > simulation folder.

and I am opening this HTML file in an iFrame inside a React component

export default function B2BSalesSimulation(props) {
    return (<>
        <iframe title='mytitle' src={`${props.baseURl}/simulation/index.html`} width='100%' height='800px'>
            Your browser does not support simulation
        </iframe>
    </>)
}

When I run the code locally I am able to view the index file inside the iFRAME. No special routing is provided.

But when I deploy it to the server [ Build running on nginx server ]. It shows Page not found inside the iFRAME.

Snapshot on local Local

Snapshot on server

enter image description here

The URL of the iframe is the same in both cases only the host changes.

Webpack config:

/**
 * COMMON WEBPACK CONFIGURATION
 */

const path = require('path');
const webpack = require('webpack');

module.exports = options => ({
  mode: options.mode,
  entry: options.entry,
  output: Object.assign(
    {
      // Compile into js/build.js
      path: path.resolve(process.cwd(), 'build'),
      publicPath: '/',
    },
    options.output,
  ), // Merge with env dependent settings
  optimization: options.optimization,
  module: {
    rules: [
      {
        test: /\.jsx?$/, // Transform all .js and .jsx files required somewhere with Babel
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: options.babelQuery,
        },
      },
      {
        // Preprocess our own .css files
        // This is the place to add your own loaders (e.g. sass/less etc.)
        // for a list of loaders, see https://webpack.js.org/loaders/#styling
        test: /\.scss$/,
        exclude: /node_modules/,
        use: ['style-loader', 'css-loader', 'sass-loader'],
      },
      {
        // Preprocess our own .css files
        // This is the place to add your own loaders (e.g. sass/less etc.)
        // for a list of loaders, see https://webpack.js.org/loaders/#styling
        test: /\.css$/,
        exclude: /node_modules/,
        use: ['style-loader', 'css-loader'],
      },
      {
        // Preprocess 3rd party .css files located in node_modules
        test: /\.css$/,
        include: /node_modules/,
        use: ['style-loader', 'css-loader'],
      },
      {
        test: /\.(eot|otf|ttf|woff|woff2)$/,
        use: 'file-loader',
      },
      {
        test: /\.svg$/,
        use: [
          {
            loader: 'svg-url-loader',
            options: {
              // Inline files smaller than 10 kB
              limit: 10 * 1024,
              noquotes: true,
            },
          },
        ],
      },
      {
        test: /\.(jpg|png|gif)$/,
        use: [
          {
            loader: 'url-loader',
            options: {
              // Inline files smaller than 10 kB
              limit: 10 * 1024,
            },
          },
          {
            loader: 'image-webpack-loader',
            options: {
              mozjpeg: {
                enabled: false,
                // NOTE: mozjpeg is disabled as it causes errors in some Linux environments
                // Try enabling it in your environment by switching the config to:
                // enabled: true,
                // progressive: true,
              },
              gifsicle: {
                interlaced: false,
              },
              optipng: {
                optimizationLevel: 7,
              },
              pngquant: {
                quality: '65-90',
                speed: 4,
              },
            },
          },
        ],
      },
      {
        test: /\.html$/,
        use: 'html-loader',
      },
      {
        test: /\.(mp4|webm)$/,
        use: {
          loader: 'url-loader',
          options: {
            limit: 10000,
          },
        },
      },
    ],
  },
  plugins: options.plugins.concat([
    // Always expose NODE_ENV to webpack, in order to use `process.env.NODE_ENV`
    // inside your code for any environment checks; Terser will automatically
    // drop any unreachable code.
    new webpack.EnvironmentPlugin({
      NODE_ENV: 'development',
      RAZORPAY_KEY: 'XXXXXXX',
    }),
  ]),
  resolve: {
    modules: ['node_modules', 'app'],
    extensions: ['.js', '.jsx', '.react.js'],
    mainFields: ['browser', 'jsnext:main', 'main'],
  },
  devtool: options.devtool,
  target: 'web', // Make web variables accessible to webpack, e.g. window
  performance: options.performance || {},
});
souravlahoti
  • 716
  • 2
  • 8
  • 29
  • Can you inspect the build assets? Do they contain your public folder? If not, this might help: https://stackoverflow.com/questions/45578665/push-assets-folder-to-public-directory-with-webpack – David Mar 24 '23 at 18:11
  • 1
    Is the file where your nginx server expects to find it? – morganney Mar 31 '23 at 02:16

1 Answers1

0

Looks like I just needed to use Copy-Webpack-Plugin.

First installed the package

npm i copy-webpack-plugin

To copy all the assets from 'app/public/simulation' to 'dist/simulation' I just needed to add into my webpack config file:

  plugins: [
    new CopyWebpackPlugin([
      { from: 'app/public/simulation', to: 'simulation' }
    ])
  ]
souravlahoti
  • 716
  • 2
  • 8
  • 29