不用写 type="text/javascript",现代浏览器默认按 javascript 解析 script 标签;language 属性已废弃,完全不可用;仅 type="module"、type="importmap"、type="application/json" 需显式声明。

script 标签里还用不用写 type="text/javascript"
不用写了,现代浏览器默认就是 JavaScript,加了反而多余,还可能在某些严格模式下触发警告。
HTML5 规范明确把 type="text/javascript" 定义为可选且冗余的值;所有主流浏览器(Chrome、Firefox、Safari、Edge)从多年前就默认按 JavaScript 解析 <script></script> 内容,只要没显式指定其他类型(比如 module 或 importmap)。
- 写了
type="text/javascript"不报错,但白占字符,压缩工具(如 Terser)通常会直接删掉 - 如果混用
type="module",再写type="text/javascript"会导致解析失败——浏览器只认一个type属性,后者会覆盖前者 - 旧版 IE(≤8)确实依赖这个属性,但这类环境已无实际维护价值
那 language 属性呢?还能用吗
完全不能用了。language 是 HTML 3.2 时代的遗留属性,早在 HTML4 就被废弃,HTML5 中彻底移除。任何现代浏览器都不识别它,写了等于注释。
常见错误现象:<script language="javascript"></script> 在控制台不会报错,但该属性被静默忽略;如果同时写了 type 和 language,只有 type 生效。
- VS Code 或 WebStorm 等编辑器会标黄提示 “
languageis deprecated” - 使用 Lighthouse 或 axe 进行可访问性扫描时,会把它列为“过时的 HTML 属性”问题
- 某些老旧 CMS 模板或自动生成脚本仍残留该写法,建议全局搜索
language=并删除
什么时候必须写 type 属性
只有三种情况需要显式声明 type:
- 用 ESM 模块:
<script type="module"></script>—— 启用顶层 await、相对 import 等特性 - 注册 import map:
<script type="importmap"></script>—— 声明模块重映射规则 - 嵌入 JSON 数据(非执行):
<script type="application/json"></script>—— 防止被当作 JS 执行,常用于 SSR 数据打桩
注意:type="text/javascript" 和 type="application/javascript" 虽然语义上等价,但后者极少使用,也不推荐——没有兼容性收益,反而增加出错概率(比如拼错成 applicaiton)。
迁移时容易踩的坑
批量删掉 type="text/javascript" 和 language 很简单,但要注意两个隐蔽点:
- 构建工具插件(如 html-webpack-plugin 的旧模板)可能硬编码了
type,需检查 template 文件或插件配置项 - 某些测试环境(如 JSDOM v16 及更早)对缺失
type的 script 标签处理不一致,若单元测试突然失败,先确认 JSDOM 版本是否 ≥17 - 内联 script 如果含
或 <code>&字符,又没做转义,删掉type后可能意外触发 HTML 解析歧义(虽罕见,但在老版本 Vue/Nuxt SSR 模板中出现过)
最稳妥的做法:保留空 <script></script>,用 ESLint 规则 no-restricted-syntax 拦住新代码里再出现 language 或冗余 type。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











