子路径的模式
对于具有少量导出或导入的包,我们建议显式地列出每个导出子路径条目。
但是对于具有大量子路径的包,这可能会导致 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';
// 加载 ./node_modules/es-module-package/src/features/x.js
import featureY from 'es-module-package/features/y/y';
// 加载 ./node_modules/es-module-package/src/features/y/y.js
import internalZ from '#internal/z';
// 加载 ./node_modules/es-module-package/src/internal/z.js
这是直接的静态替换,没有对文件扩展名进行任何特殊处理。
在前面的例子中,pkg/features/x.json
将在映射中解析为 ./src/features/x.json.js
。
导出的静态可枚举属性由导出模式维护,因为可以通过将右侧目标模式视为针对包内文件列表的 **
glob 来确定包的各个导出。
因为导出目标中禁止 node_modules
路径,所以这个扩展只依赖包本身的文件。
For packages with a small number of exports or imports, we recommend
explicitly listing each exports subpath entry. But for packages that have
large numbers of subpaths, this might cause package.json
bloat and
maintenance issues.
For these use cases, subpath export patterns can be used instead:
// ./node_modules/es-module-package/package.json
{
"exports": {
"./features/*": "./src/features/*.js"
},
"imports": {
"#internal/*": "./src/internal/*.js"
}
}
The left hand matching pattern must always end in *
. All instances of *
on
the right hand side will then be replaced with this value, including if it
contains any /
separators.
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
This is a direct static replacement without any special handling for file
extensions. In the previous example, pkg/features/x.json
would be resolved to
./src/features/x.json.js
in the mapping.
The property of exports being statically enumerable is maintained with exports
patterns since the individual exports for a package can be determined by
treating the right hand side target pattern as a **
glob against the list of
files within the package. Because node_modules
paths are forbidden in exports
targets, this expansion is dependent on only the files of the package itself.