【问题标题】:What is a "subpath pattern" in NodeJS什么是 NodeJS 中的“子路径模式”
【发布时间】:2022-01-24 11:22:27
【问题描述】:

在阅读 blog 关于 Angular 13 的新功能时,我遇到了以下声明:

不再支持 v12.20 之前的 Node.js 版本,因为 Angular 包使用 Node.js 包导出功能和子路径模式

那么,我很清楚,“子路径模式”是什么意思?这些示例将非常受欢迎。

【问题讨论】:

    标签: node.js angular npm module node-modules


    【解决方案1】:

    我引用nodejs.org:

    子路径模式

    添加于:v14.13.0、v12.20.0

    对于具有少量导出或导入的包,我们建议明确列出每个导出子路径条目。但是对于具有大量子路径的包,这可能会导致package.json 膨胀和维护问题。

    对于这些用例,可以使用子路径导出模式:

    // ./node_modules/es-module-package/package.json
    {
      "exports": {
        "./features/*": "./src/features/*.js"
      },
      "imports": {
        "#internal/*": "./src/internal/*.js"
      }
    }
    

    * 映射公开嵌套子路径,因为它只是一种字符串替换语法。

    然后,右侧的所有 * 实例都将替换为此值,包括是否包含任何 / 分隔符。

    import featureX from 'es-module-package/features/x';
    // Loads ./node_modules/es-module-package/src/features/x.js
    
    import featureY from 'es-module-package/features/y/y';
    // Loads ./node_modules/es-module-package/src/features/y/y.js
    
    import internalZ from '#internal/z';
    // Loads ./node_modules/es-module-package/src/internal/z.js
    

    这是直接静态替换,无需对文件扩展名进行任何特殊处理。在前面的示例中,pkg/features/x.json 将在映射中解析为 ./src/features/x.json.js

    导出的静态可枚举属性由导出模式维护,因为可以通过将右侧目标模式视为** glob 针对包中的文件列表来确定包的各个导出。由于导出目标中禁止使用node_modules 路径,因此此扩展仅依赖于包本身的文件。

    要从模式中排除私有子文件夹,可以使用null 目标:

    // ./node_modules/es-module-package/package.json
    {
      "exports": {
        "./features/*": "./src/features/*.js",
        "./features/private-internal/*": null
      }
    }
    
    import featureInternal from 'es-module-package/features/private-internal/m';
    // Throws: ERR_PACKAGE_PATH_NOT_EXPORTED
    
    import featureX from 'es-module-package/features/x';
    // Loads ./node_modules/es-module-package/src/features/x.js
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 2020-10-30
      • 1970-01-01
      • 2014-08-02
      相关资源
      最近更新 更多