响应未在动态路由上加载的惰性组件
React lazy components not loaded on dynamic routes
我在动态路由上使用了 react lazy 和 suspense,但不知何故我无法渲染延迟加载的组件。
我已经搜索过 lazy 在路由上的使用,但我还没有看到有人在 dynamic(localhost:8080/dynamic/ 上使用它动态) 路线。
我可以在动态路由上加载组件,如果我有静态路由,延迟加载也可以,但是当我尝试将两者结合使用时,组件不会加载。
这是我所做的一个例子,
import Loader from './path/toFile';
import Home from './path/toFile';
const LazyLoadedComponent = lazy(() => import('./path/toFile'));
const App = () => {
return(
<Router>
<Switch>
// Home has multiple views controlled by buttons
// A view contains selections with corresponding id
<Route exact path="/:viewType?" component={Home} />
// this component doesn't load when I select something which links me to this dynamic route.
<Suspense fallback={Loader}>
<Route path="/viewType/:selectionId" component={LazyLoadedComponent} />
</Suspense>
</Switch>
</Router>
)
}
我只想在我转到那条路线后加载我的组件。
但是结果是它加载了主页但是当我 select 一个来自 selection 时它只显示 index.html 空白
我还没有看到产生任何错误。
尝试this,
<Suspense fallback={Loader}>
<Switch>
<Route path="/viewType/:selectionId" />
<LazyLoadedComponent />
</Route>
</Switch>
</Suspense>
我觉得,用react Suspense或者lazy都没有问题。只是用错了 Switch
而已。
正如react router doc所说:
All children of a <Switch>
should be <Route>
or <Redirect>
elements. Only the first child to match the current location will be rendered.
因此,Switch
组件可能无法识别由 Suspense 组件包装的 Route。
例如:
import Loader from './path/toFile';
import Home from './path/toFile';
const LazyLoadedComponent = lazy(() => import('./path/toFile'));
const App = () => {
return(
<Router>
<Suspense fallback={Loader}>
<Switch>
<Route exact path="/:viewType?" component={Home} />
<Route path="/viewType/:selectionId" component={LazyLoadedComponent} />
</Switch>
</Suspense>
</Router>
)
}
下面是代码沙箱中的示例:https://codesandbox.io/s/async-react-router-v4-w-suspense-8p1t6
我找到了解决方案..或者对我来说有点。
我为我的捆绑包添加了 publicPath。
我在 webpack.config.js
上添加了这个
output: {
publicPath: '/',
},
为什么上次它不起作用的问题是我只是刷新页面知道已经安装了 hotmodule 但它没有更新我的配置。
所以在重新启动服务器后我看到了行
webpack 输出来自(我声明的 publicPath)
虽然我在这个问题上花的时间比我应该花的时间多。现在可以使用了,感谢所有评论。
我已经通过在 webpack.config 中做一些额外的更改来解决它。
首先使用
弹出配置
npm run eject
.
webpack.config.js
path: isEnvProduction
? path.resolve(__dirname, "..", "build")
: undefined,
filename: isEnvProduction
? "[name].js"
: isEnvDevelopment && "static/js/bundle.js",
chunkFilename: isEnvProduction
? "[name].chunk.js"
publicPath: "/",
我在动态路由上使用了 react lazy 和 suspense,但不知何故我无法渲染延迟加载的组件。
我已经搜索过 lazy 在路由上的使用,但我还没有看到有人在 dynamic(localhost:8080/dynamic/ 上使用它动态) 路线。
我可以在动态路由上加载组件,如果我有静态路由,延迟加载也可以,但是当我尝试将两者结合使用时,组件不会加载。
这是我所做的一个例子,
import Loader from './path/toFile';
import Home from './path/toFile';
const LazyLoadedComponent = lazy(() => import('./path/toFile'));
const App = () => {
return(
<Router>
<Switch>
// Home has multiple views controlled by buttons
// A view contains selections with corresponding id
<Route exact path="/:viewType?" component={Home} />
// this component doesn't load when I select something which links me to this dynamic route.
<Suspense fallback={Loader}>
<Route path="/viewType/:selectionId" component={LazyLoadedComponent} />
</Suspense>
</Switch>
</Router>
)
}
我只想在我转到那条路线后加载我的组件。 但是结果是它加载了主页但是当我 select 一个来自 selection 时它只显示 index.html 空白 我还没有看到产生任何错误。
尝试this,
<Suspense fallback={Loader}>
<Switch>
<Route path="/viewType/:selectionId" />
<LazyLoadedComponent />
</Route>
</Switch>
</Suspense>
我觉得,用react Suspense或者lazy都没有问题。只是用错了 Switch
而已。
正如react router doc所说:
All children of a
<Switch>
should be<Route>
or<Redirect>
elements. Only the first child to match the current location will be rendered.
因此,Switch
组件可能无法识别由 Suspense 组件包装的 Route。
例如:
import Loader from './path/toFile';
import Home from './path/toFile';
const LazyLoadedComponent = lazy(() => import('./path/toFile'));
const App = () => {
return(
<Router>
<Suspense fallback={Loader}>
<Switch>
<Route exact path="/:viewType?" component={Home} />
<Route path="/viewType/:selectionId" component={LazyLoadedComponent} />
</Switch>
</Suspense>
</Router>
)
}
下面是代码沙箱中的示例:https://codesandbox.io/s/async-react-router-v4-w-suspense-8p1t6
我找到了解决方案..或者对我来说有点。
我为我的捆绑包添加了 publicPath。
我在 webpack.config.js
上添加了这个output: {
publicPath: '/',
},
为什么上次它不起作用的问题是我只是刷新页面知道已经安装了 hotmodule 但它没有更新我的配置。
所以在重新启动服务器后我看到了行
webpack 输出来自(我声明的 publicPath)
虽然我在这个问题上花的时间比我应该花的时间多。现在可以使用了,感谢所有评论。
我已经通过在 webpack.config 中做一些额外的更改来解决它。 首先使用
弹出配置npm run eject
.
webpack.config.js
path: isEnvProduction
? path.resolve(__dirname, "..", "build")
: undefined,
filename: isEnvProduction
? "[name].js"
: isEnvDevelopment && "static/js/bundle.js",
chunkFilename: isEnvProduction
? "[name].chunk.js"
publicPath: "/",