按需加载js的核心是运行时动态控制加载时机与条件,主要通过import()实现模块级异步加载并返回promise,或用document.createelement('script')手动插入脚本;二者均需自行处理错误、状态及路径规范,不可依赖html静态属性。

按需加载 JS 的核心是「运行时决定要不要加载、什么时候加载」,不是写死在 HTML 里。直接用 <script src="xxx.js"></script> 是静态加载,不满足“按需”;真要按需,得靠 JS 自己控制加载时机和条件。
用 import() 动态导入模块(推荐 ES Module 场景)
这是现代浏览器和构建工具(Vite/Webpack)原生支持的按需加载方式,会自动代码分割、生成独立 chunk,并返回 Promise。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 路径必须是字符串字面量或模板字符串,不能是拼接变量:
import('./utils/featureA.js')✅,import('./utils/' + name + '.js')❌(构建时无法分析依赖) - 加载失败必须
try/catch,否则 Promise reject 会导致白屏或未捕获异常 - 适用于组件级逻辑拆分,比如用户点击「导出 PDF」按钮后才加载
pdf-lib:button.addEventListener('click', async () => { try { const { generatePDF } = await import('./lib/pdf-generator.js'); generatePDF(data); } catch (err) { console.error('PDF 模块加载失败', err); } }); - 注意:动态
import()加载的是模块,不是裸脚本;如果目标文件没用export,需确保它有默认导出或用export default包裹逻辑
用 document.createElement('script') 手动插入(兼容老环境或简单脚本)
适合加载无模块依赖、纯函数式脚本(如统计 SDK、第三方小工具),但要自己管加载状态、重复加载、错误回调。
- 必须显式设置
script.src,且不能省略协议或路径前缀;相对路径以当前 HTML 文件为基准,不是 JS 文件位置 - 插入后可通过
script.onload和script.onerror监听结果,避免静默失败const script = document.createElement('script'); script.src = '/js/analytics.js'; script.onload = () => console.log('analytics loaded'); script.onerror = () => console.error('analytics failed'); document.head.appendChild(script); - 重复插入同一 URL 的 script 标签,浏览器通常会复用已缓存资源,但不会自动去重——建议加个全局标记避免多次插入
- 不支持
async/defer属性的细粒度控制;若需保证执行顺序,得等前一个 onload 后再创建下一个
为什么不能用 <script onload="xxx()"></script> 绑定到普通元素上?
onload 不是通用 HTML 属性,只对 、<img>、<iframe></iframe>、<script></script> 等少数元素有效。给 <div> 或 <code><article></article> 写 onload 完全无效,浏览器直接忽略。
- 想在某个元素渲染完后执行 JS,正确做法是监听
DOMContentLoaded,再用document.getElementById或querySelector拿到该元素操作 - 如果元素是异步插入(比如通过
fetch+innerHTML),那得在插入完成后手动调用初始化函数,不能依赖任何“自动 onload” - 部分框架(如 Vue)提供
v-if+mounted钩子模拟类似效果,但底层仍是 JS 控制生命周期,不是 HTML 原生能力
容易被忽略的坑:本地开发时 file:// 协议导致加载失败
双击打开 HTML 文件走的是 file:// 协议,现代浏览器会因 CORS 策略禁止加载本地 src 的 JS(报 net::ERR_FAILED 或 Access to script at 'file:///...' is denied)。
- 必须起本地服务:用
npx serve、python3 -m http.server,或 VS Code 的 Live Server 插件 - 路径错误时 Network 面板里能看到 404 或
ERR_ABORTED,重点检查请求 URL 是否和实际文件位置一致 - ES Module 脚本(
type="module")对路径更敏感:必须带扩展名(.js),且不能省略协议或斜杠










