[英]Webpack resolve.alias does not work with typescript?
我嘗試在打字稿中縮短我的導入
from import {Hello} from "./components/Hello";
import {Hello} from "Hello";
對於我發現你可以使用resolve.alias
中的WebPack因此,我配置了部分如下
resolve: {
root: path.resolve(__dirname),
alias: {
Hello: "src/components/Hello"
},
extensions: ["", ".ts", ".tsx", ".js"]
},
Webpack 構建,並且輸出 bundle.js 工作。 然而打字稿的智能感知抱怨它cannot find the module
所以我的問題是 webpack 的 resolve.alias 是否適用於打字稿?
我發現了以下問題,但沒有答案。
如果您使用ts-loader
,則可能需要將您的 webpack alias
/ resolve
設置與tsconfig.json
paths
設置tsconfig.json
。
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"Hello": ["src/components/Hello"]
}
}
}
如果您使用的是awesome-typescript-loader
typescript awesome-typescript-loader
,那么 webpack 可以根據 repo 中關於此問題的狀態,從您的tsconfig.json
的paths
設置中自動計算出來。 這樣,您就不需要在 Webpack alias
字段中復制相同的信息。
您在tsconfig.json
中遺漏了一個非常重要的點:匹配模式!
它應該像這樣配置:
"baseUrl": ".",
"paths": {
"appSrc/*": [
"src/*"
]
}
“*”是告訴 TS 匹配右側任何內容的重要部分。
我從這篇文章中發現: Type-safe es2015 module import path aliasing with Webpack, Typescript and Jest
注意
webpack.config.js
都已更新(例如,如果您使用故事書)。正如其他人提到的,您需要在 webpack.config.js 中提供alias
:
resolve: {
extensions: [".ts", ".js"],
alias: {
forms: path.resolve(__dirname, "src/forms/")
}
},
這需要與您的tsconfig.json
文件同步(需要tsconfig.json
和路徑)。
"compilerOptions": {
baseUrl: "./",
...
paths: {
"forms/*": ["src/forms/*"]
}
}
注意:通配符模式是與您的解析別名配置匹配所必需的。
然后您可以使用別名導入任何庫:
import { FormsModule } from "forms/my-forms/my-forms.module";
如果有人仍然遇到此問題,請不要忘記將您的文件夾添加到 tsconfig.json 上的“include”選項中,如下所示:
{
"compilerOptions": {
"sourceMap": true,
"allowJs": true,
"baseUrl": "./",
"paths": {
"@/*": [
"src/*"
]
},
"target": "es5",
"module": "es2015",
"moduleResolution": "node",
"lib": [
"es2016",
"dom"
]
},
"outDir": "./built/",
"include": [
"./src/**/*",
"./tests/**/*"
]
}
我不得不對 Caio Saldanha 的解決方案進行小幅調整,使其適用於我的環境。
我正在使用帶有babel-plugin-module-resolver
Babel 7 來解析別名。 沒有ts-loader
或awesome-typescript-loader
因為 Babel 7 使用@babel/preset-typescript
支持開箱即用的 TypeScript。 我必須為每個別名添加額外的路徑配置以自動加載模塊根目錄(例如index.ts
):
"baseUrl": ".",
"paths": { // this must be synchronized with .babelrc.js's module-resolver alias config
"component": ["src/component/index.ts"],
"component/*": ["src/component/*"],
...
}
在/component
文件夾中有一個index.ts
,內容如下:
export { default as Logo } from './Logo';
如果沒有額外的.../index.ts
行,這個導入對我不起作用:
import { Logo } from 'component';
.babelrc.js
別名配置:
plugins: [
[
'module-resolver',
{
extensions: ['.js', '.jsx', '.ts', '.tsx'],
root: ['./src'],
alias: {
// this must be synchronized with tsconfig.json's path configuration
component: './src/component',
},
},
],
您還可以配置tsconfig-paths-webpack-plugin
以免在多個地方重復您的別名。 它將從tsconfig.json
文件中獲取別名並自動將它們添加到 webpack。
有2種情況
"baseUrl": "./src"
並查看代碼工作。我認為你可以做到這一點,並讓它按照你描述的方式工作:
resolve: {
root: [
path.resolve(__dirname),
<path_to_components_directory> //e.g. path.resolve(__dirname, 'src', 'components')
],
extensions: ["", ".ts", ".tsx", ".js"]
},
然后你可以import {Hello} from "Hello";
我知道我這樣做是為了解析src/js
目錄中的文件路徑。 雖然我沒有使用打字稿,但我認為它不會影響結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.