reloadware / reloadium

Hot Reloading and Profiling for Python
https://reloadium.io
Apache License 2.0
2.74k stars 56 forks source link

Hot reloading of HTML files not working with reloadium (works fine with just webpack-dev-server and python manage.py runserver) #189

Closed antoineprobst closed 1 month ago

antoineprobst commented 2 months ago

Describe the bug*

I have a Django project that uses webpack to serve some frontend assets and for hotreloading js/css/html files. Hotreloading of HTML files work great when I run django normally. However, when I run the project using Pycharm addon of Reloadium, the hotreloading of HTML files doesn't work. The page refresh when I save, but the changes aren't displayed until I manually refresh the page.

Changes made to Python files, css files, js files still works great.

To Reproduce

Steps to reproduce the behavior:

Expected behavior

When I change the content of my HTML file and save it while using Reloadium, the change should be displayed on my webpage.

Screenshots

None

Desktop or remote (please complete the following information):**

Additional context

Some extracts of my config files that may be relevant :

start command used in package.json :

"start": "npx webpack-dev-server --config webpack/webpack.config.dev.js"

webpack.config.common.js :

const Path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
var BundleTracker = require('webpack-bundle-tracker');

module.exports = {
  entry: {
    base: Path.resolve(__dirname, '../src/scripts/base.js'),
    contact_form: Path.resolve(__dirname, '../src/scripts/contact_form.js'),
  },
  output: {
    path: Path.join(__dirname, '../build'),
    filename: 'js/[name].js',
    publicPath: '/static/',
  },
  optimization: {
    splitChunks: {
      chunks: 'all',
      name: false,//'vendors',//false,

    },
  },
  plugins: [
  new BundleTracker({
      //path: path.join(__dirname, 'frontend/'),
      filename: 'webpack-stats.json',
    }),
    new CleanWebpackPlugin(),
    new CopyWebpackPlugin({
      patterns: [{ from: Path.resolve(__dirname, '../public'), to: 'public' }],
    }),
    /*new HtmlWebpackPlugin({
      template: Path.resolve(__dirname, '../src/index.html'),
      //inject: false,
    }),*/
  ],
  resolve: {
    alias: {
      '~': Path.resolve(__dirname, '../src'),
    },
  },
  module: {
    rules: [
      {
        test: /\.mjs$/,
        include: /node_modules/,
        type: 'javascript/auto',
      },
      {
        test: /\.html$/i,
        loader: 'html-loader',
      },
      {
        test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/,
        type: 'asset'
      },
    ],
  },
};

webpack.config.dev.js :

const Webpack = require('webpack');
const { merge } = require('webpack-merge');
const ESLintPlugin = require('eslint-webpack-plugin');
const StylelintPlugin = require('stylelint-webpack-plugin');

const common = require('./webpack.common.js');

module.exports = merge(common, {
  target: 'web', 
  mode: 'development',
  devtool: 'eval-cheap-source-map', 
  output: {
    chunkFilename: 'js/[name].chunk.js',
    publicPath: 'http://localhost:9091/static/',
  },
  devServer: {
    client: {
      logging: 'error',
    },
    static:
      [{directory: Path.join(__dirname, "../public")}
      ,{directory: Path.join(__dirname, "../src/images")}
      ,{directory: Path.join(__dirname, "../../accueil/templates/accueil")}
      ,{directory: Path.join(__dirname, "../../templates")}
      ]
    ,
    compress: true,
    watchFiles: [
        //Path.join(__dirname, '../../**/*.py'),
        Path.join(__dirname, '../src/**/*.js'),
        Path.join(__dirname, '../src/**/*.scss'),
        Path.join(__dirname, '../../templates/**/*.html'),
        Path.join(__dirname, '../../accueil/templates/accueil/*.html'),
      ],

    devMiddleware: {
      writeToDisk: true,

    },
    port: 9091,
  headers: {
    "Access-Control-Allow-Origin": "*",
  }
  },
  plugins: [
    new Webpack.DefinePlugin({
      'process.env.NODE_ENV': JSON.stringify('development'),
    }),
    new ESLintPlugin({
      extensions: 'js',
      emitWarning: true,
      files: Path.resolve(__dirname, '../src'),
      fix: true,
    }),
    new StylelintPlugin({
      files: Path.join('src', '**/*.s?(a|c)ss'),
      fix: true,
    }),
  ],
  module: {
    rules: [
    /*{ //Added from default
        test: /\.html$/i,
        loader: "html-loader",
      },*/
      {
        test: /\.js$/,
        include: Path.resolve(__dirname, '../src'),
        loader: 'babel-loader',
      },
      {
        test: /\.s?css$/i,
        include: Path.resolve(__dirname, '../src'),
        use: [
          'style-loader',
          {
            loader: 'css-loader',
            options: {
              sourceMap: true,
            },
          },
          'postcss-loader',
          'sass-loader',
        ],
      },
    ],
  },
});
TheBlackTezcatlipoca commented 2 months ago

I am having similar issue using the PyCharm plugin with a Django project. Not only are changes on .html files not being picked up (though those on .py files do) but browser reload does not seem to work at all, and changes to static files (such as .html files) are not being reflected back to the browser on manual reload. While the hot reload of python code is nice, the other issues make it problematic and almost unusable.

I have confirmed that it will not pick up any changes on a file that is not of a .py extension, with further confirmation that template changes are not picked up at all on manually reload.

When using the normal run option in PyCharm everything works as expected.

Essentially all the issues describe above.

dkrystki commented 1 month ago

Fixed in 1.5.0