目标:判断当前文件是否被直接执行(而不是被 import)
一、CommonJS(对照)
if (require.main === module) {
main();
}
二、ES Module 写法(核心)
import { fileURLToPath } from 'url';
if (process.argv[1] === fileURLToPath(import.meta.url)) {
main();
}
三、关键点(只记这 3 个)
import.meta.url→ 当前文件(URL)fileURLToPath()→ 转为本地路径process.argv[1]→ 启动入口文件路径
👉 判断本质:
入口路径 === 当前文件路径
四、推荐封装
import { fileURLToPath } from 'url';
export const isMain = (meta) => process.argv[1] === fileURLToPath(meta.url);
// 使用:
if (isMain(import.meta)) {
main();
}
五、关键技术点拆解(用于深入理解)
1️⃣ import.meta.url
返回当前模块的 URL,例如:
file:///Users/demo/index.js
2️⃣ fileURLToPath
将 file:// URL 转换为本地路径:
/Users/demo/index.js
3️⃣ process.argv[1]
Node 启动时的入口文件路径:
node index.js
# 得到:/Users/demo/index.js