目前浏览器不支持在模块脚本中用import语句直接导入CSS或HTML文件;唯一跨浏览器、零兼容风险的方式是使用<link rel="stylesheet" href="main.css">。

目前浏览器**不支持**在模块脚本中用 import 语句直接导入 CSS 或 HTML 文件作为样式或模板资源——这不是语法错误,而是标准尚未落地。
import 'style.css' with {type: 'css'} 仍是实验性功能
该写法源自 TC39 Import Attributes 提案(Stage 3),目标是让 JavaScript 模块能安全、明确地加载非 JS 资源。但截至 2026 年 6 月:
- Chrome、Edge 和 Deno 的部分版本已启用该功能,但需手动开启 flag(如 Chrome 的
chrome://flags/#enable-import-attributes); - Firefox 和 Safari 尚未默认支持,也未宣布稳定启用时间表;
- 所有主流稳定版浏览器(包括 Chrome 125+、Safari 17.5、Firefox 126)仍会报错:
Unexpected token 'with'或Invalid left-hand side in assignment。
CSS 资源仍应走 <link rel="stylesheet">
这是唯一跨浏览器、零兼容风险的方式:
- HTML 中引入外部样式必须使用
<link rel="stylesheet" href="main.css">; - 若需动态加载,可用
constructable stylesheets(new CSSStyleSheet())配合fetch+replaceSync,但仅限现代浏览器(Chrome ≥86,Firefox ≥94,Safari ≥17.4); - 不要尝试
import './theme.css' with {type: 'css'}用于生产环境——它不是当前 Web 标准的一部分。
HTML 模板暂无原生 import 支持
虽然 Import Attributes 提案提及未来可能支持 type: 'html',但该能力尚未进入任何浏览器的实现阶段:
立即学习“前端免费学习笔记(深入)”;
- 当前无法写
import template from './card.html' with {type: 'html'}; - 实际项目中,HTML 片段常用方式仍是:
fetch('./card.html').then(r => r.text()),或封装为自定义元素(class Card extends HTMLElement); - 构建工具(如 Vite、esbuild)可通过插件预编译 HTML 模板为 JS 字符串,但这属于工程层方案,非浏览器原生能力。
真正可用的模块化路径是组合式实践
想在现代浏览器中安全组织样式与结构,推荐以下已被广泛验证的组合:
- JS 逻辑用
<script type="module">+ 静态import; - CSS 用
<link rel="stylesheet">,或通过adoptedStyleSheets注入 constructable stylesheet; - HTML 模板用
<template>标签 +document.importNode,或基于customElements.define封装; - 需要类型断言时(如 JSON),可放心使用
import data from './config.json' with {type: 'json'}——该用法已在 Chrome、Node.js、Deno 稳定支持。



















