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

Symfony 6+Encore环境下如何在模板中访问jQuery($)

解决Symfony 6 Encore环境下模板内$未定义的问题

问题出在你给Encore脚本配置了defer: true——这个属性会让app.js延迟到DOM完全解析后才执行,但模板里的内联脚本是同步运行的。当内联脚本执行时,app.js还没加载完成,全局的$变量自然还没定义,所以会触发报错。

下面是几种解决办法:

方案一:移除defer配置

直接在webpack_encore.yaml里删掉defer: true相关配置:

# webpack_encore.yaml
...
# 删除以下内容
# script_attributes:
#       defer: true

这样app.js会同步加载,内联脚本就能正常访问$。但这种方式可能会略微影响页面加载性能。

方案二:让内联脚本等待依赖加载完成

把内联脚本改成等待DOM加载完成后再执行,或者先检查$是否存在:

{% block javascripts %}
    {{ parent() }}
    <script>
      // 监听DOM加载完成事件,确保app.js已执行
      document.addEventListener('DOMContentLoaded', function() {
        $(document).ready(function() {
          alert('success from template!');
        });
      });
    </script>
{% endblock %}

更稳妥的写法(应对极端情况下DOMContentLoaded先触发的场景):

{% block javascripts %}
    {{ parent() }}
    <script>
      function runTemplateScript() {
        if (typeof $ !== 'undefined') {
          $(document).ready(function() {
            alert('success from template!');
          });
        } else {
          // 延迟100ms后再次检查
          setTimeout(runTemplateScript, 100);
        }
      }
      runTemplateScript();
    </script>
{% endblock %}

方案三:将内联脚本整合到Encore打包流程

把模板里的脚本代码放到单独的JS文件(比如assets/js/template-scripts.js),然后在app.js里引入:

// app.js
...
const $ = require('jquery');
global.$ = global.jQuery = $;
// 引入模板脚本
require('./template-scripts.js');

$(document).ready(function() {
    alert('success from app.js');
})

template-scripts.js内容:

$(document).ready(function() {
  alert('success from template!');
})

这种方式最符合Encore的打包规范,也能从根源上避免脚本加载顺序问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:20:01