【发布时间】:2022-01-24 11:22:27
【问题描述】:
在阅读 blog 关于 Angular 13 的新功能时,我遇到了以下声明:
不再支持 v12.20 之前的 Node.js 版本,因为 Angular 包使用 Node.js 包导出功能和子路径模式。
那么,我很清楚,“子路径模式”是什么意思?这些示例将非常受欢迎。
【问题讨论】:
标签: node.js angular npm module node-modules
在阅读 blog 关于 Angular 13 的新功能时,我遇到了以下声明:
不再支持 v12.20 之前的 Node.js 版本,因为 Angular 包使用 Node.js 包导出功能和子路径模式。
那么,我很清楚,“子路径模式”是什么意思?这些示例将非常受欢迎。
【问题讨论】:
标签: node.js angular npm module node-modules
我引用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
【讨论】: