Общая кодовая база TypeScript с двумя выходными каталогами

#javascript #node.js #typescript

#javascript #node.js #typescript

Вопрос:

Я столкнулся с проблемой :/ Я хочу, чтобы общая кодовая база «shared» находилась в обоих каталогах. Возможно ли это с самим typescript или мне нужны дополнительные задачи сборки? Есть ли лучшее решение?

Важно: «Общая» папка должна быть сгенерирована в srv и app, иначе наша основная система сломается.

У меня есть следующий src каталог, где client содержит client.ts, server — server.ts, а shared содержит index.ts. Теперь я хочу использовать shared в client.ts и server.ts.

 src
   - client
     - client.ts
     - tsconfig.json
   - server
     - server.ts
     - tsconfig.json
   - shared
     - index.ts
     - tsconfig.json
 

Если я компилирую свой TypeScript, должен быть сгенерирован следующий вывод.

 app
   - client
     - client.js
   - shared
     - index.ts
srv
   - server
     - server.js
   - shared
     - index.ts
 

Вот мои конфигурации для каждого каталога
client/tsconfig.json

 {
    "compileOnSave": true,
    "compilerOptions": {
        "target": "es2018",
        "module": "commonjs",
        "noImplicitAny": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "outDir": "../../app",
        "sourceMap": true,
        "diagnostics": true,
    },
    "include": [
        "client.ts"
    ],
    "references": [
        { "path": "../shared"}
    ]
}
 

server/ts.config.json

 {
    "compileOnSave": true,
    "compilerOptions": {
        "target": "es2018",
        "module": "commonjs",
        "noImplicitAny": true,
        "noUnusedLocals": true,
        "noUnusedParameters": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "outDir": "../../srv",
        "sourceMap": true,
        "diagnostics": true,
    },
    "include": [
        "server.ts"
    ],
    "references": [
        {
            "path": "../shared"
        }
    ]
}
 

общий /tsconfig.json

 {
    "compilerOptions": {
      "declaration": true, 
      "declarationMap": true,
      "composite": true,     
    },
    "include": [
      "*.*"
    ],
    "references": []
}
 

PS: Если есть лучшее решение для решения этой проблемы. Пожалуйста, дайте мне знать 🙂

С уважением, Себастьян

Ответ №1:

Вы могли бы попробовать потенциально превратить папку /shared в отдельный пакет npm, а затем использовать npm link / npm install для объединения их вместе в каждом отдельном проекте? Я сделал нечто подобное с React и React Native, используя TypeScript.

Ответ №2:

Процесс компиляции Typescript не будет перемещать или добавлять файлы для вас. Это просто создание файлов .js для файлов .ts. Только с tsc невозможно создавать пакеты.

Вам следует использовать пакет, подобный webpack Вот ссылка, которая может помочь: https://webpack.js.org/guides/typescript /


При этом я думаю, что то, что вы хотите сделать, неверно. Я предполагаю, что ваш клиент — это одностраничное приложение, а сервер — это сервер узла для обслуживания этих файлов? Если это так, вы запустите свой сервер в среде узла и будете обслуживать client.js .

Вы можете объединить client.js (с помощью webpack или других инструментов командной строки) и обслуживать его непосредственно из server.js . Server.js не понадобится shared.js или client.js находиться в том же каталоге, если вы только не скопируете каталог сервера куда-нибудь.


РЕДАКТИРОВАТЬ: PS: существуют подходы monorepo для таких случаев использования в крупномасштабных проектах. Я бы посоветовал взглянуть на «рабочие пространства yarn» и «lerna»

Комментарии:

1. Мой сервер узла не обслуживает клиентские файлы, они отделены друг от друга. Вот почему мне нужен этот «общий» каталог в обоих каталогах.

2. Я не понимаю, что именно вы подразумеваете под «нужным каталогом». Если у вас есть эта структура, и если вы только запустите ‘node-ts server / server.ts’, это просто сработает. Разделяете ли вы их при публикации / запуске?

3. Клиентские файлы обслуживает другой HTTP-сервер, и наши серверные файлы будут запускаться через nodejs.

4. Хорошо, очистите. Вам наверняка нужен пакет или символические ссылки. Пакетировщик сделает трюк более чистым и устойчивым к ошибкам