”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > \“主要是模块和导入导出-package.json!\”

\“主要是模块和导入导出-package.json!\”

发布于2024-11-15
浏览:263

\

这里有一个有趣且引人入胜的方式来解释为什么所有四个字段 - modulemainexportsimport——package.json 中需要:

为什么所有四个字段都很重要:

  1. 主要:经典看门人

    • 角色:将 main 视为包中明智的老圣人。它自 Node.js 诞生以来就一直存在,并作为 CommonJS 模块的主要入口点。
    • Need:它确保向后兼容性,允许旧的 Node.js 应用程序使用 require() 轻松加载您的包。这对于仍然依赖 CommonJS 的遗留系统至关重要。
  2. 模块:现代潮流引领者

    • 角色:模块就像邻居家的酷孩子,代表ESM(ES6模块)标准。它指向使用导入语法的项目的入口文件。
    • 需要:随着 JavaScript 社区因其诸如树摇动和静态分析等优点而转向 ESM,模块允许现代捆绑器和环境有效地利用包的 ESM 版本。
  3. 出口:多功能大师

    • 角色:导出字段是最终的多任务处理者,允许开发人员为各种模块系统定义多个入口点。它可以区分ESM和CommonJS。
    • 需求:在包需要灵活的世界中,导出可以让您根据环境或格式定制包的使用方式,这对于满足 ESM 和 CommonJS 用户的复杂库至关重要。
  4. 导入:ESM 特定专家

    • 角色:导入是专注的、仅限 ESM 的专家,专门为 ESM 包定义明确的入口点。
    • 需要:导入字段通过其简单的方法简化了仅需要支持现代导入语法的包的配置,使其成为干净、简化的仅 ESM 项目的宝贵补充。

大局观:

  • 兼容性:这些字段共同确保您的包可以在不同的环境中使用,从旧版 Node.js 应用程序到现代前端框架。
  • 灵活性:它们允许开发人员选择合适的方法来加载模块,满足各种需求和偏好。
  • 面向未来:随着 JavaScript 的发展,拥有清晰的结构可以帮助开发人员适应新标准,同时仍然保持与现有代码库的兼容性。

这是一个比较 package.json 中的 module、main、exports 和 import 字段的表格:

标准 主要的 模块 出口 进口
目的 CommonJS 模块的入口点 ESM 模块的入口点 对模块导出的细粒度控制 定义仅限 ESM 包的入口点
引入 早期 Node.js 版本 主要针对捆绑商 Node.js 12 Node.js 16
目标格式 CommonJS ESM(ES6 模块) ESMCommonJS 仅 ESM
用例 对于使用 require() 的模块 对于使用导入的模块 对于暴露多个入口点的包 对于仅支持 ESM 的软件包
兼容性 在 Node.js 和 CommonJS 中工作 在捆绑程序、现代环境中工作 适用于 Node.js 12,适用于 ESM 和 CommonJS 适用于 ESM 的 Node.js 16
灵活性 仅限一个入口点 ESM 的一个入口点 不同格式的多个入口点 ESM 的一个入口点
现代 JS 中的用法 用于向后兼容 捆绑器中 ESM 的首选 多格式包的首选 现代软件包的简化 ESM 条目
优先级 如果其他人存在,则优先级最低 如果缺少导出,则在捆绑程序中使用 高于 main 和 import 的最高优先级 如果缺少导出则使用
文件路径处理 单个文件 单个文件 可以导出多种文件和格式 ESM 单个文件
Node.js 支持 原生 CommonJS 支持 Node.js 本身不支持 Node.js 12 支持 Node.js 16 支持

结论 - 我对以上四点的呼吁

package.json 中的 exports 字段是一项强大的功能,可以增强现代 JavaScript 开发中包的结构和访问方式。通过允许开发人员为不同的模块格式(例如 ESM 和 CommonJS)定义多个入口点,它可以提高兼容性和灵活性。

使用 exports 字段的主要好处包括:

  1. 清除路径定义

  2. 增强树摇动

  3. 改进的静态分析

  4. 模块化结构

exports 字段不仅实现了包管理的现代化,而且还通过使包使用起来更加直观和高效,显着改善了开发人员的体验。拥抱此功能对于创建高质量、可维护的 JavaScript 库和应用程序至关重要。

感谢chatgpt帮助制作标题和字幕。

版本声明 本文转载于:https://dev.to/rameshpvr/mainly-modules-and-importing-exports-packagejson-nd1?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-15
  • 在 C++ 中将字符串转换为整数时如何处理转换错误?
    在 C++ 中将字符串转换为整数时如何处理转换错误?
    使用 C 中的错误处理将字符串转换为 int 将字符串转换为整数是编程中的常见任务。但是,在某些情况下,字符串值可能无法成功转换为整数。在这种情况下,优雅地处理转换失败至关重要。boost::lexical_cast将字符串转换为 int 时出现错误的最直接方法之一处理方法是使用 boost::le...
    编程 发布于2024-11-15
  • 如何在 JavaScript 中访问 PHP 变量?
    如何在 JavaScript 中访问 PHP 变量?
    在 JavaScript 中访问 PHP 变量直接在 JavaScript 中访问 PHP 变量是一个挑战。但是,有一些方法可以实现此目的:使用嵌入式 PHP 语句:在 JavaScript 块中嵌入 PHP 代码允许您将 PHP 变量分配给 JavaScript 变量:<script typ...
    编程 发布于2024-11-15
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1和$array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求是构...
    编程 发布于2024-11-15
  • 多线程概念 部分死锁
    多线程概念 部分死锁
    欢迎来到我们的多线程系列的第 3 部分! 在第 1 部分中,我们探讨了原子性 和 不变性。 在第 2 部分中,我们讨论了饥饿。 在这一部分中,我们将深入研究多线程中死锁的机制。原因是什么,如何识别以及可以使用的预防策略,以避免将代码变成僵局。应用程序逐渐停止,通常没有任何明显的错误,让开发人员...
    编程 发布于2024-11-15
  • JavaScript 要点:Javascript 的部分策划者)
    JavaScript 要点:Javascript 的部分策划者)
    In this section, we will implement a game called Mastermind in JavaScript. This game development would cover a lot of the concepts that we have discus...
    编程 发布于2024-11-15
  • 如何解决 Tomcat 6.0 中的 PermGen 空间错误?
    如何解决 Tomcat 6.0 中的 PermGen 空间错误?
    解决 Tomcat 6.0 中的永久代空间错误在 Tomcat 6.0 中进行索引操作时,您可能会遇到可怕的永久代空间错误。出现此问题的原因是为永久代分配的空间不足,永久代用于存储类、方法和其他元数据。增加 PermGen 空间增加 PermGen 空间-XX:MaxPermSize=128m pe...
    编程 发布于2024-11-15
  • 编程中原始类型和引用类型之间的根本区别是什么?
    编程中原始类型和引用类型之间的根本区别是什么?
    原始类型和引用类型:显着差异在编程领域,数据类型在组织和表示数据方面发挥着至关重要的作用。在这些类型中,基本类型和引用类型因其根本区别而脱颖而出。什么是基本类型?基本类型是直接存储其值的基本数据类型。它们包括整数、双精度数、布尔值和字符。这些类型的行为就像独立的实体,本质上保存它们的值。什么是引用类...
    编程 发布于2024-11-15
  • Cypress 的互联网:Heroku 的“互联网”游乐场的真实场景
    Cypress 的互联网:Heroku 的“互联网”游乐场的真实场景
    我最近去了 chatGPT 并询问有哪些好的自动化练习,在同一系统上工作一段时间后,或者只为特定类型的用户流提供自动化,我们最终可能会忘记一些事情,所以我询问了一些练习网站,然后我找到了互联网。 尽管该网站可能看起来很简陋,但它们仍然为您提供了一个尝试自动化的地方,而目前,这就是我所需要的。我花了...
    编程 发布于2024-11-15
  • 如何追踪 Go 堆转储到其源变量?
    如何追踪 Go 堆转储到其源变量?
    如何理解堆转储表示?你在理解 Go 中堆转储的表示时遇到了困难。虽然您已经浏览了 GitHub 上的可用信息,但它并未提供所需的清晰度。您寻求一种方法来将堆转储追溯到 Go 代码中保存对象根地址的特定变量。这将使您能够释放引用并允许垃圾收集器声明该对象。当前限制:重要的是要承认,目前还没有完整的解决...
    编程 发布于2024-11-15
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-15
  • 如何简化 Go 中的 CSV 读写以提高性能?
    如何简化 Go 中的 CSV 读写以提高性能?
    Go中高效的CSV读写在提供的Go代码中,CSV读写过程导致了严重的性能问题。为了解决这个问题,让我们探索一种简化这些操作的替代方法。高效读取 CSV我们不是将整个 CSV 文件加载到内存中然后进行处理,而是可以利用 csv.Reader 一次处理一行的能力。这显着减少了内存使用并提高了性能。以下代...
    编程 发布于2024-11-15
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-15
  • 为什么内嵌块显示在 Internet Explorer 8 中不起作用?
    为什么内嵌块显示在 Internet Explorer 8 中不起作用?
    Internet Explorer 8 中的持续内联块问题尽管文档表明支持内联块,但它可能无法在 Internet Explorer 8 中正确呈现。此问题经常出现尝试水平对齐元素时会出现此问题。要解决此问题,请考虑以下事项:设置正确的 Doctype使用以下 doctype 声明开始 HTML 文...
    编程 发布于2024-11-15
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-15

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3