type="module" 是必须添加的,否则浏览器会因执行上下文错误而抛出 syntaxerror;模块脚本需显式声明、路径带 .js 扩展名、禁用裸路径、须通过本地服务器运行、导入导出语法须严格匹配,且模块内变量不挂载 window。

type="module" 是必须加的,不加就报错
浏览器把普通 <script></script> 和模块脚本完全分开处理。没写 type="module" 的脚本,哪怕里面写了 import,也会直接抛 Uncaught SyntaxError: Cannot use import statement outside a module。这不是语法错,是执行上下文不对。
正确写法只有一种:<script type="module" src="main.js"></script> 或内联写法:<script type="module">import { foo } from './utils.js';</script>。注意:不能混用 async 和 defer —— type="module" 默认就是 defer 行为,加了反而冗余。
路径必须带 .js 扩展名,相对路径要以 ./ 或 ../ 开头
ES6 模块导入路径是静态解析的,浏览器不会自动补扩展名。写 import { helper } from './lib/helper' 会 404;必须写成 import { helper } from './lib/helper.js'。
- 绝对路径从根开始:
import config from '/assets/config.js' - 同级文件:
import { log } from './logger.js' - 上层目录:
import api from '../shared/api.js' - 不允许裸路径(如
import _ from 'lodash'),浏览器不支持包名解析
本地双击打开 HTML 一定会失败,得跑本地服务器
直接用 file:// 协议打开 HTML 文件时,模块加载会触发 CORS 错误,报 Failed to load module script: Expected a JavaScript MIME type 或更常见的 Cross origin requests are only supported for protocol schemes。这不是代码问题,是浏览器安全策略硬性限制。
解决方式只有两种:
- 用 VS Code 的 Live Server 插件点 “Go Live”,地址变成
http://localhost:5500/ - 命令行起一个简易服务:
npx serve或python3 -m http.server 8000
别试 open -a Safari index.html 这类操作,它永远过不了这一关。
export default 和命名导出别混用错,import 写法要严格对应
导出和导入必须一一匹配,常见翻车点:
-
export default function foo() {}→ 导入必须用import foo from './mod.js'(无花括号) -
export const PI = 3.14;→ 导入必须用import { PI } from './mod.js'(有花括号) -
export default function() {}+export const x = 1→ 可以混合导入:import defaultFunc, { x } from './mod.js' - 写成
import { defaultFunc } from './mod.js'就会报defaultFunc is not exported
模块作用域默认启用严格模式,且变量不会挂到 window 上——这点常被忽略,调试时找不到全局变量不是 bug,是设计如此。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











