Используйте рабочие области yarn и ссылки на проекты машинописного текста для ссылки на другой подкаталог пакета.

Я использую рабочие пространства пряжи и имею следующие пакеты:

  • пакеты / x-cli
  • пакеты / x-core

Я хочу иметь возможность импортировать символы из подкаталогов x-core точно так же, как вы это делаете import map from 'lodash/map', например:

import { fn } from '@mycompany/x-core/test';

Но я получаю следующую ошибку:

tsc -b packages/x-core packages/x-cli
packages/x-cli/src/main.ts:1:20 - error TS2307: Cannot find module '@mycompany/x-core/test'.

1 import { fn } from "@mycompany/x-core/test";
                     ~~~~~~~~~~~~~~~~~~~~~~~~

error Command failed with exit code 1.

Однако это работает, если он экспортируется в корень библиотеки:

import { otherFn } from '@mycompany/x-core';

Я сделал небольшой проект на Github, чтобы точно показать мою настройку, на основе lerna-yarn-workspaces-example: https://github.com/julienfouilhe/example-subdirectory-workspace-typescript-import

Есть ли способ сделать это, я не могу найти ничего, что работает. Я не очень разбираюсь в разрешении модулей, поэтому не могу точно определить проблему!


person Julien Fouilhé    schedule 04.04.2019    source источник
comment
Привет, есть новости по этому поводу?   -  person Eugene Chybisov    schedule 23.10.2019
comment
@ chibis0v Похоже, что для этого мне пришлось бы перемещать файлы после компиляции. Если для вас это слишком хлопотно (это для меня), вы можете либо использовать @mycompany/x-core/lib/test, либо всегда экспортировать все в корень вашей библиотеки: @mycompany/x-core   -  person Julien Fouilhé    schedule 28.10.2019
comment
у вас есть работа, чтобы перейти к функции определения в коде vs при импорте, например, @ mycompany / x-core?   -  person Eugene Chybisov    schedule 28.10.2019
comment
Да, но вам нужно будет сгенерировать исходные карты для сопоставления с исходными файлами вместо скомпилированных файлов.   -  person Julien Fouilhé    schedule 29.10.2019
comment
Спасибо! Я решил проблему с переходом к определению через свойство main в package.json, но подождите ... вы только что сказали, что мы можем сгенерировать исходные карты и увидеть исходный код jsx в chrome? :) Но мы сможем этого добиться?   -  person Eugene Chybisov    schedule 29.10.2019


Ответы (2)


Переход к корню при сборке работает и позволяет избежать проблем с инструментами, но, как уже упоминалось, это усложняет сборку, особенно для совместного использования в рабочих областях. узел поля 14 "exports" является важным изменением, которое в конечном итоге должно обеспечить поддержку экспорта подкаталогов. проще, но пока это решает только часть проблемы, поскольку другие инструменты, похоже, еще не уважают эту область. Упомянутая конкретная ошибка все еще будет существовать с разрешением пути машинописного текста, которое можно разрешить с помощью параметров "baseUrl" и "paths" в вашем tsconfig.json файле в корне, а затем с помощью "extends" для поделитесь этой конфигурацией. К сожалению, если библиотека в конечном итоге используется чем-то, созданным с помощью webpack, и вы используете v4, вам нужно будет настроить шаг разрешения пользовательского пути, потому что webpack не поддерживает поле" exports ". Похоже, что он является частью webpack 5, если вы можете его использовать. Итак, если вы не публикуете свою библиотеку вне монорепозитория, то это можно решить, не перемещая все в корень с помощью более новых инструментов и некоторой работы по настройке.

person Rob Seaman    schedule 26.05.2020

Обновление: с помощью Nodejs 14 вы можете указать экспорт подпути в своем package.json.

https://nodejs.org/api/esm.html#esm_subpath_exports

Я не тестировал это лично, но похоже, что эту проблему можно решить, используя

"exports": {
  ".": "./lib"
}
person Julien Fouilhé    schedule 06.05.2020