原生ES模块不支持静态import CSS,因浏览器仅执行JavaScript类型脚本;assert仅动态import有效;动态import需满足type="module"、HTTP服务返回text/css且带CORS头、手动注入adoptedStyleSheets;推荐用link标签或构建工具处理。

import './style.css' 直接报错:浏览器不认 CSS 为模块
因为原生 ES Modules 规范禁止静态 import 加载非 JavaScript 资源,import './style.css' 会被浏览器当作 JS 模块加载,但服务端返回的 MIME 类型是 text/css,而浏览器只执行 application/javascript 类型的脚本——所以直接抛出 TypeError: Failed to fetch dynamically imported module 或 MIME type ('text/css') is not executable。
assert { type: 'css' } 写了还是报错:静态 import 不支持 assert 子句
ECMAScript 的 CSS Import Assertions(assert { type: 'css' })目前仅在动态 import() 中有效,静态 import 语句中写 assert 会被浏览器完全忽略(规范明确禁止)。即使你写了 import './style.css' assert { type: 'css' },Chrome 124+/Firefox 125+/Safari 17.4+ 也会当作非法语法或静默跳过,最终仍走老路径校验 MIME 类型,照样失败。
动态 import('./x.css', { assert: { type: 'css' } }) 也失败:缺三样东西
能跑通的最小前提有三个,缺一不可:
- 调用必须在
type="module"的脚本内(不能在普通<script></script>或 Node.js 环境) - CSS 文件必须通过 HTTP(S) 服务返回,且响应头含
Content-Type: text/css和Access-Control-Allow-Origin(file://协议下必被 CORS 拦截) - 加载成功后必须手动注入:得到的不是字符串,而是
CSSStyleSheet实例,需赋值给document.adoptedStyleSheets
替代方案其实更稳:别硬刚原生 import CSS
目前真正跨浏览器、免配置、不依赖新特性的做法仍是传统方式:
立即学习“前端免费学习笔记(深入)”;
- 用
<link rel="stylesheet" href="./style.css">—— 兼容所有浏览器,无 MIME/CORS 风险 - 构建工具场景(Vite/Webpack)里,CSS 由 loader 处理,
import './style.css'是合法的,但那已不是原生 ESM 行为,而是构建时重写 - 如果真要模块化管理样式,优先考虑 CSS-in-JS 或
adoptedStyleSheets+ 动态import()组合,而不是强求静态import
最常被忽略的一点:所谓“原生支持 import CSS”,本质是把 CSS 当作可编程资源来操作,不是为了图个写法简洁。一旦脱离 adoptedStyleSheets 这一关键链路,光有 import() 返回的 CSSStyleSheet 也没法生效。


















