Laravel mix Uncaught ReferenceError:未定义jQuery

时间:2018-03-18 18:25:53

标签: jquery laravel laravel-mix

我正在使用laravel mix捆绑我的js库和代码。我试图使用ES6样式导入并尽可能使用ES6代码。我还需要导入jQuery及其库。

所以,我已经导入了jQuery和bootstrap:

import "jquery";
import "bootstrap";

首先,当我导入它时,我得到了:

Uncaught ReferenceError: jQuery is not defined
    at Object../node_modules/bootstrap/js/transition.js (vendor.js?id=74f7f0c463b407c6bdf5:2449)

这是由于bootstrap没有得到jQuery。

为了解决这个问题,我添加了这个配置来用jquery

替换$,jQuery
mix.webpackConfig(webpack => {
    return {
        plugins: [
            new webpack.ProvidePlugin({
                $: 'jquery',
                jQuery: 'jquery',
                'window.jQuery': 'jquery',
            })
        ]
    };
});

这适用于需要jQuery的每个脚本和库。

现在问题在于我们添加的其他脚本没有使用单个js或使用刀片部分进行混合。

@section('scripts')
    <script type="application/javascript">
        window.onload = function() {
            if (window.jQuery) {
                // jQuery is loaded
                console.log("Yeah!");
            } else {
                // jQuery is not loaded
                console.log("Doesn't Work");
            }
        }
       $().ready(function () {
        console.log('works');
      })
    </script>
@endsection

控制台错误显示:

datatables:125 Uncaught ReferenceError: $ is not defined
    at datatables:125
(anonymous) @ datatables:125
vendor.js?id=2b5ccc814110031408ca:21536 jQuery.Deferred exception: $(...).uniform is not a function TypeError: $(...).uniform is not a function
    at HTMLDocument.<anonymous> (http://localhost/assets/admin/app.js?id=da888f45698c53767fca:18419:18)
    at mightThrow (http://localhost/assets/admin/vendor.js?id=2b5ccc814110031408ca:21252:29)
    at process (http://localhost/assets/admin/vendor.js?id=2b5ccc814110031408ca:21320:12) undefined
jQuery.Deferred.exceptionHook @ vendor.js?id=2b5ccc814110031408ca:21536
process @ vendor.js?id=2b5ccc814110031408ca:21324
setTimeout (async)
(anonymous) @ vendor.js?id=2b5ccc814110031408ca:21358
fire @ vendor.js?id=2b5ccc814110031408ca:20986
fireWith @ vendor.js?id=2b5ccc814110031408ca:21116
fire @ vendor.js?id=2b5ccc814110031408ca:21124
fire @ vendor.js?id=2b5ccc814110031408ca:20986
fireWith @ vendor.js?id=2b5ccc814110031408ca:21116
ready @ vendor.js?id=2b5ccc814110031408ca:21596
completed @ vendor.js?id=2b5ccc814110031408ca:21606
datatables:122 Doesn't Work
vendor.js?id=2b5ccc814110031408ca:21545 Uncaught TypeError: $(...).uniform is not a function
    at HTMLDocument.<anonymous> (app.js?id=da888f45698c53767fca:18419)
    at mightThrow (vendor.js?id=2b5ccc814110031408ca:21252)
    at process (vendor.js?id=2b5ccc814110031408ca:21320)

当我使用laravel mix编译和混合脚本时问题得到解决但是当我在刀片中编写相同的脚本或使用而不使用混合时,它显示jQuery / $未定义错误。

在这种情况下,最好的方法是什么?

母版页如下:

<body>
    @yield('body')

    <script src="{{ mix('/assets/admin/manifest.js') }}"></script>
    <script src="{{ mix('/assets/admin/vendor.js') }}"></script>
    <script src="{{ mix('/assets/admin/app.js') }}"></script>

    @section('scripts')
    @show

    @yield('footer')
</body>

3 个答案:

答案 0 :(得分:1)

之前:

<script src="{{ asset('js/app.js') }}" defer></script>

之后:

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

布局对我有用。

答案 1 :(得分:0)

根据this answer,您需要以这种方式导入jquery

window.$ = window.jQuery = require('jquery');

答案 2 :(得分:0)

这是一个古老的问题,但是,这可能会帮助其他人找到答案。

供应商js需要花费一些时间来加载,而我们在刀片服务器模板中使用的嵌入式javascript会在供应商js完全加载之前触发。

要解决此问题,请将内嵌javascript封装在setTimeout函数中,如下所示:

@push('scripts-or-whatever')
<script>
    setTimeout(function(){
       // $, jQuery, Vue is all ready to use now
       $(document).ready(function(){ // code here })
    }, 100)
</script>
@endpush