首页 / HTML5 入门教程 / script 标签:引入 JavaScript

HTML5 入门教程

script 标签:引入 JavaScript

本教程共 110 篇 · 第 9 篇 · 更新于 2026-07-28 · 约 6 分钟阅读

HTML5HTML5 入门教程script标签JavaScriptasyncdefertype-module

9. script 标签:引入 JavaScript

本节目标:学会在 HTML 中引入 JavaScript,理解 async、defer、type=“module” 的区别。

HTML 和 CSS 只能做静态页面。想让页面”动起来”,需要 JavaScript。

两种引入方式

内联脚本

直接写在 <script> 标签里:

<script>
  alert('Hello, World!');
</script>

外部脚本

引入 .js 文件:

<script src="app.js"></script>
Tip

和 CSS 一样,实际项目中推荐用外部脚本。HTML 和 JS 分开,代码更好维护。

script 标签放在哪里

传统做法是放在 <head> 里。但更好的做法是放在 </body> 之前:

<body>
  <h1>页面内容</h1>

  <script src="app.js"></script>
</body>

为什么? 浏览器从上到下解析 HTML。如果脚本在 <head> 里,浏览器会先下载执行脚本,然后才渲染页面内容,用户会看到白屏。

把脚本放在底部,页面内容先渲染出来,用户体验更好。

async 属性

<script src="app.js" async></script>

async 告诉浏览器:异步下载脚本,下载完就执行

  • 下载过程不阻塞页面渲染
  • 执行时会阻塞(暂停渲染来执行脚本)
  • 不保证执行顺序,哪个先下载完哪个先执行

适合独立的脚本,比如统计代码、广告代码。

defer 属性

<script src="app.js" defer></script>

defer 告诉浏览器:异步下载脚本,等 HTML 解析完再执行

  • 下载过程不阻塞页面渲染
  • 等整个页面解析完才执行
  • 保证执行顺序,按在文档中的顺序依次执行

defer 是最推荐的引入方式。

async vs defer 对比

属性下载执行时机执行顺序
无(普通)阻塞立即执行按顺序
async不阻塞下载完就执行不保证
defer不阻塞HTML 解析完后按顺序

type=“module”

现代 JavaScript 支持模块化,用 type="module"

<script type="module" src="main.js"></script>

特点:

  • 自动启用严格模式
  • 支持 importexport
  • 默认是 defer 行为
  • 每个模块有独立作用域
<script type="module">
  import { greet } from './utils.js';
  greet('World');
</script>

nomodule 属性

老浏览器不支持模块,可以用 nomodule 提供降级方案:

<script type="module" src="modern.js"></script>
<script nomodule src="legacy.js"></script>

现代浏览器会忽略带 nomodule 的脚本,老浏览器会执行它。

小结

  • <script> 标签引入 JavaScript
  • 推荐放在 </body> 之前
  • async 异步下载、下载完就执行
  • defer 异步下载、页面解析完再执行(推荐)
  • type="module" 启用 ES 模块化

下一节,我们讲 HTML 注释。