我想在渲染 DOM 时从导入的模块中调用一个函数。让我怀疑其安全性的原因是模块文件是异步获取的。因此,我担心的是:是否有可能在文档准备好后获取所需的模块文件?
import someModule from '../someModule.js'
$( document ).ready(function() {
someModule.hello();
});
这段代码安全吗?
该代码是安全的。
如果您使用的是 DOMContentLoaded 而不是$(document).ready
,则可能需要担心。模块是异步加载的,模块本身导入的所有内容都是在模块主体运行之前加载的。那是:
import someModule from '../someModule.js'
将首先解析为someModule
导出的值,然后模块的其余部分才会运行:
$( document ).ready(function() {
someModule.hello();
});
文档的其余部分可能在那个时候已经完成加载,尤其是在依赖关系树中更高的导入链,并且源 HTML 很短的情况下。
但是 $(document).ready
不仅会在文档准备好时运行它的回调,如果文档已经准备好它也会运行它的回调 - 可以使用document.readyState
.
例子:
setTimeout(() => {
// the document will have been fully loaded for ages now,
// but the callback will still run:
$(() => {
console.log('running');
});
}, 5000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
如果您使用的是 DOMContentLoaded ,为了安全起见,您需要使用
if (document.readyState === 'complete') {
someModule.hello();
} else {
window.addEventListener('DOMContentLoaded', () => someModule.hello());
}
另请注意,在 jQuery 中,当文档准备好时调度回调的首选现代方法是将回调传递给$
:
$(() => {
someModule.hello();
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句