Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

App is up to date,but not work (I've spent more than ten hours,help me) #1470

Closed
JinJieTan opened this issue Jun 8, 2020 · 21 comments
Closed

Comments

@JinJieTan
Copy link

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"]
}


@JinJieTan
Copy link
Author

what the happen ? Is there anything I need to do? please

@theKashey
Copy link
Collaborator

Try:

  • not use module.hot.accept
  • remove AppContainer from index
  • instead of import { hot } from 'react-hot-loader'; use import { hot } from 'react-hot-loader/root';

@JinJieTan
Copy link
Author

Try:

  • not use module.hot.accept
  • remove AppContainer from index
  • instead of import { hot } from 'react-hot-loader'; use import { hot } from 'react-hot-loader/root';

I have tried,But it doesn't work.

@JinJieTan
Copy link
Author

Thanks for your help. Is there anything else I can do?

@JinJieTan
Copy link
Author

remove react-hot-loader/babel and webpack alias :@hot-loader/react-dom , The page can be partially refreshed,But the state is missing,The experience is so bad, I think I still have a problem with another pure Typescript project

@theKashey
Copy link
Collaborator

Try others solutions listed here - #1453

@JinJieTan
Copy link
Author

Try others solutions listed here - #1453

thank you ! I'll watch it now ,In other projects, I didn't have a problem with it, it was very easy to use React -hot-loader

@theKashey
Copy link
Collaborator

That's why it's not so easy to help you. Like it should work, and if it doesn't - 🤷‍♂️😭

@JinJieTan
Copy link
Author

That's why it's not so easy to help you. Like it should work, and if it doesn't - 🤷‍♂️😭

In some cases, the app is up to Date, but the interface is not updated. After I change the state, the interface is updated accordingly. What is the problem?

@JinJieTan
Copy link
Author

@theKashey

It's a very interesting phenomenon, I've prepared an example, you can see, maybe we can make it better for react-hot-loader, when I go into the todo example, if I change the code at this point, but the page doesn't change, unless I click update status, then the update will show up on the page along with the state change.

url:https://github.com/JinJieTan/mingyuanyun-fd-template

@guiyep
Copy link

guiyep commented Jun 11, 2020

I have exactly same problem with the latest version. Any idea?

@JinJieTan
Copy link
Author

I have exactly same problem with the latest version. Any idea?
You can use my project, https://github.com/JinJieTan/mingyuanyun-fd-template, but I in another project always have this problem

@theKashey
Copy link
Collaborator

The problem here but there is actually no plans to continue React-Hot-Loader development, it could be replaced by Refresh today.

@JinJieTan
Copy link
Author

The problem here but there is actually no plans to continue React-Hot-Loader development, it could be replaced by Refresh today.

https://github.com/JinJieTan/mingyuanyun-fd-template, I have already solved the problem, but in another project again this question, I have dealt with for a week, haven't solved

@JinJieTan
Copy link
Author

I have found the problem, could you please help me have a look at it? It is this file. When I change to other files, it can work as normal hot update

import React, { Fragment } from 'react';
import { Route, Switch, BrowserRouter, Redirect, RouteComponentProps } from 'dva/router';
import Layout from './layout';
import { SubscriptionAPI } from 'dva';
import Loadable from 'react-loadable';
import { Spin } from 'antd';
import OldContainer from '../routers/contract/OldContainer';
const loading = () => {
    return <Spin />;
};

const AddIntent = Loadable({
    loader: () => import('../routers/intent/add'),
    loading,
});

const AddContract = Loadable({
    loader: () => import('../routers/contract/add'),
    loading,
});
const ChangeFee = Loadable({
    loader: () => import('../routers/contract/changeFee'),
    loading,
});
const ContractDetail = Loadable({
    loader: () => import('../routers/contract/ContractDetail'),
    loading,
});
const AddPropertyContract = Loadable({
    loader: () => import('../routers/contract/add'),
    loading,
});
const PropertyContractContractDetail = Loadable({
    loader: () => import('../routers/propertyContract/ContractDetail'),
    loading,
});

const Init = Loadable({
    loader: () => import('./login'),
    loading,
});

const Home = Loadable({
    loader: () => import('./home'),
    loading,
});

class App extends React.PureComponent<RouteComponentProps & SubscriptionAPI> {
    public render() {
        const { match, location, history } = this.props;
        const params = (match || {}).params || {};
        return (
            <BrowserRouter basename="/pact">
                <Layout>
                    <OldContainer>
                        <Switch>
                            <Route
                                path="/intent/add"
                                key="/intent/add"
                                exact
                                component={() => {
                                    return (
                                        <AddIntent
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/intent/add/:room_id"
                                key="/intent/add/:room_id"
                                component={() => {
                                    return (
                                        <AddIntent
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/intent/detail/:detail_id"
                                key="/intent/detail/:detail_id"
                                component={() => {
                                    return (
                                        <AddIntent
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/intent/edit/:edit_id"
                                key="/intent/edit/:edit_id"
                                component={() => {
                                    return (
                                        <AddIntent
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/add"
                                key="/contract/add"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />

                            <Route
                                exact
                                path="/contract/detail/:detail_id"
                                key="/contract/detail/:detail_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/add/:room_id"
                                key="/contract/add/:room_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/book/:book_room_id"
                                key="/contract/book/:book_room_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/edit/:contact_id"
                                key="/contract/edit/:contact_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/lease/:lease_lease"
                                key="/contract/lease/:lease_lease"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/contractlease/:contract_lease"
                                key="/contract/contractlease/:contract_lease"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/change/:change_contract_id"
                                key="/contract/change/:change_contract_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/change-detail/:change_detail_id"
                                key="/contract/change-detail/:change_detail_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/intentRoom/:intent_room_id"
                                key="/contract/intentRoom/:intent_room_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/intent/:intent_id"
                                key="/contract/intent/:intent_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/temp/:temp_id"
                                key="/contract/temp/:temp_id"
                                component={() => {
                                    return (
                                        <AddContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/contract/change-fee/:contact_id"
                                key="/contract/change-fee/:contact_id"
                                component={() => {
                                    return (
                                        <ChangeFee
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/change/edit"
                                key="/change/edit"
                                component={() => {
                                    return (
                                        <ContractDetail
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/change/edit/:contract_id"
                                key="/change/edit/:contract_id"
                                component={() => {
                                    return (
                                        <ContractDetail
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/change/change-detail/:id/:showType"
                                key="/change/change-detail/:id/:showType"
                                component={() => {
                                    return (
                                        <ContractDetail
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/property-contract/add"
                                key="/property-contract/add"
                                component={() => {
                                    return (
                                        <AddPropertyContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/property-contract/edit/:contact_id"
                                key="/property-contract/edit/:contact_id"
                                component={() => {
                                    return (
                                        <AddPropertyContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/property-contract/temp/:temp_id"
                                key="/property-contract/temp/:temp_id"
                                component={() => {
                                    return (
                                        <AddPropertyContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/property-contract/detail/:detail_id"
                                key="/property-contract/detail/:detail_id"
                                component={() => {
                                    return (
                                        <AddPropertyContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/property-contract/contractlease/:contract_lease"
                                key="/property-contract/contractlease/:contract_lease"
                                component={() => {
                                    return (
                                        <AddPropertyContract
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/property-change/edit"
                                key="/property-change/edit"
                                component={() => {
                                    return (
                                        <PropertyContractContractDetail
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/property-change/edit/:contract_id"
                                key="/property-change/edit/:contract_id"
                                component={() => {
                                    return (
                                        <PropertyContractContractDetail
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Route
                                exact
                                path="/property-change/change-detail/:id/:showType"
                                key="/property-change/change-detail/:id/:showType"
                                component={() => {
                                    return (
                                        <PropertyContractContractDetail
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}
                            />
                            <Redirect exact from="/*" to="/contract/add" />
                        </Switch>
                    </OldContainer>
                </Layout>
            </BrowserRouter>
        );
    }
}
export default App;

@JinJieTan
Copy link
Author

I can be sure that my configuration is fine, because in this project, some of my components can, again, be introduced lazily, but some of the TSX components mixed with JS cannot be hot-updated

@JinJieTan
Copy link
Author

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!

@theKashey
Copy link
Collaborator

component={() => {
                                    return (
                                        <PropertyContractContractDetail
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}

👆 that is very bad. A full update on every update.

pretty sure you wanted to use render, not component

@JinJieTan
Copy link
Author

component={() => {
                                    return (
                                        <PropertyContractContractDetail
                                            params={params}
                                            route={match}
                                            location={location}
                                            history={history}
                                        />
                                    );
                                }}

👆 that is very bad. A full update on every update.

pretty sure you wanted to use render, not component

The problem is not here, in Render and componentDidmount

@theKashey
Copy link
Collaborator

There as well 😉. Might be another problem, but still a problem.

@JinJieTan
Copy link
Author

Thanks, React -hot-loader 666, that's great

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants