Импорт JavaScript в приложение TypeScript с помощью Lerna

Я пытаюсь создать монорепозиторий с двумя пакетами React:

  • TypeScript (npx create-react-app app --template typescript)
  • JavaScript (ui)

У меня базовая lerna.json конфигурация

{
  "packages": ["packages/*"],
  "version": "1.0.0"
}

В пакете ui я просто экспортирую одну кнопку (из src/Button.jsx):

import React from 'react';

const Button = () => {
  return (
    <button>
      Start
    </button>
  )
}

export default Button;

Я запустил app, чтобы использовать пакет ui. Импорт внутри app вызывает следующую ошибку:

Failed to compile
/lerna-demo/packages/ui/src/Button.jsx 5:4
Module parse failed: Unexpected token (5:4)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
| const Button = () => {
|   return (
>     <button>
|       Start
|     </button>

Есть ли способ добавить загрузчик в lerna или app, чтобы исправить импорт?

РЕДАКТИРОВАТЬ

Структура проекта:

lerna-demo/
  - node_modules/
  - lerna.json
  - package.json
  - packages/
    - app (created using create-react-app)
      - ...
    - ui
      - node_modules/
      - package.json
      - yarn.lock
      - src/
        - Button.jsx

Как я импортирую компонент Button:

import React from 'react';
import logo from './logo.svg';
import './App.css';
import * as Button from 'ui/src/Button';

const App: React.FC = () => {

  return (
    <div className="App">
      <Button />
    </div>
  );
}

export default App;

person Bartek    schedule 04.04.2020    source источник
comment
напишите еще код - импорт и ошибка   -  person Adidi    schedule 04.04.2020
comment
@Adidi Я обновил вопрос   -  person Bartek    schedule 04.04.2020
comment
@Bartek Я бы посмотрел на это: stackoverflow.com/questions/50179670 / using-react-with-lerna   -  person Nelson Yeung    schedule 04.04.2020
comment
@NelsonYeung, это сработало :) Дополнительно пришлось добавить "noImplicitAny": false в tsconfig.json   -  person Bartek    schedule 04.04.2020


Ответы (1)


В вашем tsconfig.json, созданном CRA, вам нужно будет указать компилятору включить также ui pacakge, поэтому в вашем примере это примерно так:

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react"
  },
  "include": [
    "src", "../ui/src",
  ]
}

Другой вариант - расширить вашу базовую lerna tsconfig.json, и она уже указывает на ваш пакет с помощью path, я думаю, поэтому из вашего CRA tsconfig.json просто добавьте это:

{
    "extends": "../../tsconfig.json",

а в базе tsconfig.json u должен определить псевдоним для пути: main tsconfig.json

{
    "compilerOptions": {
        "baseUrl": "./",
        "paths": {
            "ui/*": ["./packages/ui/*"],
person Adidi    schedule 07.04.2020
comment
У меня точно такой же случай, как в вопросе. Добавление paths в базовый tsconfig или включение в пакет tslint не работает. Я только иногда мог видеть изменения сообщения об ошибке. Похоже, что разработчики CRA не хотят, чтобы вы могли это сделать. Появится сообщение об ошибке: The following changes are being made to your tsconfig.json file: - compilerOptions.paths must not be set (aliased imports are not supported) Я думаю, что люди столкнулись с той же проблемой и ищут пути ее решения. Я пока не нашел волшебную настройку, но вернусь. - person Kev; 28.10.2020