我有一组Astro组件可供我的应用调用:
apps/myProject
libs/components/header
在header.astro组件中,我有一个脚本,希望在呈现整个页面后运行该脚本:
<script is:inline>
console.log('hej!');
window.onload = (e) => {
console.log('loaded!');
};
</script>
正在打印'hej!'
,但没有打印'loaded!'
。这是为什么?
对我来说,不清楚组件的生命周期在Astro中是如何工作的,我已经按照this solution的方法将is:inline
属性添加到script标记中,但它仍然不起作用。
3条答案
按热度按时间j8ag8udp1#
将
*.astro
文件视为所有服务器端文件,您不能在但是你可以在astro文件的html部分使用
<script></script>
。下面的例子对我来说很好用。rsl1atfo2#
您应该能够在客户机上使用
hoist
加载模块。window.onload
是不必要的,因为ES模块会自动延迟。pgky5nke3#
溶液
解决方案应简单到
其产生
误解和误导性解决方案
问题解决方案建议
这个脚本在
page.astro
中工作,如果问题假装它不工作,提供更多的元素如完整的示例项目是非常重要的,因为错误很可能是其他地方而不是在提供的代码中。我在一个默认的astro示例中使用了它,它会生成以下输出
但由于不需要Windows.OnLoad而不是理想的:参见When to use "window.onload"?
请参见此处作为测试基础的天文学官方示例(https://github.com/withastro/astro/tree/main/examples)
添加前页分隔
下面的解决方案不必要地添加了
--- ---
,它是可选的前页条目,当不可用时,内容被解释为脚本应该位于的第二个正文部分增加型模块或提升机
please udpate and see https://docs.astro.build/en/migrate/#new-default-script-behavior
从那里你会知道:
<script hoist>
是新的默认<script>
行为。hoist
属性已被删除。要使用新的默认行为,请确保<script>
标记上没有其他属性。例如,如果以前使用过type="module"
,请将其删除。使用的是:内联
这个问题的作者已经被另一个帖子(How to use document and window element in astro JS?)误导了,理所当然地认为这是错误的,我提交了一个答案来纠正它,因为
<script>
中的is:inline
是不需要的,并有意想不到的副作用,如不必要地复制脚本代码,请参阅这个答案的直接链接有如何在astro JS中使用文档和窗口元素?