空 import 语句(如 import './logger.js')可仅执行模块副作用而不导入任何值,需写全路径含 .js 后缀,不可加花括号、变量名或 as 别名,且模块只执行一次。

直接用 import 语句导入模块路径,不写任何大括号、变量名或 as 别名,就能只执行模块代码、触发副作用,而不引入任何导出值。
语法写法很简单
比如你有一个工具模块 logger.js,里面只做初始化操作(如设置全局日志配置、打点埋点、监听事件),并不导出函数或变量:
console.log('Logger initialized');
window.addEventListener('error', (e) => {
console.warn('Global error caught:', e.error);
});在其他文件中只需这样写:
import './logger.js'; // ✅ 只执行,不导入任何东西
关键规则要记住
- 路径必须完整:支持相对路径(
./logger.js)或绝对路径(/src/utils/logger.js),但不能省略.js后缀 - 不能加花括号、不能写变量名、不能用
as,否则就变成导入命名导出或默认导出 - 该语句仍会触发模块加载和执行,包括模块顶层代码、
export声明前的逻辑、以及所有依赖的子模块 - 模块只执行一次,即使多个地方都写
import './logger.js',也只会初始化一遍
常见使用场景
- 全局 Polyfill 加载(如
import 'core-js/stable';) - 第三方库自动注册(如
import 'chart.js/auto';) - 样式注入(
import './styles/global.css';,配合构建工具) - 调试钩子或开发环境监控脚本
注意别和其它导入方式混淆
下面这些都不是“只执行副作用”:
-
import * as logger from './logger.js';→ 导入所有命名导出为对象 -
import logger from './logger.js';→ 尝试导入默认导出(若无则报错) -
import { init } from './logger.js';→ 导入指定命名导出
只有空 import 才纯粹执行不取值。


















