Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 确定脚本是否直接由NodeJS模块调用_Javascript_Node.js_Es6 Modules - Fatal编程技术网

Javascript 确定脚本是否直接由NodeJS模块调用

Javascript 确定脚本是否直接由NodeJS模块调用,javascript,node.js,es6-modules,Javascript,Node.js,Es6 Modules,您如何知道是否直接使用NodeJS模块调用了脚本?(即,package.json指定“类型”:“模块”) 例如,您可能有两个文件,script1.js和script2.js我们可以在script2.js中使用script1.js的一些实用程序,但我们不希望在导入它时执行script1.js //script1.js export const func=()=>“可重用函数的输出” //TODO如果使用“node script1.js”执行,请执行以下操作: log(“我做了一个操作:+func(

您如何知道是否直接使用NodeJS模块调用了脚本?(即,
package.json
指定
“类型”:“模块”

例如,您可能有两个文件,
script1.js
script2.js
我们可以在
script2.js
中使用
script1.js
的一些实用程序,但我们不希望在导入它时执行
script1.js

//script1.js
export const func=()=>“可重用函数的输出”
//TODO如果使用“node script1.js”执行,请执行以下操作:
log(“我做了一个操作:+func())
//script2.js
从“/script1.js”导入{func}
//不应该有任何输出,因为没有直接调用script1!
在以前版本的NodeJS(commonjs样式)中,如果(!module.parent){/*…*/},则可以使用
,但在使用带有
“type”的NodeJS时,没有定义模块:“module”

,您可以检查:

process.argv[1]
,它将是启动nodejs时使用的脚本的路径

在文档中,它们显示了以下命令行的示例:

$ node process-args.js
将为
进程显示此信息。argv[1]

/Users/mjr/work/node/process-args.js
如果您将文件名解析掉,那么您可以将其与您自己模块的文件名进行比较

 import path from 'path';

 function getLaunchFile() {
     return path.basename(process.argv[1]);
 }

 if (getLaunchFile() === "script1.js") {
     // I am the main launch file
 }
如果您想动态获取当前模块的文件名,可以使用以下方法:

这样你就可以做到:

import { fileURLToPath } from 'url';

function isLaunchFile() {
    const launchFile = process.argv[1];
    const moduleFile = fileURLToPath(import.meta.url);
    return moduleFile === launchFile;
}

为了子孙后代,我将@jfriend00的方法打包到一个名为

从“is启动文件”导入isLaunchFile
if(isLaunchFile(import.meta.url)){
//这个文件是直接调用的。
}

香草解决方案的所有功劳都归于@jfriend00。

谢谢@jfriend00,我已将其打包到npm模块中。为了让其他人更容易使用。@seveibar-也许你已经解决了这个问题,但是在第二个版本中有一个错误,它将基本文件名与完整路径进行比较,因此从未匹配过。我已经修好了。另外,请注意,第二个版本比较了完整路径,因此像“index.js”这样的通用名称永远不会冲突。在第一个版本中,一个常见的文件名可能会产生假阳性。是的,我在库中纠正了(感谢改进答案:)这是NPM依赖HELL的原因。考虑到对于某些应用程序,每个文件可能包含一个需要执行的启动脚本。在我的例子中,这个函数会被重用5次。我没有将此功能记录为我的存储库的一部分,也没有增加维护人员的知识负担,而是将其隔离到一个包含文档和测试的包中。我知道,这是有争议的。到目前为止,我参与的每个JS项目在几个月后都会遇到不推荐的子依赖项,这些子依赖项的功能更简单。就我个人而言,外部依赖项的生命周期管理负担并不超过一个包含3行代码的函数的知识负担。我不确定最小化应用程序依赖项的正确标准是什么。从我的工作来看,这取决于大小(但这个包裹太小,不能成为负担)。我不确定我是否同意这样的观点,即它降低了维护成本(项目中的代码更少,不用担心,即使导入的包需要审计)。更复杂的框架依赖关系确实会导致代码腐烂,例如Angular 1.x会将代码放入“这可能需要完全重写”的存储桶中。也许“这是一个JS开发人员应该知道的模式”是合理的,但这种操作并不常见。