react-hot-loader: App is up to date,but not work (I've spent more than ten hours,help me)

in another pure Typescript project, I succeeded,However, in this javascript & Typescript project, I failed. App is up to Date, but the page doesn’t change

It means that I:

image

Everything seems to be working fine, but the page doesn’t change .

webpack.base.concig.js

const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
const hardSourcePlugin = require('hard-source-webpack-plugin');
const webpack = require('webpack');
const LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
const antOverride = require('../src/vendor/antd');
const config = require('../src/config');
const baseOrigin = '//rental-prod.oss-cn-hangzhou.aliyuncs.com';
const { getCssTemplate, getScriptsTemplate } = require('./utills');
const base_config = {
    entry: {
        app: ['@babel/polyfill', 'react-hot-loader/patch', path.resolve(__dirname, '../src/index.tsx')],
    },
    output: {
        filename: '[name].[hash:8].js',
        path: path.resolve(__dirname, '../dist'),
        publicPath: '/',
    },
    devtool: 'inline-source-map',
    module: {
        noParse: /jquery/,
        rules: [
            {
                oneOf: [
                    {
                        test: /\.ts(x?)$/,
                        use: [
                            {
                                loader: 'babel-loader',
                                options: {
                                    exclude: /node_modules/,
                                    include: /src/,
                                    //jsx语法
                                    presets: [
                                        [
                                            '@babel/preset-env',
                                            {
                                                modules: false,
                                                useBuiltIns: 'entry',
                                                corejs: 2, // 这里需要注意:是根据你的版本来写
                                            },
                                        ],
                                    ],
                                    cacheDirectory: true,
                                    plugins: [
                                        'lodash',
                                        '@babel/plugin-transform-runtime',
                                        //支持import 懒加载
                                        '@babel/plugin-syntax-dynamic-import',
                                        '@babel/plugin-transform-async-to-generator',
                                        // 'dva-hmr',
                                        [
                                            'import',
                                            {
                                                libraryName: 'antd',
                                                libraryDirectory: 'es',
                                                style: true, // or 'css'
                                            },
                                        ],
                                        'react-hot-loader/babel',
                                    ],
                                },
                            },
                            {
                                loader: 'awesome-typescript-loader',
                            },
                            {
                                loader: 'thread-loader',
                                // 有同样配置的 loader 会共享一个 worker 池(worker pool)
                                options: {
                                    // 产生的 worker 的数量,默认是 cpu 的核心数
                                    workers: 4,
                                },
                            },
                        ],
                    },
                    {
                        test: /\.jsx?$/,
                        exclude: /node_modules/,
                        loader: 'babel-loader',
                        options: {
                            //jsx语法
                            presets: [
                                [
                                    '@babel/preset-env',
                                    {
                                        modules: false,
                                        useBuiltIns: 'entry',
                                        corejs: 2, // 这里需要注意:是根据你的版本来写
                                    },
                                ],
                            ],
                            // cacheDirectory: true,
                            plugins: [
                                'lodash',
                                '@babel/plugin-transform-runtime',
                                //支持import 懒加载
                                '@babel/plugin-syntax-dynamic-import',
                                '@babel/plugin-transform-async-to-generator',
                                // 'dva-hmr',
                                [
                                    'import',
                                    {
                                        libraryName: 'antd',
                                        libraryDirectory: 'es',
                                        style: true, // or 'css'
                                    },
                                ],
                                'react-hot-loader/babel',
                            ],
                        },
                    },
                    {
                        test: /\.(less|css)$/,
                        use: [
                            { loader: 'style-loader' },
                            {
                                loader: 'css-loader',
                                options: {
                                    importLoaders: 1,
                                },
                            },
                            {
                                loader: 'postcss-loader',
                            },
                            {
                                loader: 'less-loader',
                                options: {
                                    javascriptEnabled: true,
                                    modifyVars: antOverride,
                                },
                            },
                        ],
                    },
                    {
                        test: /\.(png|jpg|jpeg|gif|ico)$/,
                        use: [
                            {
                                loader: 'url-loader',
                                options: {
                                    limit: 1024 * 1,
                                    outputPath: './asset/images',
                                    name: '[name].[hash:5].[ext]',
                                    pulbicPath: './dist/asset/images',
                                    esModule: false,
                                },
                            },
                        ],
                    },
                    {
                        test: /\.(ttf|eot|svg|woff|woff2)$/,
                        use: [
                            {
                                loader: 'file-loader',
                                options: {
                                    name: 'fonts/[name].[ext]',
                                },
                            },
                        ],
                    },
                ],
            },
        ],
    },
    plugins: [
        new htmlWebpackPlugin({
            template: path.resolve(__dirname, '../src/index.html'),
            // favicon: path.resolve(__dirname, '../src/assets/img/favicon.ico'),
            // filename: path.resolve(__dirname, './index.html'),
            scriptsTemplate: getScriptsTemplate(),
            cssTemplate: getCssTemplate(),
        }),
        // new hardSourcePlugin(),
        new webpack.NamedModulesPlugin(),
        new LodashModuleReplacementPlugin({ shorthands: true }),
    ],
    resolve: {
        extensions: ['.ts', '.tsx', '.js', '.jsx'],
        alias: {
            '@': path.resolve(__dirname, '../src'),
            '@c': path.resolve(__dirname, '../src/components'),
            '@m': path.resolve(__dirname, '../src/model'),
            '@s': path.resolve(__dirname, '../src/services'),
            'redux-actions': path.resolve(__dirname, '../src/libs/redux-actions'),
            // 'react-datepicker': path.resolve(__dirname, '../src/libs/react-datepicker/react-datepicker.js'),
            'redux-api-middleware': path.resolve(__dirname, '../src/middleware/api-middleware'),
            'react-dom': '@hot-loader/react-dom',
        },
    },
    optimization: {
        runtimeChunk: true,
        splitChunks: {
            chunks: 'all',
        },
    },
    node: {
        dgram: 'empty',
        fs: 'empty',
        net: 'empty',
        tls: 'empty',
        child_process: 'empty',
    },
    externals: {
        echarts: 'echarts',
        moment: 'moment',
        Paper: 'Paper',
        raphael: 'raphael',
        CountUp: 'CountUp',
        langs: 'langs',
    },
};

// module.exports = smp.wrap(base_config)
module.exports = base_config;

webpack.dev.config.js

const merge = require('webpack-merge');
const base_config = require('./webpack.base.config');
const proxyConfig = require('./proxyConfig');
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
const webpack = require('webpack');
const SpeedMeasurePlugin = require('speed-measure-webpack-plugin');
const AutoDllPlugin = require('autodll-webpack-plugin');
const path = require('path');
const HtmlIncludeAssetsPlugin = require('html-webpack-include-assets-plugin');
const htmlWebpackPlugin = require('html-webpack-plugin');
const { getCssTemplate, getScriptsTemplate } = require('./utills');
const smp = new SpeedMeasurePlugin();
const dev_config = {
    mode: 'development',
    devServer: {
        contentBase: path.resolve(__dirname, '../'),
        open: true,
        port: 8807,
        hot: true,
        https: true,
        host: 'rental-dev.test.com.cn',
        historyApiFallback: true,
        proxy: {
            '/api': {
                target: proxyConfig.target,
                changeOrigin: true,
                pathRewrite: {
                    '^/api': '',
                },
            },
            '/auth': {
                target: proxyConfig.target,
                changeOrigin: true,
                // pathRewrite: {
                //     '^/api': '',
                // },
            },
            '/common-object': {
                target: proxyConfig.target,
                changeOrigin: true,
            },
        },
        disableHostCheck: true,
    },
    plugins: [
        // new webpack.HotModuleReplacementPlugin(),
        new HtmlIncludeAssetsPlugin({
            assets: ['dll/app.dll.js'],
            append: false, 
        }),
        new webpack.DllReferencePlugin({
            manifest: require(path.join(__dirname, '../dll/app.manifest.json')),
        }),
    ],
};

// module.exports = smp.wrap(merge([base_config, dev_config]));
module.exports = merge([base_config, dev_config]);

scripts:

 "dev": "yarn &&  webpack-dev-server --hot --config config/webpack.dev.config.js --mode development",

index.tsx :

....
import App from './app';
import { AppContainer, setConfig } from 'react-hot-loader';

setConfig({
    ignoreSFC: true,
    disableHotRenderer: true,
    reloadHooks: false,
});

function renderWithHotReload(C: any) {
    app.router((obj: any) => {
        return (
            <ConfigProvider locale={zhCN}>
                <AppContainer>
                    <Provider store={store}>
                        <C
                            history={obj.history}
                            getState={obj.app._store.getState}
                            dispatch={obj.app._store.dispatch}
                        />
                    </Provider>
                </AppContainer>
            </ConfigProvider>
        );
    });
    app.start('#root');
}

//@ts-ignore
if (module.hot) {
    //@ts-ignore
    module.hot.accept(['./app'], () => {
        const get = require('./app').default;
        renderWithHotReload(get());
    });
}

renderWithHotReload(App);

....

app.tsx:

import { hot } from 'react-hot-loader';

class Component App....

export default hot(module)(App);

Here I used Reachave-Lodable, but it’s not reachadable; the same configuration is available for other projects

package.json :

        "react": "^16.12.0",
         "react-dom": "^16.12.0",
        "react-loadable": "^5.5.0",
        "react-hot-loader": "4.12.21",
        "@hot-loader/react-dom": "16.12.0",

tsconfig.json

{
    "compilerOptions": {
        "jsx": "react",
        "experimentalDecorators": true,
        "skipLibCheck": true,
        /* Basic Options */
        // "incremental": true,                   /* Enable incremental compilation */
        "target": "ES5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */,
        "module": "es2020" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */,
        // "lib": [],                             /* Specify library files to be included in the compilation. */
        "allowJs": true /* Allow javascript files to be compiled. */,
        // "checkJs": true,                       /* Report errors in .js files. */
        // "jsx": "preserve",                     /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
        // "declaration": true,                   /* Generates corresponding '.d.ts' file. */
        // "declarationMap": true,                /* Generates a sourcemap for each corresponding '.d.ts' file. */
        // "sourceMap": true,                     /* Generates corresponding '.map' file. */
        // "outFile": "./",                       /* Concatenate and emit output to single file. */
        // "outDir": "./",                        /* Redirect output structure to the directory. */
        // "rootDir": "./",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
        // "composite": true,                     /* Enable project compilation */
        // "tsBuildInfoFile": "./",               /* Specify file to store incremental compilation information */
        // "removeComments": true,                /* Do not emit comments to output. */
        // "noEmit": true,                        /* Do not emit outputs. */
        // "importHelpers": true,                 /* Import emit helpers from 'tslib'. */
        // "downlevelIteration": true,            /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
        // "isolatedModules": true,               /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
        /* Strict Type-Checking Options */
        "strict": false /* Enable all strict type-checking options. */,
        // "noImplicitAny": true,                 /* Raise error on expressions and declarations with an implied 'any' type. */
        // "strictNullChecks": true,              /* Enable strict null checks. */
        // "strictFunctionTypes": true,           /* Enable strict checking of function types. */
        // "strictBindCallApply": true,           /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
        // "strictPropertyInitialization": true,  /* Enable strict checking of property initialization in classes. */
        // "noImplicitThis": true,                /* Raise error on 'this' expressions with an implied 'any' type. */
        // "alwaysStrict": true,                  /* Parse in strict mode and emit "use strict" for each source file. */
        /* Additional Checks */
        // "noUnusedLocals": true,                /* Report errors on unused locals. */
        // "noUnusedParameters": true,            /* Report errors on unused parameters. */
        // "noImplicitReturns": true,             /* Report error when not all code paths in function return a value. */
        // "noFallthroughCasesInSwitch": true,    /* Report errors for fallthrough cases in switch statement. */
        /* Module Resolution Options */
        // "moduleResolution": "node",            /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
        "baseUrl": "./" /* Base directory to resolve non-absolute module names. */,
        // "paths": {},                           /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
        // "rootDirs": [],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
        // "typeRoots": [],                       /* List of folders to include type definitions from. */
        // "types": [],                           /* Type declaration files to be included in compilation. */
        // "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
        "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
        // "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
        // "allowUmdGlobalAccess": true,          /* Allow accessing UMD globals from modules. */
        /* Source Map Options */
        // "sourceRoot": "",                      /* Specify the location where debugger should locate TypeScript files instead of source locations. */
        // "mapRoot": "",                         /* Specify the location where debugger should locate map files instead of generated locations. */
        // "inlineSourceMap": true,               /* Emit a single file with source maps instead of having a separate file. */
        // "inlineSources": true,                 /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
        /* Experimental Options */
        // "experimentalDecorators": true,        /* Enables experimental support for ES7 decorators. */
        // "emitDecoratorMetadata": true,         /* Enables experimental support for emitting type metadata for decorators. */
        "moduleResolution": "node",
        /* Advanced Options */
        "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */,
        "paths": {
            "@/*": ["./src/*"],
            "@c/*": ["./src/components/*"],
            "@m/*": ["./src/model/*"],
            "@s/*": ["./src/services/*"],
            "react-dom": ["@hot-loader/react-dom"]
        }
    },
    "awesomeTypescriptLoaderOptions": {
        "transpileOnly": true
    },
    "exclude": ["node_modules", "dist", "static"]
}


About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 21

Most upvoted comments

All problems are solved, because I react life cycle using the arrow function, so did not respond to a hot update, recommend use my warehouse to implement hot update: https://github.com/JinJieTan/mingyuanyun-fd-template, thank you!