`if __name__ == '__main__'` 在 javascript es6 模块中等效

2023-12-23

是否可以检查 JavaScript 文件是否直接运行,或者是否需要作为 es6 模块导入的一部分。

例如,包含一个主脚本。

// main.js
import './other';

if (mainTest){
  console.log('This should run');
}

它导入一个依赖项。

// other.js
if (mainTest){
  console.log('This should never run');
}

包括<script src=main.js></script>应该会导致控制台消息main.js但不是 other.js。

我找到了回答这个关于节点的问题 https://stackoverflow.com/questions/4981891/node-js-equivalent-of-pythons-if-name-main,但我对 es6 导入特别感兴趣


ES6 模块的替代方案是现在支持 https://nodejs.org/docs/latest-v12.x/api/esm.html#esm_import_meta在节点中。使用新的import.meta内置。 (别忘了设置"type": "module" https://nodejs.org/api/packages.html#packagejson-and-file-extensions in package.json.)

Example

// main.js
import "./lib.js"
import { fileURLToPath } from "url";

if (process.argv[1] === fileURLToPath(import.meta.url)) {
  console.log("I print to stdout!");
}
// lib.js
import { fileURLToPath } from "url";

if (process.argv[1] === fileURLToPath(import.meta.url)) {
  console.log("I don't run, because I'm an imported module.");
}

$ node main.js output:

I print to stdout!

实用功能

我喜欢只是import { isMain } from "./lib/utils.js"并通过import.meta.url to isMain().

import { argv } from "process"
import { fileURLToPath } from "url"
/**
 * Check if a module is the main module launched with the node process.
 * Meaning the module is NOT imported by another module,
 * but was directly invoked by `node`, like this: `$ node main.js`
 *
 * @example
 * ```js
 * // main.js
 * import lib from "./lib.js"
 * import { isMain } from "./utils.js"
 *
 * if (isMain(import.meta.url)) {
 *   console.log("I print to stdout")
 * }
 *
 * // lib.js
 * import { isMain } from "./utils"
 *
 * if (isMain(import.meta.url)) {
 *   console.log("I don't run, because I'm an imported module")
 * }
 * ```
 *
 * @param {string} moduleUrl needs to be `import.meta.url`
 * @returns {boolean} true if the module is the main module
 */
export function isMain(moduleUrl) {
  const modulePath = fileURLToPath(moduleUrl)
  const [_binPath, mainScriptPath] = argv
  return modulePath === mainScriptPath
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

`if __name__ == '__main__'` 在 javascript es6 模块中等效 的相关文章

随机推荐

  • Room 中是否可以忽略基本更新中的字段

    我有以下实体 Entity class Foo PrimaryKey ColumnInfo name id val id Long ColumnInfo name thing1 val thing1 String ColumnInfo na
  • 将 SQLAlchemy 会话与 Celery 一起使用的正确方法是什么?

    我已经尝试弄清楚这个问题有一段时间了 但我现在找到的很多答案都已经过时 超过 6 年前的帖子 或者相关性较低 问题实际上是如何在 celery 中正确处理数据库会话 我当前的设置是 我有一个全局 DbEngine 对象 其中包含dsn en
  • 快速将 Excel 导入数据表

    我正在尝试将 Excel 文件读入 Data DataTable 列表中 尽管使用我当前的方法可能需要很长时间 我基本上是逐个工作表 逐个单元地进行操作 这往往需要很长时间 有没有更快的方法来做到这一点 这是我的代码 List
  • 如何禁用/隐藏 vscode-python 中的变量分组

    最近的 ms python 扩展 v2020 5 86806 https github com microsoft vscode python releases tag 2020 5 86806 for vscode 在调试控制台 变量资源
  • 部署到生产时找不到索引视图?

    尝试将 MVC 应用程序部署为现有 ASP NET 3 5 应用程序 非 MVC 的子应用程序时 我遇到了问题 错误是 The view index or its master could not be found The followin
  • 如何阻止 WPF KeyDown 事件从某些包含的控件(例如 TextBox)中冒泡?

    我的程序非常大 并且使用 WPF 我想要一个使用 R 的全局快捷键 不带修饰符 有许多控件 例如 TextBox ListBox ComboBox 等 它们都在控件本身内部使用字母 这很好 这对我来说是正确的 But 我想阻止 KeyDow
  • 如何在一个proc打印语句中打印多个数据集?

    我有一个 sas 查询 如果我创建了 3 个数据集 可以说命名为ds1 ds2 ds3 现在 我想在一个 proc print 语句下打印所有这些 那么我们该怎么做呢 就像 我想要这样的东西 proc print data work ds1
  • 在 GPU 上计算图像相似度 [OpenGL/遮挡查询]

    OpenGL 假设我绘制了一幅图像 然后使用 XOR 绘制了第二幅图像 现在我在某处有了带有非黑色像素的黑色缓冲区 我读到可以使用着色器来计算 GPU 上的黑色 rgb 0 0 0 像素 我还读到它必须与 OcclusionQuery 做一
  • 在自定义静态框架 iOS 中使用 magicrecords 库

    我一直在为 iOS 实现一个自定义静态框架 一切都运行良好 但现在我意识到我需要通过框架中的 coredata 存储信息 我一直在之前的项目中使用 magicrecord 库 我想知道是否有人有将 magicrecord 集成到您自己的自定
  • 获取 LinkedHashSet 的最后一个

    我想存储数字 1 2 3 4 的列表 让我们从List
  • Proguard 保留接口方法参数名称

    我使用 keepparameternames 但它不响应界面 The interface s methond parameter is proguard Thank you for your help Proguard 可以很好地保留参数名
  • LISTAGG 奇怪的串联[重复]

    这个问题在这里已经有答案了 当我使用下面的查询来获取所需的详细信息时 SELECT USERNAME FULLNAME DEPARTMENT LISTAGG TASKNAME WITHIN GROUP ORDER BY TASKNAME T
  • 如何在 Xamarin 中获取 GoogleApiClient?

    我想实现类似的东西this https stackoverflow com a 25173057 2611340在我在 Xamarin 中开发的 Android 应用程序中 但找不到其中的命名空间GoogleApiClient是 有人可以帮
  • Blackberry OS 4.5 应用程序的通知服务

    我正在开发一个类似于电子邮件应用程序的应用程序 每当收到新消息时 我的通知服务应通过更新图标向用户指示更改 此外 通知服务应持续侦听服务器的传入事件 我正在使用 4 5 版本的操作系统进行开发 RIM OS 您有多种选择来通知 用户 都不是
  • 如何将 Google 地图标记链接到其他元素?

    使用谷歌地图 http code google com apis maps documentation reference html 和 JavaScript 我已经能够轻松地显示几个标记 每个标记上都有一个漂亮的小信息窗口 Create
  • 关闭 Cypress 中的 Angular 材质对话框

    我正在将 Cypress 添加到我的 Angular 6 项目中 并使用 Angular Material 欢迎新用户使用材质对话框 其中包含 iFrame 并且通过单击对话框外部来关闭该对话框 我尝试通过多种方式在 Cypress 中关闭
  • ng2-charts 更新标签和数据

    我正在尝试使用 ng2 chart 动态创建图表 我从 Angular 2 服务获取信息 当我仅更改图表标签时 它有效 当我更改数据时 它仅有效 但是当我更改两者时 仅数据在图表中更新 有人可以解释一下这种奇怪的行为吗 我的模板
  • 连接关闭后 Socat 终止

    此命令 串行端口重定向器 接受 TCP 11313 上的单个连接 socat PTY link dev ttyV1 echo 0 raw unlink close 0 TCP LISTEN 11313 forever reuseaddr 但
  • AngularJS ui-router,滚动到状态更改的下一步

    我在我的应用程序中使用 UI router 当 URL 状态更改时 我想使用一个简单的 scrollTo 到锚点 我不想从模板加载下一步 或加载新的控制器 我只是希望页面上已经有几个 div 并在它们之间上下滚动 HTML 的简化视图如下所
  • `if __name__ == '__main__'` 在 javascript es6 模块中等效

    是否可以检查 JavaScript 文件是否直接运行 或者是否需要作为 es6 模块导入的一部分 例如 包含一个主脚本 main js import other if mainTest console log This should run