Laravel&#x2B中的默认持久布局;惯性Vite

发布于 2025-02-13 04:29:15 字数 787 浏览 0 评论 0原文

在Laravel应用程序中设置惯性的一种方式中,我可以从“ createInertiaapp函数”中调整Resolve属性:从:

{
   ...,
   resolve: name => import("./Pages/${name}"),
   ...
}

允许

{
   ...,
   resolve: name => {
    const page = require("./Pages/${name}").default
    if(!page.layout) {
     page.layout = DefaultLayoutFile
    }
   },
   ...
}

我手动通过页面中使用的默认布局文件。

但是随着VITE成为默认资产捆绑器,并根据 a>,我必须使用ResolvePageComponent功能import.meta.glob作为第二个参数,以指示VITE要捆绑的文件。

问题是从此resolvePageComponent返回导入,因此我无法像我通常从requient函数中访问默认对象一样访问默认对象。

因此,我无法将默认布局文件附加到导入页面上。

有人能为此找到解决方法吗?

In the previous way of setting up inertia in a laravel app, I could tweak the resolve property in the `createInertiaApp function from:

{
   ...,
   resolve: name => import("./Pages/${name}"),
   ...
}

To

{
   ...,
   resolve: name => {
    const page = require("./Pages/${name}").default
    if(!page.layout) {
     page.layout = DefaultLayoutFile
    }
   },
   ...
}

To allow me manually pass a default layout file to be used in pages.

But with Vite becoming the default asset bundler and according to the docs, I must use a resolvePageComponent function which takes in import.meta.glob as a second argument to instruct Vite which files to bundle.

Problem here is the import gets returned from this resolvePageComponent so I cannot access the default object like I normally will from a require function.

So I have not been able to attach a default layout file to imported pages.

Has anyone been able to find a workaround for this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

番薯 2025-02-20 04:29:15

假设您类似地导入默认布局文件(请记住,请不要再在导入中使用 @,因为仅出于静态分析原因相对路径起作用):

从'./ layouts/defaultlayoutfile.vue.vue'

'使用以下代码使默认布局与惯性和vite一起使用:

  resolve: (name) => {
    const page = resolvePageComponent(
      `./Pages/${name}.vue`,
      import.meta.glob("./Pages/**/*.vue")
    );
    page.then((module) => {
      module.default.layout = module.default.layout || DefaultLayoutFile;
    });
    return page;
  },

[UPDATE 2022-08-01]

由于这仍在收到视图,但我展示如何获得@在Vite中工作将是有用的。

需要PATH下面的导入vite.config.js

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue';
const path = require('path')

,然后添加resolve添加到您的配置中:

export default defineConfig({
  resolve:{
    alias:{
      '@' : path.resolve(__dirname, './src')
    },
  },
})

现在@将指向您的Laravel root,您可以从任何地方动态导入组件:

例如 从'@/layouts/layouttop.vue'导入layouttop
现在将指向
/resources/js/layouts/layouttop.vue

请记住,导入VUE SFC文件时,Vite需要.vue扩展。

Assuming you imported your default layout file like this (remember to not use @ in imports anymore as only relative paths work for static analysis reasons):

import DefaultLayoutFile from './Layouts/DefaultLayoutFile.vue'

You can use the following code to get default layout working with Inertia and Vite:

  resolve: (name) => {
    const page = resolvePageComponent(
      `./Pages/${name}.vue`,
      import.meta.glob("./Pages/**/*.vue")
    );
    page.then((module) => {
      module.default.layout = module.default.layout || DefaultLayoutFile;
    });
    return page;
  },

[UPDATE 2022-08-01]

Since this is still receiving views, I though it would be useful to show how to get the @ working in imports in Vite.

Require path below your imports in vite.config.js

import { defineConfig } from 'vite';
import laravel from 'laravel-vite-plugin';
import vue from '@vitejs/plugin-vue';
const path = require('path')

And then add resolve into your config below:

export default defineConfig({
  resolve:{
    alias:{
      '@' : path.resolve(__dirname, './src')
    },
  },
})

Now @ will point to your Laravel root and you can import components dynamically from anywhere:

For example import LayoutTop from '@/Layouts/LayoutTop.vue'
will now point to
/resources/js/Layouts/LayoutTop.vue

Remember that Vite needs the .vue extension when importing Vue SFC files.

情定在深秋 2025-02-20 04:29:15

等待可接受的答案的版本

resolve: async name => {
    const page = await resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob("./Pages/**/*.vue"));
    page.default.layout ??= DefaultLayoutFile;
    return page;
  },

The async await version of the accepted answer

resolve: async name => {
    const page = await resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob("./Pages/**/*.vue"));
    page.default.layout ??= DefaultLayoutFile;
    return page;
  },
诗酒趁年少 2025-02-20 04:29:15

对于laravelvue3.jsintertiavite> vite setup(laravel9 )代码>及以上)

转到资源\ JS \ app.js

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })
    return pages[`./Pages/${name}.vue`]
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .mount(el)
  },
})

更改为

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'

#import your default layout.vue,@~resources\js
import Layout from '@/Layouts/Front/Layout.vue'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })

    #New code added
    let page = pages[`./Pages/${name}.vue`].default
    page.layout=Layout;
    return pages[`./Pages/${name}.vue`]
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .mount(el)
  },
})

laravelvue3.jsinertiawebpack setup(laravel8及以下)

转到Resources \ JS \ app.js

createInertiaApp({
  resolve: name => require(`./Pages/${name}`),
})

更改为

#import your default layout.vue
import Layout from './Layouts/Front/Layout.vue'
createInertiaApp({
  resolve: name => {
  let page=require(`./Pages/${name}`).default;
    page.layout=Layout;
    return page;
 },
})

For Default Persistent Layout in Laravel and Vue3.js and Inertia and Vite Setup(Laravel9 and above)

Go to resources\js\app.js

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })
    return pages[`./Pages/${name}.vue`]
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .mount(el)
  },
})

Change to

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/vue3'

#import your default layout.vue,@~resources\js
import Layout from '@/Layouts/Front/Layout.vue'

createInertiaApp({
  resolve: name => {
    const pages = import.meta.glob('./Pages/**/*.vue', { eager: true })

    #New code added
    let page = pages[`./Pages/${name}.vue`].default
    page.layout=Layout;
    return pages[`./Pages/${name}.vue`]
  },
  setup({ el, App, props, plugin }) {
    createApp({ render: () => h(App, props) })
      .use(plugin)
      .mount(el)
  },
})

For Default Persistent Layout in Laravel and Vue3.js and Inertia and Webpack Setup(Laravel8 and below)

Go to resources\js\app.js

createInertiaApp({
  resolve: name => require(`./Pages/${name}`),
})

Change to

#import your default layout.vue
import Layout from './Layouts/Front/Layout.vue'
createInertiaApp({
  resolve: name => {
  let page=require(`./Pages/${name}`).default;
    page.layout=Layout;
    return page;
 },
})
执笏见 2025-02-20 04:29:15

@ResidualFlash添加条件也有效:

resolve: async name => {
 const page = await resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob("./Pages/**/*.vue"));
 if (name.startsWith('Auth/')){
  page.default.layout ??= AuthLayoutFile;
 }else{
  page.default.layout ??= DefaultLayoutFile;
 }
 return page;
},

@residualflash Adding condition works as well:

resolve: async name => {
 const page = await resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob("./Pages/**/*.vue"));
 if (name.startsWith('Auth/')){
  page.default.layout ??= AuthLayoutFile;
 }else{
  page.default.layout ??= DefaultLayoutFile;
 }
 return page;
},
奈何桥上唱咆哮 2025-02-20 04:29:15

使用 vite with interertia prestia

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/inertia-vue3'
import { resolvePageComponent } from 'vite-plugin-laravel/inertia'
import DefaultLayout from '@/views/layouts/default.vue'
import SimpleLayout from '@/views/layouts/simple.vue'
import UserLayout from '@/views/layouts/user.vue'

createInertiaApp({
    resolve: (name) => {
        const page = resolvePageComponent(
            name,
            import.meta.glob('../views/pages/**/*.vue'),
            DefaultLayout
        );

        page.then((module) => {
            if (name.startsWith('auth.')) module.layout = SimpleLayout;
            if (name.startsWith('user.')) module.layout = [DefaultLayout, UserLayout];
        });

        return page
    },
    setup({ el, app, props, plugin }) {
        createApp({ render: () => h(app, props) })
            .use(plugin)
            .mount(el)
    },
})

This worked from me using the vite with inertia preset

import { createApp, h } from 'vue'
import { createInertiaApp } from '@inertiajs/inertia-vue3'
import { resolvePageComponent } from 'vite-plugin-laravel/inertia'
import DefaultLayout from '@/views/layouts/default.vue'
import SimpleLayout from '@/views/layouts/simple.vue'
import UserLayout from '@/views/layouts/user.vue'

createInertiaApp({
    resolve: (name) => {
        const page = resolvePageComponent(
            name,
            import.meta.glob('../views/pages/**/*.vue'),
            DefaultLayout
        );

        page.then((module) => {
            if (name.startsWith('auth.')) module.layout = SimpleLayout;
            if (name.startsWith('user.')) module.layout = [DefaultLayout, UserLayout];
        });

        return page
    },
    setup({ el, app, props, plugin }) {
        createApp({ render: () => h(app, props) })
            .use(plugin)
            .mount(el)
    },
})
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文