kotaro-ktr
@kotaro-ktr (Kotaro Tanaka)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

viteのサーバーに繋がらない

解決したいこと

laravelにviteでのフロント開発環境を導入中です。

npm run dev でviteのサーバーが立ち上がるようにしたのですが、いざサーバー(localhost)にアクセスしようとすると Not found と出てしまい、アクセスできませんでした。

スクリプトはvue3を使っていますので、以下の画面が表示されることが目標です。

image.png

以前、以下の内容で質問しました。

https://qiita.com/kotaro-ktr/questions/23b5fea5090c63ab0279#answer-bda91ef3f5457cc12d8f
その中で回答者様より、viteかlaravelmixどちらかでの環境にすべきであるとの助言をいただき、viteであれば早く開発できると考えviteでの環境にすることに決めました。

発生している問題・エラー

image.png


image.png
image.png
image.png
image.png

↑ログに表示されたURLにはすべてつなげようと試みました。

該当するソースコード

config/app.php

<?php

//省略
        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\ViteServiceProvider::class,
        
    ],

    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    'aliases' => Facade::defaultAliases()->merge([
        // 'ExampleClass' => App\Example\ExampleClass::class,
    ])->toArray(),

];

app/providers/ViteServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\File;
use Illuminate\Support\HtmlString;
use Illuminate\Support\ServiceProvider;

class ViteServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::directive('vite', function () {
            if (App::isLocal()) {
                return new HtmlString(<<<HTML
                <script type="module" src="http://localhost:3000/resources/js/app.js"></script>
            HTML);
            } else {
                $manifest = json_decode(File::get(public_path('dist/manifest.json')), true);
                $appJs = $this->getAppJs($manifest);
                $appCss = $this->getAppCss($manifest);
                return new HtmlString(<<<HTML
                <script type="module" src="/dist/{$appJs}"></script>
                <link rel="stylesheet" href="/dist/{$appCss}">
            HTML);
            }
        });
    }

    private function getAppJs(array $manifest) {
        return $manifest['resources/js/app.js']['file'];
    }

    private function getAppCss(array $manifest) {
        return $manifest['resources/js/app.js']['css'][0];
    }
}

vite.config.js

import path from 'path'
import vue from '@vitejs/plugin-vue';
import { defineConfig, loadEnv } from 'vite'
import laravel from 'vite-plugin-laravel'

export default defineConfig(({ command }) => ({
  base: command === 'serve' ? '/' : '/dist/',
  build: {
    manifest: true,
    outDir: path.resolve(__dirname, 'public/dist'),
    rollupOptions: {
      input: 'resources/js/app.js',
    },
  },

  plugins: [vue(),
            laravel(),
  ],

  server: {
    host: true
  },

  
    "scripts": {
      "build": "vite build",
      "preview": "vite preview --port 3000"
    },
  
  

  resolve: {
    alias: {
      '@': path.resolve(__dirname,'/resources/js'),
    },
  },


}));

resources/js/app.js

import { createApp, h } from 'vue';
import { createInertiaApp } from '@inertiajs/inertia-vue3';
import { InertiaProgress } from '@inertiajs/progress';
import '../css/app.css'

const appName = window.document.getElementsByTagName('title')[0]?.innerText || 'Laravel';

createInertiaApp({
   title: (title) => `${title} - ${appName}`,
    resolve: (name) => require(`./Pages/${name}.vue`),
    resolve: async name => {
        if (import.meta.env.DEV) {
            return await import(`./Pages/${name}.vue`)
        } else {
            let pages = import.meta.glob('./Pages/**/*.vue')
            const importPage = pages[`./Pages/${name}.vue`]
            return importPage().then(module)
        }
    },
   setup({ el, app, props, plugin }) {
       return createApp({ render: () => h(app, props) })
           .use(plugin)
           .mixin({ methods: { route } })
           .mount(el);
   },
});

InertiaProgress.init({ color: '#4B5563' });

自分で試したこと

viteのサーバーホスト番号を変えてみましたがうまくいきませんでした。

0

3Answer

Comments

  1. @kotaro-ktr

    Questioner

    ログのlocalhost:5173にアクセスしてもつながりませんでした。
    書いていませんでしたので質問内容に追記いたしました。

Comments

  1. @kotaro-ktr

    Questioner

    現状の環境にngrokやlocaltunnnel,telbitなどを導入していないためパブリックインターネットには公開することを想定しておりませんでした。

    なお、導入後に接続を試みてみましたがうまく接続できませんでした。
    KDDIの影響でしょうか...
  2. 私自身導入したことないのでわかりませんが、最後に参考になりそうな記事を紹介してドロンします🙇‍♂️
    https://blog.capilano-fw.com/?p=10168
    すでにご覧になっていたらすいません。。健闘を祈ります!

こちらの記事の方は、
VueコンポーネントがLaravelに表示されるように設定した上で、LaravelのURLにアクセスして表示確認していそうです。

本質問ではviteのURLにアクセスしてVueのwelcomeページを表示させようとしているのかと思いますが、上記の方針で試されてみるのはいかがでしょうか?

もしやりたい事とずれてたら、すみません。

0Like

Your answer might help someone💌