Я разрабатываю библиотеку компонентов, распространяемую через npm, и активно использую настройку baseUrl
в tsconfig. Это действительно здорово, поэтому я могу легко написать
// <prjRoot>/src/some/deeply/nested/module
import { Component } from 'components';
вместо ужасного
// <prjRoot>/src/some/deeply/nested/module
import { Component } from '../../../src/components';
Также распространяю не скомпилированный пакет, а чисто отдельные модули es6. У меня есть основной index.ts
файл с реэкспортом, как этот
export * from './src/components';
export * from './src/another-dir-components';
И вот настало время собрать пакет и опубликовать его в npm - TS не заменяет пути на относительные. Пользователи получают сообщение об ошибке «Не удается найти компоненты модуля», потому что их TypeScript (или они могут вообще не использовать TS) или Webpack ничего не знают о моей настройке baseUrl.
Есть решение через babel - babel-plugin-module-resolver
Работает, но только для кода. Если у меня есть такой код
import { Component } from 'components'; // actually <prjRoot>/src/components/index.ts
import { SomeInterface } from 'typings'; // <prjRoot>/src/typings/index.ts
...
export default Klass extends React.Component {}
Я получу
file.js . TS начал все о типах (например, import { SomeInterface }
), затем Babel передает код и заменяет from 'components'
на from '../../../components'
. Great:
import { Component } from '../../../components';
...
/*#__PURE__*/
var Klass = (function (React.Component) {...transpiled babel code...})(React.Component);
export { Klass as default }
file.d.ts (все равно НЕ относительный путь, будет ошибка):
import { SomeInterface } from 'typings';
...