Сохраняйте структуру src / folder при создании папки dist / с помощью Typescript 3

У меня есть сервер typecript nodejs с такой структурой:

tsconfig.json
package.json
src/
    middleware/
    utils/
    index.ts
dist/
    middleware/
    utils/
    index.js

При использовании Typescript 2 я смог перенести свой проект из src / в папку dist / и получить зеркальное отображение моей структуры каталогов для работы.

С выпуском Typescript 3 они представили ссылки на проекты и изменили способ преобразования кода в выходной каталог. Теперь tsc выводит в папку dist / вложенным образом следующим образом:

dist/
    src/
        middleware/
        utils/
        index.js

Мой tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "allowJs": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "resolveJsonModule": true,
    "declaration": false,
    "outDir": "dist/",
    "lib": [
      "es7",
      "dom"
    ]
  },
  "include": [
    "src/"
  ]
}

Как я могу настроить Typescript для вывода моей папки src / в виде зеркального изображения в папку dist /?

Спасибо! Удалим комментарии.

Takeshi Tokugawa YD 08.06.2021 02:07
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
49
1
29 733
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Само по себе обновление TypeScript 2 до 3 не должно было изменить поведения; Если мы сможем подтвердить, что это так, это может быть ошибкой. В любом случае убедитесь, что параметр компилятора rootDir указывает на ваш каталог src, а не на родительский каталог, потому что структура под rootDir зеркально отражена под outDir.

Я добавил свой tsconfig.json, чтобы прояснить ситуацию. Проект сконфигурирован с использованием ключа "include" для указания каталога src /. Я только что подтвердил, что компилятор Typescript 2 просто отразит src / в dist / с этой конфигурацией, но компилятор Typescript 3 автоматически включит package.json и папку src /, вложенную в dist /. Попытки указать rootDir на src / терпят неудачу, потому что файла package.json там нет.

nfadili 03.09.2018 21:05

Мне не удалось воспроизвести такое поведение на основе предоставленной вами информации. Если вы можете опубликовать репозиторий, воспроизводящий проблему, я посмотрю. В противном случае я могу только предложить вам попробовать удалить что-то из своего проекта, пока проблема не исчезнет, ​​и тогда вы увидите, что ее вызывает.

Matt McCutchen 04.09.2018 01:48

Я смог определить причину. Похоже, что добавление resolveJsonModule: true в мой tsconfig.json заставляло tsc выводить каталог dist / по-другому. Я до сих пор не совсем понимаю, почему он это делает, но, похоже, это тема для разговоров в нескольких проблемах Github: github.com/Microsoft/TypeScript/issues/25216 и github.com/Microsoft/TypeScript/issues/24744 Спасибо за вашу помощь, Мэтт!

nfadili 04.09.2018 18:21

Это совсем не ясно из страницы параметры компилятора.

trusktr 09.02.2020 05:43

Проблема появляется после добавления resolveJsonModule: true в tsconfig.json

Ответ принят как подходящий

У меня была аналогичная проблема при первоначальном преобразовании в проект Typescript. Я также установил resolveJsonModule: true, и каталог src был скопирован в выходной каталог dist.

Основная причина в том, что один из моих исходных файлов required package.json находится в корне проекта. После того, как я удалил это, tsc больше не добавлял src в каталог dist.

Короче говоря, убедитесь, что вам не нужны файлы вне каталога src.

Пояснительный FAQ здесь: https://github.com/Microsoft/TypeScript/wiki/FAQ#why-does---outdir-moves-output-after-adding-a-new-file

Оно работает! Но почему? Почему resolveJsonModule выводит tsc на /dist/src вместо /dist? В этом нет никакого смысла.

s.meijer 14.04.2020 13:34

@ s.meijer, потому что он позволяет импортировать package.json ("JsonModule"), и это заставляет rootDir автоматически устанавливаться в каталог, содержащий весь исходный код (т.е. включая package.json), и теперь каталог src больше не является корневым каталогом, а subdir, и таким образом отражается в выводе. См. stackoverflow.com/a/61467483/8910547 для получения дополнительной информации и ссылок на то, что руководитель Typescript говорит по этому поводу.

Inigo 30.04.2020 00:31

Спасибо за это. он также дает тот же результат, когда вы хотите иметь такую ​​структуру, как ./src/ и ./typings, но не хотите, чтобы ./src в вашем ./dist ... короче говоря, если вы ссылаетесь на ./ введя ./src, он будет включен, поэтому ./src будет сохранен. T_T

y_nk 11.04.2021 20:58

В моем случае это был "include": ["**/*.ts"] -> "include": ["src/**/*.ts"] в tsconfig.json.

Pavel Staselun 25.05.2021 13:31

Структура каталога вывода контролируется rootDir из compilerOptions. См. Документацию здесь, установка ./src должна решить проблему.

{
  "compilerOptions": {
    "rootDir": "src",
    ...
  },
  "include": [
    "src/"
  ]
}

Фактически, в этом случае он просто поменяет местами проблемы. OP импортирует package.json, поэтому, если вы измените rootDir на src, вы получите правильную структуру outDir, но ошибку компиляции, потому что у вас есть исходный код за пределами rootDir. См. stackoverflow.com/a/61467483/8910547 для получения дополнительной информации и ссылок на то, что руководитель Typescript говорит по этому поводу.

Inigo 30.04.2020 00:34

использование rootDir решило проблему для меня с локальной библиотекой .ts, которую я импортировал

Felipe 05.06.2021 20:10

вы можете изменить импорт файла из src / entity / Post -> ../entities/Post в файле в ./src

это изменяет импорт в папку dist.

Помимо указания compilerOptions.outDir, укажите compilerOptions.rootDir в tsconfig.json.

{
  "compilerOptions": {
     // ...
    "outDir": "dist",
    "rootDir": "./",
    // ...
  }
}

Затем запустите: $ tsc -b внутри папки, где находится файл tsconfig.json.

Другие вопросы по теме