![](/img/trans.png)
[英]'import-resolver-typescript/lib' not found error in jsconfig.json
[英]ES modules and jsconfig.json: Error [ERR_MODULE_NOT_FOUND]
我有一個使用常規 JS 的節點 Web 應用程序項目。
我正在嘗試使用jsconfig.json
設置一些路徑。 我嘗試使用節點默認的Subpath imports
,即使它確實有效,vscode 智能感知也停止工作。
我發現你可以使用jsconfig.json
所以我設置了這個文件
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"baseUrl": "./",
"paths": {
"@controllers/*": ["node/controllers/*"],
},
},
"exclude": ["node_modules"]
}
在我的package.json
我添加了
"type": "module",
我的文件夾結構是
├── node
│ └──controllers
│ └── foo.js
├── server.js
├── jsconfig.json
└── package.json
但是當我嘗試從server.js
導入時
import { foo } from '@controllers/foo.js'
// or import { foo } from '@controllers/foo'
foo.js
export const foo = 'Hello server'
我明白了
node:internal/process/esm_loader:74
internalBinding('errors').triggerUncaughtException(
Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@controllers/foo.js' imported from /Users/Alvaro/Sites/test/server.js
at new NodeError (node:internal/errors:363:5)
at packageResolve (node:internal/modules/esm/resolve:698:9)
at moduleResolve (node:internal/modules/esm/resolve:739:18)
at Loader.defaultResolve [as _resolve] (node:internal/modules/esm/resolve:853:11)
at Loader.resolve (node:internal/modules/esm/loader:89:40)
at Loader.getModuleJob (node:internal/modules/esm/loader:242:28)
at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:73:40)
at link (node:internal/modules/esm/module_job:72:36) {
code: 'ERR_MODULE_NOT_FOUND'
經過數小時的研究,我發現在使用esm
時很難擁有自定義別名路徑,並且很容易為commonjs
配置,
但它可以實現,當你使用esm
時,方式略有不同,我將在方法 1中編寫esm
實現的解決方案,然后在方法 2中commonjs
方法一
步驟 0:
刪除jsconfig.json
步驟1:
在你的package.json
添加一個exports
屬性,
"name": "package-name"
"exports":{
"./@controllers/" : "./node/controllers/"
}
注意:不要忘記@controllers
和/node/controllers/
后面的 '/'
第2步
你將不得不導入文件
import {foo} from "package-name/controllers/index.js"
/*
package-name is the same value as the 'name' property in
the package.json
*/
要了解有關package.json
中的exports
屬性的更多信息,請參閱此處
------------------------------XXXXXXXX------ ---------------
方法二
您不能在此方法中使用es modules
步驟 0
安裝module-alias
包。
npm i module-alias
如果package.json
中存在type:module
,則刪除它或將值更改為commonjs
;
步驟1
在package.json
中指定為entry point
的文件的起始行添加以下代碼
require(module-alias/register)
在作者的情況下檢查package.json
中的main
屬性,它應該是server.js
。
在package.json
添加這個
"_moduleAliases": {
"@root" : ".", // Don't forget to mnetion this
"@controllers" : "node/controllers/*"
}
現在您可以從以下目錄中要求模塊
const {foo} = require("@controllers/foo.js") // if foo is named export
//or
const foo = require("@controllers/foo.js");
您可以在此處參考有關module-alias
更多信息
你所嘗試的幾乎是正確的。
你可以讓別名工作,但它必須以#
開頭。
例如:在package.json
"imports": {
"#app": "./app.js"
}
並在jsconfig.json
{
"compilerOptions": {
"paths": {
"#app": ["./app.js"]
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.