You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中JQuery仅在app.js生效,全局调用报错求助

问题分析

你遇到的$ is not defined报错,核心原因是脚本执行时机不匹配:Laravel Mix 默认会给生成的app.js添加defer属性,这意味着app.js会延迟到DOM加载完成后才执行;而你通过@push添加的脚本没有defer,会立即执行——此时app.js里的window.$ = $还没运行,自然找不到$。另外布局中@livewireScripts的加载顺序也加剧了这个问题。

解决方案

以下是几种可行的解决方式,按需选择:

方案1:调整加载顺序并禁用defer

修改Blade布局,把app.js放到@livewireScripts前面,确保jQuery先被挂载到全局:

<script src="{{ mix('js/app.js') }}"></script>
@livewireScripts
@stack('scripts')

然后修改webpack.mix.js,禁用默认的defer属性:

mix.js('resources/js/app.js', 'public/js')
   .options({
       scriptAttributes: {
           defer: false
       }
   });

方案2:给自定义脚本添加defer

保持现有布局不变,给@push里的脚本加上defer,让它和app.js同步延迟执行:

@push('scripts')
    <script defer>
        $(function () {
            alert("Hello");
        });
    </script>
@endpush

方案3:用Webpack全局注入jQuery

在webpack.mix.js中配置ProvidePlugin,自动给所有模块注入jQuery,无需手动挂载到window:

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

mix.js('resources/js/app.js', 'public/js')
   .webpackConfig({
       plugins: [
           new webpack.ProvidePlugin({
               $: 'jquery',
               jQuery: 'jquery',
               'window.jQuery': 'jquery'
           })
       ]
   });

之后可以删掉app.js里的window.$ = $;,jQuery会自动成为全局变量。

方案4:如果用Livewire 3,改用@script标签

Livewire 3推荐用@script标签管理组件内脚本,它会自动处理执行时机,确保依赖加载完成:

@script
<script>
    $(function () {
        alert("Hello");
    });
</script>
@endscript

内容的提问来源于stack exchange,提问作者AzafoCossa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:25:28