一天中的好时光,

我在Nuxt@2.0遇到了一个非常奇怪的问题,如下:

  • 创建模块并动态加载路由

  • 使用侧边栏导航到页面 - 页面工作正常(内容显示等)

  • 复制页面网址并在新标签页中打开 - 404,但是,面包屑生成器中的所有元数据都在那里(它解析路径名称并为面包棒创建条目)

因此,从技术上讲,nuxt能够加载页面,但是,它无法实际加载它(奇怪的措辞,但我不知道如何更好地描述它) .

Plugins used:

  • nuxt @ edge(2.0~)

  • nuxt-i18n - 所有路由都附有 ___locale 字符串,例如: dashboard___endashboard___esdashboard___ru

为了动态加载路由,使用以下 plugin (在 nuxt.config.js 中的插件下定义):

import Vue from 'vue';
export default ({ app: { router } }) => {
    const routingContext = require.context('../modules', true, /.routing.js$/);

    routingContext.keys().map((file) => [file.replace(/(^.\/)|(\.js$)/g, ''), routingContext(file)]).reduce((pluginRoutes, [name, module]) => {
        Vue.use(module, router);
    }, {});
};

modules文件夹中的 routing.js 文件如下所示:

import { backendRoute, routeNameGenerator } from '~/libs/helpers';
import config from '~/config';
import forEach from 'lodash.foreach';

import CompanyPage from './pages/company';

export function install (Vue, router, options = {}) {

    let routes = [
        {
            path: backendRoute('namespace/module/company'),
            name: routeNameGenerator('namespace.module.company'),
            component: CompanyPage
        }
    ];

    let localizedRoutes = [];

    forEach(routes, (route) => {
        forEach(config.application.localization.supportedLocales, (locale) => {
            let modifiedRoute = Object.assign({}, route);
            modifiedRoute.name = route.name + '___' + locale;
            localizedRoutes.push(modifiedRoute);
        });
    });

    router.addRoutes(localizedRoutes);

}

并且生成正确路由名称和路由路径的帮助程序如下:

/**
 * Generate Backend Route
 * @param { string } path
 * @returns { string }
 */
export function backendRoute(path) {
    let basePath = application.backend_prefix.rtrim('/');
    let trimmedPath = path.ltrim('/');
    return basePath + '/' + trimmedPath;
}

/**
 * Generate route name compatible with nuxt
 * @param routeName
 * @returns {string}
 */
export function routeNameGenerator(routeName) {
    let parts = routeName.split('.');
    let backend = application.backend_prefix.replaceAll('/', '');
    return [].concat(...[backend], ...parts).join('-');
}

正如我已经说过的,如果您通过实际跟踪路径的路径导航到动态加载的路由,它将显示内容,但是如果您想直接访问此路由,将抛出404但面包屑将仍然会生成路由是一种加载,但同时它不是 .

我已经从 /pages 目录和动态页面中的页面检查了 this.$route 的输出,它是相同的(显然不是路径和名称),所以在这一点上我不知道我的加载路由的方式有什么问题 .

非常感谢任何帮助,谢谢你的时间!

附:我没有使用 @nuxt\router 支持自动路由生成 root\pages 目录中的文件 .

Update #1: 有时,它偶尔会抛出 Cannot read property 'layout' of undefined 错误