Построение папки «Typescript» для устаревшей javascript файловой архитектуры - PullRequest
2 голосов
/ 05 марта 2020

Я работаю над проектом, который изначально был написан простым Javascript. Я добавил папку Typescript на уровне root, которая содержит ту же структуру, что и исходная javascript. Файловая структура выглядит следующим образом:

|_ build
|  |_ automatically generated js files from Meta and src using build command
|
|_ meta
|  |_ foo.js, bar.js
|
|_ src
|  |_ baz.js
|
|_ typescript
|  |_ meta
|     |_ foo.ts, bar.ts
|  |_ src
|     |_ baz.ts

Когда я запускаю ts c, я бы хотел, чтобы все файлы Typescript в каталоге машинописного текста компилировались в ту же структуру, в которой они существовали в каталоге Typescript. в каталог root. Тем не менее, в большинстве примеров, которые я видел, используя outDir, есть вещи, встраивающиеся в указанную c папку сборки.

{
  "compilerOptions": {
    "sourceMap": false,
    "noImplicitAny": true,
    "module": "es6",
    "moduleResolution": "node",
    "allowJs": true,
    "target": "ES2020",
    "lib": ["ES2018"],
    "allowSyntheticDefaultImports": true
    "outDir" : "" // what can be here to say "use include file structure - typescript dir?
  },
  "exclude": ["node_modules"],
  "include": ["typescript/**/*"]
}

Я не могу обернуть каталоги Javascript в папку "dist". Как мне структурировать мой tsconfig для сборки до уровня root, соответствующего тем же каталогам внутри каталога машинописного текста?

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Чтобы повторить ваши требования:

|_ meta // emit js files for typescript/meta here
|_ src  // emit js files for typescript/src here
|_ typescript // root folder for all .ts source files
|  |_ meta
|     |_ foo.ts, bar.ts
|  |_ src
|     |_ baz.ts

Для этого мы можем настроить tsconfig.json:

{
  "compilerOptions": {
    // ...
    "outDir": ".",
    "rootDir": "typescript"
  },
  "include": ["typescript/**/*"],
  "exclude": ["node_modules", "src", "meta", "build"],
}

Тогда все входные файлы .ts будут отправлены в следующем путь (относительно tsconfig.json):

emit-path: <outDir>/<filePath> minus <rootDir>  (rootDir chopped off from file path)

Example: ./typescript/src/baz.ts  -->  ./src/baz.js

Мы можем не указывать параметр конфигурации rootDir:

По умолчанию : самый длинный общий путь из всех необъявленных входных файлов . Когда TypeScript компилирует файлы, он сохраняет ту же структуру каталогов в выходном каталоге, что и во входном каталоге.

Хотя рекомендуется делать это явным образом, поэтому компилятор вызовет ошибку, если что-то не так с расположением входных файлов.

0 голосов
/ 10 марта 2020

Резюме

Ответ - нет. (По крайней мере, без одного шага сборки / конфигурации)

Это возможно, см. ответ ford04 .

Почему это плохая идея

  1. Ваши выходные артефакты теперь смешаны с другими источниками / входными артефактами. Почему это плохо? Подумайте, что произойдет, если вы удалите папку в typescript/src, например typescript/src/some-utils. Поскольку она уже скомпилирована, эта папка и все скомпилированные исходные файлы в ней уже существуют в каталоге src/some-utils. Следующая компиляция, они все еще будут там. Как мы можем очистить это? Обычно перед сборкой существует «чистый» шаг, и он просто удаляет выходной каталог и перекомпилирует. Но теперь в src есть исходные файлы!

    У нас нет простого способа различить исходные файлы и файлы вывода машинописного текста. Мы можем удалить каталог src, а затем git checkout -- src, чтобы восстановить исходные файлы. Но что, если бы мы занимались редактированием некоторых файлов? Я полагаю, мы могли бы сохранить sh наши изменения: git stash; rm -rf src; git checkout -- src; git stash pop;. Но неотслеживаемые файлы все еще потеряны! Хорошо .. git add src; git stash; rm -rf src; git checkout -- src; git stash pop; git restore --staged src. В основном это исправляет проблемы, но любые промежуточные файлы, которые у нас есть, по-прежнему не установлены. Вы можете видеть, насколько это усложнилось.

    Но есть еще одна и более серьезная проблема с этим макетом. Мы не можем .gitignore любой файл Typescript, поэтому Git будет постоянно показывать неотслеживаемые файлы. Невозможно определить, случайно ли кто-то зафиксировал скомпилированный файл Typescript. Проблема может усугубиться, если кто-то попытается внести изменения в зафиксированный скомпилированный файл Typescript. Эти изменения будут перезаписываться компилятором Typescript при каждом запуске, и изменения будут потеряны.

  2. У вас есть корни источника на двух уровнях с иерархией папок. Концептуально они должны быть на одном уровне, и все ваши исходные файлы должны находиться в одной папке.

Лучший подход

При миграции Javascript на Typescript Хороший подход - начать с добавления аннотаций Typescript к файлам Javascript. Таким образом, вы сохраняете все преимущества Typescript, не усложняя процесс. Когда файл Javascript почти полностью аннотирован, преобразуйте его в файл Typescript .ts (это требует использования Typescript для любых изменений этого файла в будущем), , но оставьте его вместе с файлами Javascript . Затем при компиляции просто установите allowJs в true, и компилятор Typescript с радостью выведет все ваши файлы Javascript в выходной каталог Typescript.

Вы упомянули, что вы не можете обернуть ваши Javascript файлы в dist или любую папку вывода / сборки, но не понятно, почему. Это кажется основным препятствием для продвижения вперед с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...