src属性必须设为绝对或相对URL,不能用本地文件路径;开发时需用HTTP服务器而非file://协议打开,推荐使用defer加载依赖DOM的脚本、async加载独立脚本。

script标签的src属性必须用绝对或相对URL,不能是纯文件名
直接写 src="main.js" 看似没问题,但一旦页面通过 file:// 协议打开(比如双击HTML文件),多数现代浏览器会因CSP或跨域限制拒绝加载JS——报错 net::ERR_FILE_NOT_FOUND 或静默失败。真正起作用的是路径解析逻辑:浏览器以当前HTML文件所在目录为基准,拼接 src 值。
实操建议:
- 开发阶段优先用本地服务器(如
python3 -m http.server或 VS Code Live Server),确保走http://协议 - 路径写法要明确:
src="./js/main.js"(同级js/目录)、src="../lib/utils.js"(上层目录)、src="/assets/script.js"(根相对路径) - 避免
src="js/main.js"这种无前缀写法——它会被当成同级子目录,容易因嵌套层级变化而失效
async和defer属性不兼容,选错会导致执行时机失控
async 和 defer 都让脚本异步下载,但执行时机完全不同:async 下载完立刻执行(可能打断DOM解析),defer 等DOM构建完、在 DOMContentLoaded 前按顺序执行。混用或误用会引发变量未定义、DOM元素找不到等问题。
实操建议:
- 加载第三方分析脚本(如Google Analytics)用
async,它不依赖页面结构 - 加载操作DOM的模块(如初始化菜单、绑定事件)必须用
defer,否则document.getElementById()可能返回null - 不要同时写
async defer——后者会被忽略,浏览器只认async - 内联脚本(无
src)不支持这两个属性,写了也无效
script标签放哪?位置影响执行顺序和阻塞行为
没加 async 或 defer 的外部脚本,默认同步阻塞:浏览器会暂停HTML解析,等JS下载、执行完才继续。放错位置轻则白屏卡顿,重则脚本报错中断渲染。
实操建议:
- 传统做法是把
<script src="..."></script>放在











