Можно ли использовать разные зависимости в папке node_modules для бэкенда и фронтенда в проекте на TypeScript в VS Code?

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

- Services 
  - Backend 
    - node_modules 
    - Service_1 
    - Service_2 
  - Frontend 
    - node_modules 
    - App_1 

Сейчас у меня возникла проблема: несмотря на то, что сервисы успешно собираются, при запуске они не могут найти свои модули. Возможно, проблема связана с неправильной настройкой файлов package.json или tsconfig.json.

Вот как выглядит корневой package.json:

```json
{
    "name": "monorepo",
    "version": "1.0.0",
    "private": true,
    "workspaces": [
        "backend",
        "frontend"
    ],
    "devDependencies": {
        "typescript": "^4.0.0"
    }
}
```

А вот содержимое package.json в папке Backend:

```json
{
    "name": "backend",
    "private": true,
    "workspaces": [
      "./Service1",
      "./Service2",
      "./Service3"
    ],
    "scripts": {
        "build:Service1": "tsc -b Service1",
        "build:Service2": "tsc -b Service2",
        "build:Service3": "tsc -b Service3"
    },
    "dependencies": {
        "typescript": "^4.5.0"
    }
}
```

И tsconfig.json одного из сервисов:

```json
{
    "compilerOptions": {
      "module": "commonjs",
      "target": "es6",
      "lib": ["es2015", "dom"],
      "moduleResolution": "node",
      "sourceMap": true,
      "outDir": "../../../dist/BackEnd/Service1",
      "baseUrl": ".",
      "paths": {
        "*": ["../node_modules/*", "src/types/*"]
      }
    },
    "include": ["src/**/*"],
    "exclude": ["../node_modules"]
}
```

Как мне исправить эту ситуацию, чтобы сервисы могли обнаруживать нужные модули при запуске?
  • 23 сентября 2024 г. 11:03
Ответы на вопрос 2
Структура вашего проекта в целом выглядит правильно, но есть несколько моментов, которые могут вызвать проблемы с разрешением модулей и доступом к `node_modules` в проектах на TypeScript. Ниже приведены рекомендации, которые помогут вам настроить проект так, чтобы все сервисы могли видеть необходимые модули.

### Рекомендации по структуре проекта

1. **Использование Workspaces**:
   Убедитесь, что вы правильно настроили Workspaces для вашего проекта. У вас уже есть указание на `workspaces` в корневом `package.json`, но в `package.json` Backend также должны быть указаны пути к вашим службам.

2. **Общие зависимости**:
   Скорее всего, вам нужно перенести зависимости, которые используются на уровне всей монорепозитория, в корневой `package.json`, если вы их используете в нескольких сервисах. Например, `typescript` лучше оставить в корневом файле `package.json`.

3. **Настройки tsconfig.json**:
   Убедитесь, что пути и разрешение в файлах конфигурации TypeScript настроены корректно. Например, вы можете попробовать указать прямые пути к `node_modules`. В `tsconfig.json` вашего сервиса можно сделать следующее:

   ```json
   {
       "compilerOptions": {
           "module": "commonjs",
           "target": "es6",
           "lib": ["es2015", "dom"],
           "moduleResolution": "node",
           "sourceMap": true,
           "outDir": "../../../dist/BackEnd/Service1",
           "baseUrl": ".",
           "paths": {
               "*": [
                   "../node_modules/*",
                   "src/types/*"
               ]
           }
       },
       "include": [
           "src/**/*"
       ],
       "exclude": [
           "node_modules",
           "**/*.spec.ts"
       ]
   }
   ```

   Обратите внимание на `exclude` - лучше всего исключить `node_modules` в самом сервисе, чтобы не происходила недопустимая попытка разрешения.

4. **Запуск сервисов**:
   Если сервисы не могут найти свои модули, убедитесь, что вы запускаете их из соответствующей директории. Например, для запуска Service1 вы должны находиться в папке `Service1` или вызывать команду из корневого `package.json`, например:

   ```bash
   npm run build:Service1
   ```

5. **Пути к модулям**:
   Убедитесь, что пути к модулям правильные. Если модули находятся на одном уровне, то указывайте их так, как они располагаются.

### Пример команды для сборки

Здесь пример команды для сборки и запуска:

```json
{
  "scripts": {
    "start:Service1": "node dist/BackEnd/Service1/index.js"
  }
}
```

### Пример запуска

Для запуска вашего сервиса в терминале из корневого каталога:

```bash
npm run build:Service1
npm run start:Service1
```

### Заключение

Убедитесь, что вы проверили все настройки `tsconfig.json` и `package.json`, а также пути к модулям. Как только вы внесете необходимые изменения, ваши сервисы должны обеспечить доступ к нужным модулям и корректно собираться и запускаться.
Проще разнести frontend и backend в разные директории, как это уже сделано, и в корне проекта убрать package.json. 
сами проекты собирать переходя в нужные директории, как будто это две разные репозитории
в целом, проще не смешивать их, ведь случаи когда фронтендер что-то коммитит в бекенд или наоборот довольно редки, и даже если будет коммит, то бекендеру проще это отследить и понимать что происходило в git log
Похожие вопросы