【发布时间】:2020-03-02 11:30:38
【问题描述】:
这是我的设置:
const DesktopApp = lazy(() => import(/* webpackChunkName: "DesktopApp" */'./DesktopApp'));
const MobileApp = lazy(() => import(/* webpackChunkName: "MobileApp" */'./MobileApp'));
type Props = { shouldServeMobile: boolean };
export const App = ({ shouldServeMobile }: Props): JSX.Element => (
shouldServeMobile
? (
<Suspense fallback={<AppLoading />}>
<MobileApp />
</Suspense>
) : (
<Suspense fallback={<AppLoading />}>
{/* GlobalDesktopStyle is injected in multiple places due to a bug where the
theme gets reset when lazy loading via React.Lazy + webpack */}
<GlobalDesktopStyle />
<DesktopApp />
</Suspense>
)
);
这是由具有以下配置的webpack-dev-server 加载的:
devServer: {
contentBase: paths.output.path,
// this host value allows devices on a LAN to connect to the dev server
host: '0.0.0.0',
https: true,
port: 9001,
hotOnly: true,
// lets any URL work
historyApiFallback: true,
},
plugins: [
new webpack.HotModuleReplacementPlugin()
]
现在,假设我们正在渲染
import { hot } from 'react-hot-loader/root';
// some imports omitted
const HotApp = hot(App);
ReactDOM.render(
<HotApp shouldServeMobile={true} />,
document.getElementById('root')
);
在初始加载时,这可以正常工作。 MobileApp 块下载,DesktopApp 不下载。但是,只要我更改了组件中的任何数据并且HMR 启动 - 重新加载就会下载DesktopApp 块。
这显然违背了代码拆分的目的。有谁知道如何阻止这种情况发生?
要明确:我输出了console.log(shouldServeMobile),它始终是true。另外,我在这里尝试了这个建议:Webpack-dev-server emits all chunks after every change,但它根本没有帮助。
【问题讨论】:
-
为什么你需要
react-hot-loader/root而只是使用webpackhotreloader。 ? -
@SakhiMansoor 我很确定这样反应钩子也可以热重载。设置好久了,可能记错了。代码分割是新的 - 使用这种热重载设置不是。但是是的 - 如果内存服务正确,没有它你就不能热重载钩子。
标签: reactjs webpack webpack-dev-server react-hot-loader react-suspense