【问题标题】:Laravel 5 WebPack JQuery - $ is not definedLaravel 5 WebPack JQuery - $ 未定义
【发布时间】:2019-01-06 19:33:27
【问题描述】:

我有 webpack.min.js:

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

mix.sass('resources/assets/styles/index.scss', 'public/css/app.css')
    .js('resources/assets/scripts/index.js', 'public/js/app.js')
    .copyDirectory('resources/assets/static', 'public/static')
    .version()
    .sourceMaps();

和 package.json:

"devDependencies": {
    "jquery": "^3.3.1",
    "axios": "^0.18.0",
    "bootstrap": "^4.1.3",
    "bootstrap-datepicker": "^1.7.1",
    "browser-sync": "^2.24.6",
    "browser-sync-webpack-plugin": "^2.0.1",
    "chart.js": "^2.7.2",
    "cross-env": "^5.2.0",
    "datatables": "^1.10.18",
    "easy-pie-chart": "^2.1.7",
    "font-awesome": "4.7.0",
    "fullcalendar": "^3.9.0",
    "jquery-sparkline": "^2.4.0",
    "jvectormap": "^2.0.4",
    "laravel-mix": "^2.1.11",
    "load-google-maps-api": "^1.2.0",
    "lodash": "^4.17.10",
    "masonry-layout": "^4.2.2",
    "perfect-scrollbar": "^1.1.0",
    "popper.js": "^1.14.3",
    "skycons": "^1.0.0",
    "vue": "^2.5.16"
  }

在我的刀片页脚脚本中:

@section('footer')
    <script type="text/javascript">
        if (typeof jQuery != 'undefined') { alert(jQuery.fn.jquery); }

        $(function() {
        $('#cc-number').validateCreditCard(function(result) {
            $('.log').html('Card type: ' + (result.card_type == null ? '-' : result.card_type.name)
                + '<br>Valid: ' + result.valid
                + '<br>Length valid: ' + result.length_valid
                + '<br>Luhn valid: ' + result.luhn_valid);
        });
        });
    </script>
@endsection

在我运行npm run dev 并加载我的页面后,我收到错误:

未捕获的引用错误:$ 未定义

我的alert(jQuery.fn.jquery); 没有被触发

我如何从 npm 加载 jquery,然后我可以在刀片中的内联 html 代码中使用它?

【问题讨论】:

    标签: jquery laravel laravel-5 webpack laravel-5.6


    【解决方案1】:

    在 app.blade.php 中

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

    去掉 defer 所以做它

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

    https://github.com/laravel/framework/issues/17634#issuecomment-375473990

    【讨论】:

    • defer 是干什么用的?
    • defer 表示只有在加载其他所有内容时才会加载脚本
    【解决方案2】:

    在你的 main.js 文件中试试这个

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

    【讨论】:

    • 哪个 main.js 文件?在这里:resources/assets/scripts/index.js?
    • 无论如何,在resources/assets/scripts/index.js 中添加global.$ = global.jQuery = require('jquery'); 即可解决问题 - 谢谢!
    • 对于其他使用 Laravel 5.8 找到此主题的人:如果您的 app.blade.php 中有 &lt;script src="{{ asset('js/app.js') }}" defer&gt;&lt;/script&gt; 标签,只需将其移动到 body 标签的末尾并删除 defer 语句.这应该可以解决问题,并且仍然可以与 vue.js 一起正常工作
    【解决方案3】:

    当我尝试使用它提供的一些默认视图时,我在 Laravel 5.7 中遇到了这个问题。我试图在一些扩展默认 layout/app.blade.php template 的刀片视图模板中使用 JavaScript(需要使用 jQuery)。

    但对我来说问题不是window.$ 没有被分配window.jQuery 库,因为就resources/js/bootstrap.js 文件而言,它正在被添加。 (这是一个似乎被 Laravel Mix 预编译为 public/js/app.js 的文件。您可以通过查看 webpack.mix.js 看到这种情况,在其中,您会发现以下语句:

    mix.js('resources/js/app.js', 'public/js')

    在哪里

    resources/js/app.js 需要 resources/js/bootstrap.js

    如果您希望自己手动编译,请先运行:

    npm install 然后npm run dev 在开发模式下,或npm run prod 在生产模式下。

    但无论如何(我跑题了)......

    原来问题出在这里:

    resources/views/layouts/app.blade.php

    有一个带有 defer 属性的脚本标记实例,如下所示:

    &lt;script src="{{ asset('js/app.js') }}" defer&gt;&lt;/script&gt;

    defer 属性导致了所有问题。

    所以我像这样删除了它:

    &lt;script src="{{ asset('js/app.js') }}"&gt;&lt;/script&gt;

    解决了jQuery未定义的问题。

    我更喜欢通过简单地将脚本标签移近body HTML 标签的末尾来延迟我的 JavaScript 加载。

    【讨论】:

    • 如果你使用 Vue.js,defer 声明似乎是必要的。如果您只是将&lt;script&gt; 标签移动到&lt;body&gt; 标签的末尾,它也可以正常工作。不知道他们为什么把它放在那里
    • 在我的情况下它会导致问题,即使我已经将脚本标签放在正文的末尾。 defer 到底是为了什么?
    【解决方案4】:

    我在 jQuery 中使用 mix.copy 而不是 mix.js,效果很好!

    示例:

    mix.copy('node_modules/jquery/dist/jquery.min.js', 'public/vendor/jquery/jquery.min.js');
    

    【讨论】:

    • 然后在&lt;/body&gt;之前添加&lt;script src="{{ asset('vendor/jquery/jquery.min.js') }}"&gt;&lt;/script&gt;
    猜你喜欢
    • 2021-03-01
    • 2021-05-11
    • 2018-05-08
    • 1970-01-01
    • 2017-07-12
    • 2021-03-09
    • 2020-06-29
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多