import { realpathSync } from "fs";
import { pathToFileURL } from "url";
function wasCalledAsScript() {
// We use realpathSync to resolve symlinks, as cli scripts will often
// be executed from symlinks in the `node_modules/.bin`-folder
const realPath = realpathSync(process.argv[1]);
// Convert the file-path to a file-url before comparing it
const realPathAsUrl = pathToFileURL(realPath).href;
return import.meta.url === realPathAsUrl;
}
if (wasCalledAsScript()) {
// module was executed and not imported by another file.
}
6条答案
按热度按时间dohp0rv51#
用途
有关详细信息,请参见
import.meta
上的MDN文档。更新日期:2021年9月27日
可能更健壮,但涉及额外的导入(通过Rich Harris)
os8fio9y2#
目前还没有(它仍处于实验阶段!)尽管主流观点认为这样的检查无论如何都是一个不好的做法,您应该为库和可执行文件提供单独的脚本,there is an idea为此提供一个布尔值
import.meta.main
属性。x8goxv8g3#
其他答案也很接近,但对于
package.json
文件中的bin
属性所公开的相当典型的用例cli脚本来说,可能会漏掉一些。这些脚本将在
node_modules/.bin
文件夹中进行符号链接。这些脚本可以通过npx
调用,也可以作为package.json
中的scripts
-对象中定义的脚本调用。在这种情况下,process.argv[1]
将是符号链接,而不是import.meta.url
引用的实际文件此外,我们需要将文件路径转换为实际的
file://
-url,否则它将无法在不同的平台上正常工作。我本来想把这个作为对公认答案的评论,但显然我不允许用一个新的帐户发表评论。
3ks5zfa04#
module
全局变量将在CommonJS中定义,但在ES模块中根本不存在。是的,这是不一致的,ES模块是 * 不 * 有module
变量的东西。可以通过查看
typeof v
是否为字符串(不是值!)'undefined'
来检查未定义的变量。这就变成了:
如果我们将该代码放入
.cjs
和.mjs
文件中,我们将得到正确的答案:628mspwn5#
我喜欢
import.meta.url ===
file://${process.argv[1]}``,但是它在Windows的bash shell中不起作用。这是一个只检查基本名称的替代方法:atmip9wb6#
现在似乎有一种记录在案的方法可以做到这一点: