如何在html中引入js
- 前端开发
- 2025-07-26
- 7
HTML中引入JavaScript(JS)是实现网页动态交互功能的核心步骤,以下是详细的方法和最佳实践:
基础方法
-
使用 <script>
- 直接嵌入代码
type="text/javascript" 可省略(HTML5默认为此值),但显式声明有助于可读性,注意避免在字符串中使用未经转义的 </script>,否则可能导致解析错误。
- 引入外部文件:通过 src 属性链接独立的.js文件,这是主流做法,便于维护和复用,语法如下: <script src="path/to/your/file.js"></script>
路径支持相对路径(如 js/main.js)或绝对URL(如 https://cdn.example.com/lib.js),此时标签内不应再添加其他代码,否则会被忽略。

-
放置位置的影响
- <head> 区域:会导致页面渲染受阻,因为浏览器必须等待脚本加载完成后才能继续解析后续内容,适合需要预加载的资源(如polyfill),但不推荐普通业务逻辑放在这里。
- <body> 末尾:这是优化性能的首选方案,由于此时DOM已完整构建,脚本能安全操作元素且不会阻塞渲染。 <!-Other HTML content --> <script src="app.js"></script>
-
控制加载行为的高级属性
- defer:延迟执行直到HTML解析完成,同时保持脚本按顺序加载,常用于依赖执行顺序的场景: <script src="vendor.js" defer></script> <script src="app.js" defer></script>
- async:尽快下载并独立于页面流执行,可能破坏依赖关系,适用于无依赖的第三方库(如广告统计代码): <script src="tracker.js" async></script>
- 对比选择:若脚本间存在依赖关系,优先用 defer;若无需等待其他资源,则选 async 加速并行加载。
-
动态加载脚本
可通过JS动态创建并插入 <script> 元素,实现按需加载,例如根据用户操作触发特定功能模块:

此方法常用于懒加载非首屏关键资源,提升首绘速度。
-
ES6模块化支持
使用 type="module" 开启严格模式,配合 import/export 实现模块化开发,浏览器会自动处理依赖关系并强制异步加载:
对应的模块文件可导出函数或类:
注意:模块必须通过服务器正确配置MIME类型才能正常工作,本地文件系统可能受限。

-
事件监听方式
利用 DOMContentLoaded 事件确保DOM就绪后再执行脚本,避免传统写法的位置依赖性:
document.addEventListener('DOMContentLoaded', () => { // 安全操作DOM元素的代码 });这种方式尤其适合不依赖特定加载顺序的场景。
进阶技术
性能优化策略
技术点 优势 适用场景 <body>底部引入 最小化渲染阻塞 大多数常规脚本 defer 保持执行顺序+并行下载 有依赖关系的脚本堆栈 async 最高优先级异步加载 无依赖的第三方脚本 动态加载 按需请求资源 按需触发的功能模块 ES模块 静态分析+强封装 现代组件化开发 相关问答FAQs
Q1: 为什么有时脚本会找不到定义的元素变量?
A: 因为脚本执行时目标元素尚未被解析,解决方案包括:①将脚本移至 <body> 末尾;②使用 DOMContentLoaded 事件包裹逻辑;③采用 defer 确保DOM就绪后再执行。
Q2: 多个脚本之间的执行顺序如何保证?
A: 默认按HTML中出现的顺序依次执行,若使用 async 则会失去顺序保障,因此需要严格顺序的地方应改用 defer,对于模块化脚本,浏览器会自动拓扑排序依赖关系
- 直接嵌入代码