活动介绍
file-type

解决vue-router按需加载component: () => import()报错

版权申诉

PDF文件

71KB | 更新于2024-09-10 | 158 浏览量 | 1 下载量 举报 收藏
download 限时特惠:#9.90
"Vue.js项目中的路由按需加载问题及解决方案" 在Vue.js的单页面应用(SPA)开发中,路由按需加载是一个关键特性,它能够提高应用的性能,避免一次性加载所有组件导致的页面加载时间过长。传统的实现方式是通过`require.ensure`配合Webpack的代码分块功能来完成,但Vue-router官方现在推荐使用Vue异步组件和Webpack的代码分块点(Code Splitting)功能相结合的方式。 以前的做法如下: ```javascript const Login = r => require.ensure([], () => r(require('../component/Login.vue'))); ``` 然而,Vue-router官方现在推荐的写法是: ```javascript const App = () => import('../component/Login.vue'); ``` 这种写法更简洁,但可能会遇到npm run dev时控制台报`SyntaxError: Unexpected token`的错误,原因在于Babel不支持动态导入(dynamic import)的语法。为了解决这个问题,需要安装Babel的一个插件——`babel-plugin-syntax-dynamic-import`。如果你使用的是vue-cli创建的项目,可能默认配置中并未包含这个插件,所以需要手动安装并配置。 首先,执行以下命令安装插件: ```bash npm install babel-plugin-syntax-dynamic-import --save-dev ``` 接着,你需要修改项目的webpack配置,特别是对`.js`文件使用的`babel-loader`部分,添加`plugins`选项,并包含`'syntax-dynamic-import'`: ```javascript { test: /\.js$/, loader: 'babel-loader', options: { plugins: ['syntax-dynamic-import'], }, } ``` 完成以上步骤后,Babel就能正确解析动态导入的语法,你的代码应该能够正常运行。 在打包时,为了方便管理和理解生成的chunk文件,可以通过Webpack的Magic Comments(魔法注释)来指定chunk的名称。例如,你可以这样写: ```javascript const App = () => import(/* webpackChunkName: 'login' */ '../component/Login.vue'); ``` 这样,打包后的chunk文件名就会按照`'login'`来命名,而不是默认的随机字符串,便于理解和维护。 总结来说,Vue-router的按需加载通过Vue异步组件和Webpack的Code Splitting实现,当遇到`SyntaxError: Unexpected token`报错时,需要确保Babel配置了`babel-plugin-syntax-dynamic-import`插件。同时,利用Webpack的Magic Comments可以自定义chunk文件的名称,提高代码可读性和可维护性。

相关推荐

filetype

若依报错[vue-router] Duplicate named routes definition: { name: "Resources", path: "/resources" } warn @ vue-router.esm.js:16 vue-router.esm.js:16 [vue-router] Non-nested routes must include a leading slash character. Fix the following routes: - http://ruoyi.vip warn @ vue-router.esm.js:16 app.js:978 Error: Cannot find module './plppSys/reports/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) __webpack_require__.oe @ app.js:978 vue-router.esm.js:16 [vue-router] Failed to resolve async component default: Error: Cannot find module './plppSys/reports/index' warn @ vue-router.esm.js:16 vue-router.esm.js:16 [vue-router] uncaught error during route navigation: warn @ vue-router.esm.js:16 vue-router.esm.js:2257 Error: Cannot find module './plppSys/reports/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) abort @ vue-router.esm.js:2257 app.js:978 Error: Cannot find module './plppSys/resources/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) __webpack_require__.oe @ app.js:978 vue-router.esm.js:16 [vue-router] Failed to resolve async component default: Error: Cannot find module './plppSys/resources/index' warn @ vue-router.esm.js:16 vue-router.esm.js:16 [vue-router] uncaught error during route navigation: warn @ vue-router.esm.js:16 vue-router.esm.js:2257 Error: Cannot find module './plppSys/resources/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) abort @ vue-router.esm.js:2257 app.js:978 Error: Cannot find module './plppSys/users/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) __webpack_require__.oe @ app.js:978 vue-router.esm.js:16 [vue-router] Failed to resolve async component default: Error: Cannot find module './plppSys/users/index' warn @ vue-router.esm.js:16 vue-router.esm.js:16 [vue-router] uncaught error during route navigation: warn @ vue-router.esm.js:16 vue-router.esm.js:2257 Error: Cannot find module './plppSys/users/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) abort @ vue-router.esm.js:2257 app.js:978 Error: Cannot find module './plppSys/users/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) __webpack_require__.oe @ app.js:978 vue-router.esm.js:16 [vue-router] Failed to resolve async component default: Error: Cannot find module './plppSys/users/index' warn @ vue-router.esm.js:16 vue-router.esm.js:16 [vue-router] uncaught error during route navigation: warn @ vue-router.esm.js:16 vue-router.esm.js:2257 Error: Cannot find module './plppSys/users/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) abort @ vue-router.esm.js:2257 app.js:978 Error: Cannot find module './plppSys/users/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) __webpack_require__.oe @ app.js:978 Promise.catch eval @ permission.js:115 eval @ vue-router.esm.js:2087 eval @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2114 flatMapComponents @ vue-router.esm.js:2113 eval @ vue-router.esm.js:2049 iterator @ vue-router.esm.js:2300 step @ vue-router.esm.js:1947 step @ vue-router.esm.js:1951 step @ vue-router.esm.js:1951 eval @ vue-router.esm.js:1948 eval @ vue-router.esm.js:2322 eval @ permission.js:46 iterator @ vue-router.esm.js:2300 step @ vue-router.esm.js:1947 step @ vue-router.esm.js:1951 runQueue @ vue-router.esm.js:1955 confirmTransition @ vue-router.esm.js:2330 transitionTo @ vue-router.esm.js:2203 push @ vue-router.esm.js:2544 eval @ vue-router.esm.js:2963 push @ vue-router.esm.js:2962 push @ index.js:172 handler @ vue-router.esm.js:1133 invokeWithErrorHandling @ vue.runtime.esm.js:1854 invoker @ vue.runtime.esm.js:2179 original._wrapper @ vue.runtime.esm.js:6917 permission.js:46 [vue-router] Failed to resolve async component default: Error: Cannot find module './plppSys/users/index' warn @ vue-router.esm.js:16 eval @ vue-router.esm.js:2076 eval @ vue-router.esm.js:2146 Promise.then eval @ vue-router.esm.js:2093 eval @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2114 flatMapComponents @ vue-router.esm.js:2113 eval @ vue-router.esm.js:2049 iterator @ vue-router.esm.js:2300 step @ vue-router.esm.js:1947 step @ vue-router.esm.js:1951 step @ vue-router.esm.js:1951 eval @ vue-router.esm.js:1948 eval @ vue-router.esm.js:2322 eval @ permission.js:46 iterator @ vue-router.esm.js:2300 step @ vue-router.esm.js:1947 step @ vue-router.esm.js:1951 runQueue @ vue-router.esm.js:1955 confirmTransition @ vue-router.esm.js:2330 transitionTo @ vue-router.esm.js:2203 push @ vue-router.esm.js:2544 eval @ vue-router.esm.js:2963 push @ vue-router.esm.js:2962 push @ index.js:172 handler @ vue-router.esm.js:1133 invokeWithErrorHandling @ vue.runtime.esm.js:1854 invoker @ vue.runtime.esm.js:2179 original._wrapper @ vue.runtime.esm.js:6917 permission.js:46 [vue-router] uncaught error during route navigation: warn @ vue-router.esm.js:16 abort @ vue-router.esm.js:2256 eval @ vue-router.esm.js:2307 eval @ vue-router.esm.js:2081 eval @ vue-router.esm.js:2146 Promise.then eval @ vue-router.esm.js:2093 eval @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2114 flatMapComponents @ vue-router.esm.js:2113 eval @ vue-router.esm.js:2049 iterator @ vue-router.esm.js:2300 step @ vue-router.esm.js:1947 step @ vue-router.esm.js:1951 step @ vue-router.esm.js:1951 eval @ vue-router.esm.js:1948 eval @ vue-router.esm.js:2322 eval @ permission.js:46 iterator @ vue-router.esm.js:2300 step @ vue-router.esm.js:1947 step @ vue-router.esm.js:1951 runQueue @ vue-router.esm.js:1955 confirmTransition @ vue-router.esm.js:2330 transitionTo @ vue-router.esm.js:2203 push @ vue-router.esm.js:2544 eval @ vue-router.esm.js:2963 push @ vue-router.esm.js:2962 push @ index.js:172 handler @ vue-router.esm.js:1133 invokeWithErrorHandling @ vue.runtime.esm.js:1854 invoker @ vue.runtime.esm.js:2179 original._wrapper @ vue.runtime.esm.js:6917 permission.js:46 Error: Cannot find module './plppSys/users/index' at webpackContextResolve (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:156:11) at webpackContext (eval at ./src/views sync recursive ^\.\/.*$ (0.js:8701:1), <anonymous>:151:11) at eval (permission.js:115:1) abort @ vue-router.esm.js:2257 eval @ vue-router.esm.js:2307 eval @ vue-router.esm.js:2081 eval @ vue-router.esm.js:2146 Promise.then eval @ vue-router.esm.js:2093 eval @ vue-router.esm.js:2114 eval @ vue-router.esm.js:2114 flatMapComponents @ vue-router.esm.js:2113 eval @ vue-router.esm.js:2049 iterator @ vue-router.esm.js:2300 step @ vue-router.esm.js:1947 step @ vue-router.esm.js:1951 step @ vue-router.esm.js:1951 eval @ vue-router.esm.js:1948 eval @ vue-router.esm.js:2322 eval @ permission.js:46 iterator @ vue-router.esm.js:2300 step @ vue-router.esm.js:1947 step @ vue-router.esm.js:1951 runQueue @ vue-router.esm.js:1955 confirmTransition @ vue-router.esm.js:2330 transitionTo @ vue-router.esm.js:2203 push @ vue-router.esm.js:2544 eval @ vue-router.esm.js:2963 push @ vue-router.esm.js:2962 push @ index.js:172 handler @ vue-router.esm.js:1133 invokeWithErrorHandling @ vue.runtime.esm.js:1854 invoker @ vue.runtime.esm.js:2179 original._wrapper @ vue.runtime.esm.js:6917

filetype

按照上文修改后,点击登录浏览器控制台打印: dynamic.js:29 [Vue Router warn]: Parent route "manage" not found when adding child route {path: 'manage/index', name: '-manage-index', meta: {…}, component: ƒ} Login.vue:84 失败日志: Login.vue:85 Error: Route paths should start with a "/": "manage/index" should be "/manage/index". at tokenizePath (vue-router.js?v=42376a9b:961:11) at createRouteRecordMatcher (vue-router.js?v=42376a9b:1071:33) at Object.addRoute (vue-router.js?v=42376a9b:1140:17) at Object.addRoute (vue-router.js?v=42376a9b:2366:20) at dynamic.js:29:18 at Array.forEach (<anonymous>) at addRoutes (dynamic.js:13:11) at addDynamicRoutes (dynamic.js:39:3) at login (Login.vue:78:7) 终端打印: [vite] (client) warning: invalid import "../${menu.component}". A file extension must be included in the static part of the import. For example: import(`./foo/${bar}.js`). Plugin: vite:dynamic-import-vars File: D:/companyProject/road-system-pc/src/router/dynamic.js 09:49:54 [vite] (client) warning: D:/companyProject/road-system-pc/src/router/dynamic.js 16 | path: menu.path.startsWith('/') ? menu.path.slice(1) : menu.path, 17 | name: menu.path.replace(/\//g, '-'), 18 | component: () => import(`@/${menu.component}`), | ^^^^^^ 19 | meta: { | ^^^^^^^^^^^^^^^ 20 | title: menu.name, The above dynamic import cannot be analyzed by Vite. See https://github.com/rollup/plugins/tree/master/packages/dynamic-import-vars#limitations for supported dynamic import formats. If this is intended to be left as-is, you can use the /* @vite-ignore */ comment inside the import() call to suppress this warning. Plugin: vite:import-analysis File: D:/companyProject/road-system-pc/src/router/dynamic.js

weixin_38657465
  • 粉丝: 7
上传资源 快速赚钱