如何动态加载脚本

315 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 N 天,点击查看活动详情

动态加载脚本

如何操作

除了使用HTML中的<script>标签,还有其他方式可以加载脚本——DOM操作。

我们可以使用document.createElement接口生成一个不处于现有DOM树中的节点。此时,我们可以像操作其他DOM元素一样对该节点进行各种节点操作。当然,他没有父节点,你要硬访问它的父节点的话,那他只能摆臭脸给你了。不能揭人伤疤不是。

若不进行操作,那么此时创建出来的节点是默认不带任何属性的空<script>节点【此处以当前主流浏览器Edge最新版110.0.1587.49为准】。此时浏览器不会解析该元素,所以对应的资源并不会被加载。当然也不会被执行。

在进行操作后,可以将该节点添加到DOM树中,此时,浏览器才会根据运行机制结合script标签以及文档内的内容,对该script标签引用的文件或内嵌的代码进行加载与执行。

如何优化

我们知道浏览器有一个预加载器是用来预加载资源的。

以DOM方式创建的<script>节点在进行加载的时候,是不经过浏览器预加载器的。这就会严重影响节点在获取资源时的优先级,这种情况可能会严重影响页面的性能。

为了避免这种情况。我们其实可以预先告知浏览器我们要用什么资源,让他预先请求加载。这样在等脚本被加入DOM中,就可在解析到时直接执行对应脚本。

而这种功能我们是通过link标签实现的。将rel属性指定为preload,预加载器就会加载指定的资源。当然这种标签一般放在<head>中。

示例:

<link rel="preload" href="链接.js">

示例

 创建一个脚本,将他放在body的最后一个子节点的位置上。让脚本输出“DOM动态创建并运行脚本+预加载优化”的字样,当然做预加载优化。

外部文件样式的写法

createScriptByDOM.js

console.log("DOM动态创建并运行脚本+预加载优化");

test.html

<head> <!--此处只写相关代码,省略规范代码-->
    <link rel="preload" href="createScriptByDOM.js">
</head>
<body>
    <script>
        let script = document.createElement("script");
        script.src = "createScriptByDOM.js";
        document.body.appendChild(script);
    </script>
</body>

内嵌代码的写法

test.html

<head> <!--此处只写相关代码,省略规范代码-->
    <link rel="preload" href="createScriptByDOM.js">
</head>
<body>
    <script>
        let script = document.createElement("script");
        script.innerHTML = 'console.log("DOM动态创建并运行脚本+预加载优化");';
        document.body.appendChild(script);
    </script>
</body>

句末语

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 N 天,点击查看活动详情