HTML5中script标签的type属性可省略,默认为text/javascript;仅type="module"有实质性行为差异,启用ES模块系统;type="application/json"等用于存储非执行数据。

不写 type 属性或 type="text/javascript":默认就是它
HTML5 中,<script></script> 标签省略 type 属性时,浏览器自动按 text/javascript 处理。显式写上 type="text/javascript" 和不写效果完全一样,纯属冗余——除非你还在维护需要兼容 HTML4 或 XHTML 的老项目。
常见错误现象:type="text/javascript" 在现代项目里反复出现,尤其在自动生成的模板或旧代码迁移中。它不会报错,但徒增字符、干扰可读性。
使用场景有限:
- 必须支持 IE8 及更早版本(它们不识别无
type的脚本) - 某些严格校验工具或 CMS 模板要求显式声明
type="module":现代模块脚本的唯一正确写法
这是目前唯一有实质性行为差异的 type 值:启用 ES 模块系统,自动开启严格模式,支持 import/export,且默认异步加载(类似 defer)。
立即学习“前端免费学习笔记(深入)”;
容易踩的坑:
从零开始创建惊艳、动画丰富且自包含的 HTML 演示文稿,或通过转换 PowerPoint 文件生成。当用户希望制作幻灯片、构建演示文稿、打造路演资料(pitch deck)、将 PPT/PPTX 转换为网页格式,或增强现有 HTML 演示文稿时,应使用此能力。该能力帮助用户通过视觉预览而非抽象选项来发掘自身审美偏好。
- 不能混用
type="module"和type="text/javascript"的全局变量——模块作用域隔离,window上找不到模块内声明的const - 本地文件系统直接双击打开 HTML 会触发 CORS 错误,必须走 HTTP 服务(如
npx serve) -
type="module"脚本无法通过document.write()注入,也不支持async+defer同时写(async已隐含)
type="application/json" 和 type="text/template":不执行,只存数据
这两个值的关键在于「浏览器跳过执行」——内容被当作文本节点保留在 DOM 中,供 JS 主动读取解析。
使用场景明确:
-
type="application/json":嵌入配置或初始数据,避免字符串拼接 HTML 或额外 AJAX 请求;读取时用JSON.parse(script.textContent) -
type="text/template":配合前端模板引擎(如 Handlebars、Underscore),把模板 HTML 写在<script></script>里,避免被渲染又不用display:none污染结构
注意点:type="application/json" 的内容必须是合法 JSON(不能有注释、尾逗号),否则 JSON.parse() 报 SyntaxError;而 type="text/template" 里的 HTML 不受 HTML 解析器约束,可以写未闭合标签或占位符。
其他 MIME 类型基本可以忽略
text/ecmascript、application/ecmascript、application/javascript 这些在规范里存在,但实际没区别,现代浏览器全当作 JavaScript 执行。连 MDN 都不推荐使用它们。
text/babel 或 text/typescript 属于历史遗留方案:依赖额外运行时(如 Babel Standalone)做客户端转译,性能差、调试难、已淘汰。现在都该走构建流程预编译。
真正容易被忽略的是 type="importmap"——它必须放在所有 type="module" 脚本之前,且内容是 JSON 格式映射表;写错位置或格式不合法,整个模块链就静默失败,控制台只报 “Failed to resolve module specifier”,不提示哪行出问题。


















