0

我正在开发我的第一个 Laravel 项目(5.4),实际上我不明白为什么我的 js 脚本不能像我预期的那样工作。我使用混合和刀片:

// webpack.mix.js
let { mix } = require('laravel-mix').mix;

    // copy fonts and patterns
mix .copy('resources/assets/vendor/bootstrap/fonts', 'public/fonts')
    .copy('resources/assets/vendor/font-awesome/fonts', 'public/fonts')
    .copy('resources/assets/patterns', 'public/css/patterns')

    // compile scss and concatenate css files
    .sass('resources/assets/sass/app.scss', 'public/css')
    .styles([
        'resources/assets/vendor/bootstrap/css/bootstrap.css',
        'resources/assets/vendor/animate/animate.css'
        // ...
    ], 'public/css/vendor.css')

    // concatenate js files
    .js([
        'resources/assets/vendor/jquery/jquery-3.1.1.min.js',
        'resources/assets/vendor/bootstrap/js/bootstrap.js',
        'resources/assets/js/app.js'
        // ...
    ], 'public/js/app.js')
    .options({ processCssUrls: false }); // fix for path issue : https://github.com/almasaeed2010/AdminLTE/issues/1360

编译后npm run dev看起来不错:

DONE  Compiled successfully in 6497ms                                                     4:20:57 PM

                                   Asset      Size  Chunks                    Chunk Names
  fonts/glyphicons-halflings-regular.ttf   45.4 kB          [emitted]         
                              /js/app.js    1.2 MB       0  [emitted]  [big]  /js/app
                       mix-manifest.json  66 bytes          [emitted]         
  fonts/glyphicons-halflings-regular.eot   20.1 kB          [emitted]         
fonts/glyphicons-halflings-regular.woff2     18 kB          [emitted]         
  fonts/glyphicons-halflings-regular.svg    109 kB          [emitted]         
 fonts/glyphicons-halflings-regular.woff   23.4 kB          [emitted]         
                            /css/app.css    178 kB       0  [emitted]         /js/app
           fonts/fontawesome-webfont.ttf    166 kB          [emitted]         
           fonts/fontawesome-webfont.svg    444 kB          [emitted]  [big]  
           fonts/fontawesome-webfont.eot    166 kB          [emitted]         
          fonts/fontawesome-webfont.woff     98 kB          [emitted]         
         fonts/fontawesome-webfont.woff2   77.2 kB          [emitted]         
                   fonts/FontAwesome.otf    135 kB          [emitted]         
         css/patterns/header-profile.png   5.88 kB          [emitted] 

CSS 工作正常,bootstrap.js 也可以工作,当我检查内部/js/app.js时,似乎一切都在里面。

这是我的模板:

{{-- app.blade.php--}}
<!DOCTYPE html>
<html lang="{{ config('app.locale', 'en') }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@yield('title')</title>
    <link rel="stylesheet" href="{!! asset('css/vendor.css') !!}" />
    <link rel="stylesheet" href="{!! asset('css/app.css') !!}" />
</head>
<body>
    <!-- Main view  -->
    @yield('content')

    <script src="{!! asset('js/app.js') !!}" type="text/javascript"></script>

    @section('scripts')
    @show
</body>
</html>

当我想从一个孩子的脚本部分添加一个脚本时,我的麻烦就开始了。

@extends('layouts.app')

@section('scripts')
    <script type="text/javascript">
        $(document).ready(function () {
            alert('test');
        });
    </script>
@endsection

Uncaught ReferenceError: $ is not defined就像没有加载jquery。

我不知道为什么,任何想法?

[注意]
如果我在app.blade.php内替换它会起作用:

<script src="{!! asset('js/app.js') !!}" type="text/javascript"></script>

和 :

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
4

3 回答 3

3

我终于知道谁有罪了:Mix(或我使用 Mix 的方式)

mix.js我错误地认为这mix.scripts是相同的功能。但mix.scripts只合并和缩小文件,mix.js同时编译 ECMAScript 2015 和模块捆绑。我真的不知道为什么,但在我的情况下这是一个问题。

mix.js(['public/js/admin.js',
    'public/js/dashboard.js'], 'public/js');

取而代之 :

mix.scripts(['public/js/admin.js',
    'public/js/dashboard.js'], 'public/js/all.js');

查看更多:Laravel 文档

于 2017-03-31T21:32:13.217 回答
2

我有一个类似的问题,问题是我第一次使用jQuery时,app.jswebpack生成的文件还没有加载。

你可以做一个简单的测试,看看你是否有同样的问题。在您使用 jQuery 的第一段代码(抛出 $ 错误的代码行)中,将该代码包装在以下代码中:

document.addEventListener("DOMContentLoaded", function(event) { 
 // Your jQuery code
});

一种解决方法是app.js在刀片主布局文件中提前加载,但我相信它可以以更好的方式完成。我对 Laravel 还很陌生,所以我仍在弄清楚这些事情......

编辑:

好的,我想我现在明白了如何正确地做到这一点:

  1. 在你的主要刀片布局中(在我的例子中app.blade.php),在</body>标签之前的右下角,加载你的 webpack 脚本,你可能加载的所有其他外部脚本,最后添加一个 yield scripts 部分。

例子:

<script src="/js/app.js"></script>
<script src="other/scripts/that/you/need.js"></script>
@yield('scripts')
  1. 在需要 jQuery 代码的刀片模板中,您无需直接将其添加到内容部分,而是创建一个名为scripts的新部分。

例子:

@section('content')
//Your view code
@endsection

@section('scripts')
//Your jQuery code
@endsection

这样,您的 jQuery 代码在主布局已经加载 webpack javascript 文件(加载 jQuery)之后加载。

于 2017-03-31T07:54:17.540 回答
0

只需在刀片文件中包含如下所示的 js 文件,在我的情况下,我包含 add-section.js ,它位于 public/js 中

<script src="{{ asset('/js/add-section.js') }}"></script>
@yield('scripts')
于 2017-05-22T09:11:43.277 回答