内置的Node.js路径别名和隐含的index.js模块解析

4
我希望在一个 TypeScript/Node/Express 项目中设置导入路径别名,而不使用其他包,比如 tsconfig-paths 和 link-module-alias。我想要使用内置的 Node.js 功能来实现这一点(TypeScript 的别名已经完成)。
基本上:
// Change
import { myFn } from '../../../utils';

// To
import { myFn } from '#this/utils';

我有一个希望,就是使用Node.js的子路径导入。理论上,我只需要在我的package.json文件中添加以下内容即可:(参见文档)
"imports": {
    "#this/*": "./dist/*"
}

问题在这里

这适用于显式导入*.js文件,但对隐含的index.js(即文件夹作为模块)则失败。

// Works
import { myFn } from '#this/utils/index.js';

// Does not work
import { myFn } from '#this/utils';

然而,我希望node按照以下方式解析导入:

  • 如果utils是一个文件夹,则导入应该解决为*/utils/index.js
  • 如果utils是一个文件,则导入应该解决为*/utils.js

我的第一想法是更新package.json中的import,以包括所有可能性,但这不受支持:

"imports": {
    "#this/*": [
        "./dist/*",
        "./dist/*.js",
        "./dist/*/index.js"
    ]
}

另一种选择似乎是为每个目录定义一个exports条目,但这种方法不具有可扩展性。
2个回答

1

使用--experimental-specifier-resolution=node标志,下面的代码对我有效。

index.js:

import { myFn } from '#this';

package.json:

...
  "imports": {
    "#this": "./utils"
  }
...

-1
在使用 esbuild 的 TypeScript Node 项目中,对我有效的方法是将路径定义两次,但第二次不包括 /*。这样可以让你使用 @utils 导入 index.ts,同时仍然允许你导入目录下其他文件。
{
  "paths": {
    "@src/*": ["src/*"],
    "@src": ["src"],
    "@utils/*": ["src/utils/*"],
    "@utils": ["src/utils"]
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接