使用Webpack和NPM在LVM堆栈中安装Vue 3.x

lb3vh1jj  于 2022-12-13  发布在  Webpack
关注(0)|答案(1)|浏览(142)

我有一个困难的时间让Vue工作在一个blade.php页面,我在我的laravel网站。
下面是刀片页面代码:

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
    <head>
        <!-- Fonts -->
        <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">
        <!--  Custom css -->
        <link href="{{ url('sass/custom.scss.css') }}" type="text/css" rel="stylesheet">
        <!-- Fav icon -->
        <link rel="icon" type="image/png" href="{{ url('omnisection.png') }}">
        <!-- development version, includes helpful console warnings -->
        <script  src="{{ mix('/js/vue.js') }}"></script> 
        <script src="{{ mix('/js/app.js') }}"></script>
        <script  src="{{ mix('/js/RecordRTC.js') }}"></script>
        <script  src="{{ mix('/js/customrecrtc.js') }}"></script>
        <!-- Styles -->
        <style>
            /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-t{border-top-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.dark\:text-gray-500{--tw-text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--tw-text-opacity))}}
        </style>

        <style>
            body {
                font-family: 'Nunito', sans-serif;
            }
        </style>
    </head>
    <body class="antialiased">
    <div id="app">
        @{{ message }}
    </div>
    <script>
        var test = new Vue({
            el: '#app',
            data: {
                message: 'hi'
            }
        });
    </script>
    <!-- Navigation -->
            <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
                <div class="container-fluid">
                    <a class="navbar-brand" href="/"><img class="rounded-3" src="{{ url('omnisection(new).png') }}" style="width:172px;height:108px" /></a>
                    <button class="navbar-toggler brotoggle" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                        <span class="navbar-toggler-icon"></span>
                    </button>
                    <div class="collapse navbar-collapse" id="navbarSupportedContent">
                        <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                            @foreach($pages as $page)
                            <li class="nav-item">
                                <a href="{{ url($page['url']) }}">
                                    <button class="btn btn-lg btn-outline-secondary brobutton" type="button">{{ $page['page_name'] }}</button>
                                </a>
                            </li>
                            @endforeach
                        </ul>
                        <form class="d-flex">
                            <input class="form-control me-2" type="search" placeholder="Search Requests" aria-label="Search">
                            <a href="{{ url('search') }}">
                                <button class="btn btn-outline-secondary brobutton" type="submit">Search</button>
                            </a>
                        </form>
                    </div>
                </div>
            </nav>
        <div class="relative flex items-top justify-center bg-gray-100 dark:bg-gray-900 sm:items-center sm:pt-0">
            @if (Route::has('login'))
                <div class="hidden fixed top-0 right-0 px-6 py-4 sm:block">
                    @auth
                        <a href="{{ url('/dashboard') }}" class="text-sm text-gray-700 dark:text-gray-500 underline">Dashboard</a>
                    @else
                        <a href="{{ route('login') }}" class="text-sm link-light underline">Log in</a>
                        
                        @if (Route::has('register'))
                            <a href="{{ route('register') }}" class="ml-4 text-sm link-light underline">Register</a>
                        @endif
                    @endauth
                </div>
            @endif
        </div>
        <!-- Fluid container -->
        <div class="container-fluid mt-1">
            <div class="row">
                <div class="col fs-1 text-center">
                    Your Data
                </div>
                <div class="col fs-1 text-center border-start">
                    Other's Data
                </div>
            </div>
            <div class="row">
                <div class="col">
                @guest
                    <a href="{{ url('login') }}">
                        <button type="button" class="btn rounded btn-primary btn-lg start-50 translate-middle-x position-relative" alt="login button">Log in</button>
                    </a>
                @endguest
                </div>
                <div class="col fs-1 border-start text-center">
                @guest
                    ?
                @endguest
                </div>
            </div>
            <div class="row">
                <div class="col">
                @auth
                    <div class="input-group mb-3">
                        <input type="file" class="form-control mt-2" id="inputGroupFile02" data-bs-toggle="tooltip" data-bs-placement="top" title="Use this to upload a file">
                        <label class="input-group-text mt-2" for="inputGroupFile02">Upload</label>
                    </div>
                @endauth
                </div>  
                <div class="col border-end" id="rcrdplayer">
                @auth
                    <button v-on:click="startrecord" type="button" class="rounded-circle button-rec btn-lg btn-secondary" id="btn-start-recording" alt="record audio button" data-bs-toggle="tooltip" data-bs-placement="top" title="Use this button to record audio">Rec</button>
                    <img src="video.svg" class="img-fluid custom-img-bg rounded" id="btn-start-recording" alt="record video button" height="75" width="75" data-bs-toggle="tooltip" data-bs-placement="top" title="Use this button to record video"/>
                @endauth
                </div>
                <div class="col">
                </div>
                <div class="col">
                    
                </div>
            </div>
            <!--  Recorder -->
            @auth
            <div class="row">
                <div class="col">
                    <select class="form-select form-select-sm media-resolutions">
                        <option value="default">Default resolutions</option>
                        <option value="1920x1080">1080p</option>
                        <option value="1280x720">720p</option>
                        <option value="640x480">480p</option>
                        <option value="3840x2160">4K Ultra HD (3840x2160)</option>
                    </select>
                    <select class="form-select form-select-sm media-framerates" aria-label=".form-select-sm example">
                        <option value="default">Default framerates</option>
                        <option value="5">5 fps</option>
                        <option value="15">15 fps</option>
                        <option value="24">24 fps</option>
                        <option value="30">30 fps</option>
                        <option value="60">60 fps</option>
                    </select>
                    <select class="form-select form-select-sm media-bitrates" aria-label=".form-select-sm example">
                        <option value="default">Default bitrates</option>
                        <option value="8000000000">1 GB bps</option>
                        <option value="800000000">100 MB bps</option>
                        <option value="8000000">1 MB bps</option>
                        <option value="800000">100 KB bps</option>
                        <option value="8000">1 KB bps</option>
                        <option value="800">100 Bytes bps</option>
                    </select>
                </div>
                <div class="col border-end">
                
                </div>
            </div>
            @endauth
        </div>
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
        </body>
</html>

以下是Webpack代码:

const mix = require('laravel-mix');

/*
 |--------------------------------------------------------------------------
 | Mix Asset Management
 |--------------------------------------------------------------------------
 |
 | Mix provides a clean, fluent API for defining some Webpack build steps
 | for your Laravel applications. By default, we are compiling the CSS
 | file for the application as well as bundling up all the JS files.
 |
 */
 module.exports = {
  mode: 'development'
}
mix.sass('resources/css/custom.scss','public/sass/custom.scss');
mix.js('node_modules/recordrtc/RecordRTC.js', 'public/js/RecordRTC.js');
mix.js('resources/js/customrecrtc.js', 'public/js/customrecrtc.js');
mix.js('resources/js/app.js', 'public/js').postCss('resources/css/app.css', 'public/css', [
    require('postcss-import'),
    require('tailwindcss'),
    require('autoprefixer'),
]);

我反复阅读了安装文档,然后我发现我使用的是2.x版本,所以我切换到了3.x版本。所有这些都没有用。如果我使用CDN方法,它就可以工作,然后我就可以在刀片模板中运行一些vue代码。我真的只想通过NPM将我所有的节点模块链接到页面,否则我就使用CDN方法。
更新:我已经添加了Webpack和Blade代码。由于我使用npm install vue@next安装了Vue 3,我找不到从节点模块添加Vue的位置。这是一个新的laravel项目,使用Laravel 8.x

zkure5ic

zkure5ic1#

https://laravel.com/docs/8.x/mix#working-with-scripts
就像上面的链接中说的那样,因为我使用的是编译JS代码的Webpack,我发现我必须导入特定的节点模块。如果你以前编程过,可以把它想象成导入或包含一个Java、C++、Python或其他语言的文件。
在我的例子中,我需要意识到我不仅要导入一个模块,而且要导入很多模块。然后专门使用我导入到的同一个文件来输入相关代码。我仍然不能在. blade.php文件中输入JS,但这应该足够好了。
这是我的custom.js的一个示例

相关问题