script标签的src属性必须设为绝对或相对url,不能是变量或表达式;浏览器仅在首次解析时根据静态src发起请求,动态赋值不触发加载。

script 标签的 src 属性必须是绝对或相对 URL,不能是变量或表达式
直接写 <script src="xxx.js"></script> 才能触发浏览器加载;如果把路径拼在 JS 里再赋值给 src(比如 el.src = someVar + '.js'),那只是 DOM 属性变更,不会触发二次加载。浏览器只在标签首次解析时根据静态 src 发起请求。
- ✅ 正确:直接写死路径
<script src="/static/lib/axios.min.js"></script> - ❌ 错误:
<script id="dynamic">document.getElementById('dynamic').src = 'api.js';</script>—— 不会加载 - ⚠️ 注意:路径中不能含未编码的空格、中文或特殊字符,否则加载失败且控制台报
net::ERR_ABORTED
动态插入 script 标签时,要等 onload 或 onerror 再执行依赖逻辑
用 document.createElement('script') 插入后,脚本是异步加载并执行的,后续代码不会自动等待。常见错误是插入后立刻调用刚引入的函数,结果报 xxx is not defined。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- ✅ 正确做法:绑定
onload回调,在里面调用新脚本暴露的 API - ✅ 示例:
const s = document.createElement('script');<br>s.src = '/utils/helper.js';<br>s.onload = () => { helper.doSomething(); };<br>s.onerror = () => { console.error('helper.js 加载失败'); };<br>document.head.appendChild(s); - ⚠️ 注意:
async默认为true,设async = false在现代浏览器已被忽略,不要依赖它来“同步”加载
多个 script 标签按顺序加载,但不保证执行顺序与 DOM 位置完全一致
当多个 <script src="..."></script> 连续写在 HTML 中,浏览器通常按顺序发起请求,但执行时机取决于各文件下载完成时间。如果前一个体积大、延迟高,后一个可能先执行(尤其开了 HTTP/2 多路复用)。
- ✅ 控制执行顺序:对有依赖关系的脚本,显式用
async=false(仅对内联脚本有效)不行,应改用defer或动态加载链式回调 - ✅ 更稳妥方案:只让第一个脚本动态加载第二个,形成明确依赖链
- ⚠️ 注意:
defer只对外部脚本生效,且会按书写顺序执行,但要求脚本必须在或顶部声明,不能在document.write或运行时插入
跨域脚本加载失败时,无法读取 error 详情,只能靠 onerror 捕获“Script error.”
从不同源(协议、域名、端口任一不同)加载的脚本,若执行出错,浏览器出于安全限制,会把真实错误信息屏蔽成笼统的 Script error.,event.error 为空,堆栈也拿不到。
- ✅ 解决办法:服务端响应头加
Access-Control-Allow-Origin: *,并在<script></script>标签上加crossorigin属性 - ✅ 示例:
<script src="https://cdn.example.com/lib.js" crossorigin></script> - ⚠️ 注意:加了
crossorigin后,如果服务端没配 CORS 响应头,脚本会被直接拒绝加载,控制台报CORS policy: No 'Access-Control-Allow-Origin' header
crossorigin 和服务端头是否配对。










