[英]Cannot find module with Webpack, Typescript, custom module directory
我寫了一個虛擬模塊my-component ,它基本上導出一個 class Something 。 我把它放在app/modules/中。 現在我想使用app/app.js的 import Syntax 來訪問它:
import { Something } from 'my-component';
期望:使用我當前的 Webpack 配置(如下),我希望這可以工作。
實際:這會引發錯誤:
ERROR in [default] /<project_dir>/app/app.ts:1:26
Cannot find module 'my-component/Something'.
我知道模塊本身的定義是正確的,因為
import { Something } from './my-component'
node_modules/my-component
,我可以按原樣導入它。唯一失敗的組合是在沒有相對路徑的情況下從我的modules/目錄導入它。 所以我認為問題可能是我的 Webpack 配置。
正如您在下面看到的,我有兩個目錄列為resolve.root :
project_dir/app
project_dir/node_modules
它似乎設法從node_modules
解決,而不是從app
解決。
項目布局
Webpack
project_dir/
├── app/ context, resolve.root
│ ├── app.ts
│ └── my-component/
│ ├── index.ts
│ └── Something.ts
├── webpack.config.js
├── node_modules/ resolve.root
│ ├── ...
│ ├── ...
│ └── ...
└── dist/
└── ...
應用程序/app.ts
import { Something } from 'my-component/Something';
應用程序/我的組件/index.ts
export { Something } from './Something'
應用程序/我的組件/Something.ts
class Something {
}
export { Something };
webpack.config.js
var path = require('path'),
ROOT = path.resolve(__dirname, '.');
module.exports = {
context: path.resolve(ROOT, 'app'),
entry: 'app.ts',
output: {
path: path.resolve(ROOT, 'dist'),
filename: '[name]-[hash].js'
},
module: {
loaders: [
{ test: /\.ts$/, loader: 'awesome-typescript' }
]
},
resolve: {
root: [
path.resolve(__dirname, 'app'),
path.resolve(__dirname, 'node_modules')
],
extensions: [
'', '.ts', '.js'
]
}
};
編輯修復了項目布局。
找不到模塊
如果使用ESNEXT
加載動態模塊時遇到此問題,
你必須在你的tsconfig.json
添加"moduleResolution": "node"
。
我找到了比之前接受的解決方案更簡單的解決方案
在您的打字稿配置中,在compilerOptions
設置baseUrl
:
tsconfig.json
:
{
"compilerOptions": {
"baseUrl": "./app",
...
},
...
}
說明:
Webpack和Typescript默認使用節點模塊解析,這很好。 在設置自定義模塊文件夾時,您需要在Webpack和Typescript配置中配置它們。 對Webpack模塊解析配置的更改不會傳播到Typescript編譯器。
好。 我創建了項目結構的副本。 似乎情況是import語句的行為與require不同 ,並且,webpack resolve.root配置按預期工作。
對於模塊,將import語句更改為要求如下:
app.ts
// Define require function for TypeScript to know that it
// will exist at runtime
declare function require(name:string);
// Require your module
var Something = require('my-component/Something');
// var myComponent = require('my-component');
我組分/ Something.ts
// Export something (used a function to test)
export function Something() {
console.log("Hello");
}
我組分/ index.ts
// Definition of require function as mentioned before
declare function require(name:string);
// Passing other modules
var exportedModules = {
Something: require("my-component/Something")
};
export default exportedModules;
像這樣,它可以正常工作,並解決您在Webpack中定義的模塊名稱。 不幸的是,我無法通過導入實現它。
我將解決方案推送到了存儲庫 。 如果需要,請查看!
唯一對我有用的是更改tsconfig.json
如下:
{ "compilerOptions": { //... "baseUrl": "./src", "paths": { "@/*": ["src/*"] } }
其他一切都失敗了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.