如何在html中引入js
- 前端开发
- 2025-07-26
- 6
标签实现,支持内联代码、外部文件(
src
属性)及模块化(
type=”module”
),并可用
defer
或
async`优化加载顺序
HTML中引入JavaScript(JS)是实现网页动态交互功能的核心步骤,以下是详细的方法和最佳实践:
基础方法
-
使用
<script>
- 直接嵌入代码:将JS代码写在
<script>
标签内部,适用于少量逻辑或特定位置的执行。<script type="text/javascript"> function showAlert() { alert("Hello World!"); } showAlert(); </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
),此时标签内不应再添加其他代码,否则会被忽略。
- 直接嵌入代码:将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>
元素,实现按需加载,例如根据用户操作触发特定功能模块:
function loadScript(url, callback) {
const script = document.createElement('script');
script.src = url;
script.type = 'text/javascript';
script.onload = callback; // 加载完成后的回调函数
document.head.appendChild(script);
}
loadScript('analytics.js', () => console.log('Analytics loaded'));
此方法常用于懒加载非首屏关键资源,提升首绘速度。
-
ES6模块化支持
使用 type="module"
开启严格模式,配合 import/export
实现模块化开发,浏览器会自动处理依赖关系并强制异步加载:
<script type="module" src="main.mjs"></script>
对应的模块文件可导出函数或类:
// main.mjs
export const fetchData = async () => { / ... / };
注意:模块必须通过服务器正确配置MIME类型才能正常工作,本地文件系统可能受限。
-
事件监听方式
利用 DOMContentLoaded
事件确保DOM就绪后再执行脚本,避免传统写法的位置依赖性:
document.addEventListener('DOMContentLoaded', () => {
// 安全操作DOM元素的代码
});
这种方式尤其适合不依赖特定加载顺序的场景。
性能优化策略
技术点
优势
适用场景
<body>
底部引入
最小化渲染阻塞
大多数常规脚本
defer
保持执行顺序+并行下载
有依赖关系的脚本堆栈
async
最高优先级异步加载
无依赖的第三方脚本
动态加载
按需请求资源
按需触发的功能模块
ES模块
静态分析+强封装
现代组件化开发
相关问答FAQs
Q1: 为什么有时脚本会找不到定义的元素变量?
A: 因为脚本执行时目标元素尚未被解析,解决方案包括:①将脚本移至 <body>
末尾;②使用 DOMContentLoaded
事件包裹逻辑;③采用 defer
确保DOM就绪后再执行。
Q2: 多个脚本之间的执行顺序如何保证?
A: 默认按HTML中出现的顺序依次执行,若使用 async
则会失去顺序保障,因此需要严格顺序的地方应改用 defer
,对于模块化脚本,浏览器会自动拓扑排序依赖关系