我目前正在尝试在VueJS3和Laravel中实现路由的懒加载。我使用vue-router来实现我的路由。
不幸的是,每当我点击链接时,什么也不会发生,30秒后,我会在浏览器控制台中看到一个超时错误弹出。如果我将路由的懒加载替换为直接导入,则一切都正常运行。
我会感激任何提示,告诉我可能发生了什么。我已经遇到了这个问题几周了。所有其他帖子和建议清除浏览器缓存或在webpack.config.js中设置公共路径都没有对我起作用。我还用webpack替换了laravel-mix,但问题仍然存在。
不幸的是,每当我点击链接时,什么也不会发生,30秒后,我会在浏览器控制台中看到一个超时错误弹出。如果我将路由的懒加载替换为直接导入,则一切都正常运行。
我会感激任何提示,告诉我可能发生了什么。我已经遇到了这个问题几周了。所有其他帖子和建议清除浏览器缓存或在webpack.config.js中设置公共路径都没有对我起作用。我还用webpack替换了laravel-mix,但问题仍然存在。
前提条件:
- Webpack 5.69.1
- Webpack-cli ^4.9.2
- Vue ^3.2.31
- Vue-router ^4.0.12
- Laravel 7.2
复现步骤
- 运行 npm run production
- 运行 php artisan serve
- 打开浏览器
- 在浏览器中输入所需URL: http://127.0.0.1:8000/login
- 在登录页面打开后,点击“注册”链接。
预期行为
- Npm 成功运行,manifest.json 已更新。Webpack 生成所有的块在 dists 文件夹中。
- Laravel 服务器启动
- 网站可以通过 http://127.0.0.1:8000 访问
- 登录页面打开路由配置的组件。Login.js 被浏览器下载。
- 浏览器动态地下载 register.js 块。注册页面被显示。
观察到的行为
- Npm 成功运行,manifest.json 已更新。Webpack 生成所有的块在 dists 文件夹中。
- Laravel 服务器启动
- 网站可以通过 http://127.0.0.1:8000 访问
- 登录页面打开路由配置的组件。Login.js 被浏览器下载。
- register.js 块从未被下载。注册页面从未被显示。在30秒超时后,在浏览器控制台中打印错误。
ChunkLoadError: Loading chunk register failed.
(timeout: http://127.0.0.1:8000/dist/register.d3e633a9a1aea3ebf47b.js)
at Object.__webpack_require__.f.j (main.34a1a3da92d476b41479.js:4051:29)
at main.34a1a3da92d476b41479.js:3905:40
at Array.reduce (<anonymous>)
at Function.__webpack_require__.e (main.34a1a3da92d476b41479.js:3904:67)
at component (routes.js:35:55)
at extractComponentsGuards (vue-router.esm-bundler.js:2037:40)
at eval (vue-router.esm-bundler.js:3156:22)
webpack.config.js
const path = require('path');
const {VueLoaderPlugin} = require('vue-loader');
const { WebpackManifestPlugin } = require('webpack-manifest-plugin');
const options = {basePath:'/dist/',fileName:'../mix-manifest.json',publicPath:'dist/'};
const webpack = require('webpack');
module.exports = {
mode: 'development',
entry: './resources/js/main.js',
output: {
clean: true,
filename: "[name].[chunkhash].js",
publicPath: './dist/',
path: path.resolve(__dirname, 'public/dist'),
chunkLoadTimeout: 30000,
},
resolve:{
alias: {
'@': path.resolve(__dirname,'resources/js'),
},
extensions: ['.js', '.vue', '.json']
},
module: {
rules: [
{
test: /\.vue$/,
use: 'vue-loader'
},
{
test: /\.css$/,
use: [
'vue-style-loader',
'css-loader'
]
}
]
},
plugins: [
new VueLoaderPlugin(),
new WebpackManifestPlugin(options),
new webpack.DefinePlugin({
__VUE_OPTIONS_API__: false,
__VUE_PROD_DEVTOOLS__: false,
}),
]
};
routes.js
const routes = [
{
path: "/",
component: DefaultLayout,
children: [
{
path: "/publicidade",
name: "publicidade",
component: () => import (/* webpackChunkName: "publicity" */ '../pages/Publicidade')
},
{
path: "/login",
name: "login",
component: () => import(/* webpackChunkName: "login" */ '../pages/login.vue')
},
{
path: "/cadastro",
name: "cadastro",
component: () => import(/* webpackChunkName: "register" , webpackPrefetch: true */ '../pages/Register.vue')
},
{
path: "perfil",
name: "perfil",
component: () => import('../pages/Profile')
},
],
},
{ path: "/:catchAll(.*)", component: NotFoundPage }
];