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