如何根据条件引入js?js动态加载的几种方法
- 虚拟主机
- 2026-06-25
- 5
在Web开发中,根据特定条件动态引入JavaScript文件是一种优化页面性能、实现代码懒加载或按需加载功能的常见技术,这种方法可以避免在页面初始加载时下载所有脚本,从而减少首屏加载时间,提升用户体验,以下将详细阐述几种主流的实现方式及其适用场景。
使用原生JavaScript动态创建Script标签
这是最基础且兼容性最好的方式,通过DOM操作创建一个<script>元素,设置其src属性,然后将其插入到文档中。
核心逻辑步骤:
- 检查条件是否满足。
- 创建<script>元素。
- 设置src为所需的JS文件路径。
- 将元素追加到<head>或<body>中。
- (可选)监听onload或onerror事件以处理加载结果。
代码示例:
function loadScriptIfCondition(condition, url) { if (condition) { const script = document.createElement('script'); script.src = url; script.async = true; // 异步加载,不阻塞解析 script.onload = () => { console.log('脚本加载成功'); }; script.onerror = () => { console.error('脚本加载失败'); }; document.head.appendChild(script); } } // 使用示例 loadScriptIfCondition(window.innerWidth > 768, '/js/desktop-only.js');
优缺点分析:
- 优点:无需任何外部库,原生支持所有浏览器,控制粒度细。
- 缺点:需要手动处理加载状态(成功/失败),代码略显冗长。
使用ES6动态导入(Dynamic Import)
ES6引入了import()函数,它返回一个Promise,允许在运行时动态加载模块,这种方式更适合模块化开发,且能更好地处理依赖关系。
核心逻辑步骤:
- 在代码中调用import()函数。
- 将调用包裹在条件判断中。
- 使用.then()处理加载成功的模块。
代码示例:
async function loadModuleIfCondition(condition) { if (condition) { try { // 动态导入模块 const module = await import('./my-module.js'); module.default(); // 执行模块中的默认导出函数 } catch (error) { console.error('模块加载失败:', error); } } } // 使用示例 loadModuleIfCondition(localStorage.getItem('showAdvancedFeatures') === 'true');
优缺点分析:
- 优点:代码简洁,支持Promise链式调用,天然支持模块作用域,便于Tree Shaking。
- 缺点:需要浏览器支持ES6模块(现代浏览器均支持),旧版IE不支持。
使用HTML5的<link rel="preload">结合脚本加载
对于关键资源,可以使用preload提示浏览器提前加载资源,但需注意preload本身不会执行脚本,仅预加载,通常与动态脚本加载结合使用以实现更精细的控制。

对比表格:不同引入方式的特性对比
| 特性 | 动态创建 <script> | ES6 import() | <link rel="preload"> + 脚本 |
|---|---|---|---|
| 兼容性 |
极佳(所有浏览器)
| 良好(现代浏览器) | 良好(现代浏览器) |
| 执行方式 | 同步或异步执行 | 异步执行,返回Promise | 仅预加载,需额外脚本执行 |
| 模块支持 | 不支持(全局作用域) | 支持(模块作用域) | 不支持(全局作用域) |
| 错误处理 | 需手动监听 onerror | 使用 try...catch | 需手动监听加载事件 |
| 适用场景 | 传统项目、简单脚本 | 模块化项目、大型应用 | 关键资源预加载优化 |

