的引入<一个href="//www.oldmanjams.com/blog/new-in-symfony-the-ux-initiative-a-new-javascript-ecosystem-for-symfony" class="reference external">欧宝娱乐app下载地址Symfony用户体验计划一个很多酷的事情发生在Symfony世界相关的JavaScript。欧宝娱乐app下载地址<一个href="https://stimulus.hotwired.dev/" class="reference external" rel="external noopener noreferrer" target="_blank">刺激由于已经有伟大的集成Encore.enableStimulusBridge ()特性和<一个href="https://turbo.hotwired.dev/" class="reference external" rel="external noopener noreferrer" target="_blank">涡轮增压有巨大的潜在给server-rendered HTML温泉体验。

有关这一点,我想讲一个简单的改变只是发生了<一个href="https://github.com/symfony/recipes/pull/874" class="reference external" rel="external noopener noreferrer" target="_blank">欧宝娱乐app下载地址symfony / twig-bundle食谱

如果你开始一个新项目今天的位置{%块javascripts %}base.html.twig已经从页面的底部成吗<头>:

1 2 3 4 5 6 7 8 9 10 11 12
< !/ base.html——模板。树枝- - > < html > <头>{%块样式表%}{% endblock %}++{%块javascripts %} {% endblock %}< /头> <身体>{%块体%}{% endblock %}——{%块javascripts %} {% endblock %}< /身体> < / html >

从历史上看,这个住在页面的底部<脚本>标签不会被执行,直到页面已经完成加载。这是有两个原因:

  1. 当您的浏览器看到一个正常的<脚本>页面标签,它等待(块),下载并执行JavaScript。
  2. 你经常想要完整的HTML已经可以当你的JavaScript执行。

那么为什么我们移动javascript块进<头>吗?那不是更糟吗?事实上,它的更好的,只要你脚本标签有推迟属性。

“警告”:内联JavaScript不能延期< /h2>

当你使用< script src = " /应用程序。js "推迟>,这段代码会执行页面完成加载后,就像如果<脚本>标签的的页面。但内联JavaScript不能被延迟。

想象你有一个app.js文件创建一个全局变量:

1 2 3 4 5
/ / app.js/ /设置一个全局变量“应用程序”窗口.App = {/ /……}

然后你写一些“内联”JavaScript使用它在你的模板:

1 2 3 4 5 6 7 8 9
<html><><脚本src=“/ app.js”推迟>< /脚本><脚本推迟>/ /从app.js尝试使用应用程序变量App.initializeSomething ();< /脚本>< />< !——……- - >

如果你尝试,你会得到一个错误。

未捕获ReferenceError:应用程序没有定义

如果您有多个< script src = " /…”推迟>标签,他们渲染。问题是,“内联”JavaScript不能被延迟:它总是立即执行。这意味着App.initializeSomething ()被称为之前app.js

如果你有很多这样的内联JavaScript,那么你可能可以使用推迟。没问题:保持你的JavaScript页面的底部没有“推迟”。

但是,理想的解决方案是将所有你的内联JavaScript到外部JavaScript文件。这有时会很棘手,如果你想通过一个动态值成JavaScript。这可以通过设置一个全局变量和固定阅读在你的外部JavaScript:

1 2 3 4 5 6 7 8 9
< script src = " /应用程序。js "推迟>> < /脚本<脚本>——/ / JavaScript是“内联”所以我们可以使用树枝通过动态价值——App.initializeSomething ({{someDynamicValue}});从app.js + / /读这个+窗口。SOME_DYNAMIC_VALUE = ' {{someDynamicValue}} '> < /脚本

app.js,你可以阅读window.SOME_DYNAMIC_VALUE。另一个流行的方法是添加数据-一个元素和属性读取JavaScript。