Webpack resolve.alias не работает с typescript?
Я пытаюсь сократить импорт в typescript
от import {Hello} from "./components/Hello";
to import {Hello} from "Hello";
Для этого я узнал, что вы можете использовать resolve.alias
в webpack, поэтому я настроил эту часть следующим образом
resolve: {
root: path.resolve(__dirname),
alias: {
Hello: "src/components/Hello"
},
extensions: ["", ".ts", ".tsx", ".js"]
},
Создается Webpack, и работает output bundle.js. Однако typescript intellisense жалуется на это cannot find the module
Итак, мой вопрос в том, работает ли webpack resolve.alias с typescript?
Я нашел следующий issue, но на него нет ответа.
Ответы
Ответ 1
Если вы используете ts-loader
, вам, возможно, придется синхронизировать настройки alias
/resolve
веб-пакета с настройками paths
в вашем tsconfig.json
.
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"Hello": ["src/components/Hello"]
}
}
}
Если вы используете awesome-typescript-loader
, то веб-пакет может выяснить это автоматически из настроек paths
в вашем tsconfig.json
, в соответствии с состоянием этой проблемы в репозитории. Таким образом, вам не нужно дублировать ту же информацию в поле alias
Webpack.
Ответ 2
Чувак, тебе не хватает одного очень важного момента в tsconfig.json: соответствующий шаблон!
Это должно быть настроено так:
"baseUrl": ".",
"paths": {
"appSrc/*": [
"src/*"
]
}
"*" - это важная часть, указывающая TS на совпадение с правой стороной.
Я узнал об этом из этой статьи: https://medium.com/@martin_hotell/type-safe-es2015-module-import-path-aliasing-with-webpack-typescript-and-jest-fe461347e010
Ответ 3
Как уже упоминали другие, вы должны предоставить alias
в вашем webpack.config.js:
resolve: {
extensions: ['.ts', '.js'],
alias: {
forms: path.resolve(__dirname, 'src/forms/')
}
},
Это должно быть в синхронизации с вашим tsconfig.json
файл (BaseUrl и пути требуется).
"compilerOptions": {
baseUrl: "./",
...
paths: {
"forms/*": ["src/forms/*]
}
}
Примечание. Шаблон подстановочного знака необходим для соответствия вашей конфигурации псевдонима разрешения.
Затем вы можете импортировать любую библиотеку, используя свой псевдоним:
import { FormsModule } from 'forms/my-forms/my-forms.module';
Ответ 4
Мне пришлось внести небольшую корректировку в решение Caio Saldanha, чтобы оно работало в моей среде.
Я использую Babel 7 с babel-plugin-module-resolver
для разрешения псевдонимов. Нет ts-loader
или awesome-typescript-loader
как Babel 7 поддерживает TypeScript из коробки с помощью @babel/preset-typescript
. Мне пришлось добавить дополнительную конфигурацию пути для каждого псевдонима для index.ts
загрузки корня модуля (например, index.ts
):
"baseUrl": ".",
"paths": { // this must be synchronized with .babelrc.js module-resolver alias config
"component": ["src/component/index.ts"],
"component/*": ["src/component/*"],
...
}
Наличие index.ts
в папке /component
со следующим содержимым:
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 path configuration
component: './src/component',
},
},
],
Ответ 5
Я думаю, вы можете это сделать и работать так, как вы описываете:
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
. Я не использую typescript, хотя, но я не думаю, что это повлияет на результат.