Пути машинописного текста не работают в проекте Express - PullRequest
5 голосов
/ 01 октября 2019

Я пытаюсь использовать функциональность путей машинописи, чтобы мне больше не нужно было относительный импорт.

Вот мой tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "outDir": "./dist",
    "rootDir": ".",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "resolveJsonModule": true,
    "baseUrl": ".",
    "allowJs": true,
    "paths": {
      "*": ["node_modules/*", "src/*"],
      "@config/*": ["src/config/*"],
      "@controllers/*": ["src/controllers/*"],
      "@middlewares/*": ["src/middlewares/*"],
      "@models/*": ["src/models/*"],
      "@routes/*": ["src/routes/*"],
      "@types/*": ["src/types/*"],
      "@utils/*": ["src/utils/*"]
    }
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "firebase-config.json", "webpack.config.js"]
}

Вот мой пакет. json

{
  "name": "express-ts-boilerplate",
  "version": "0.1.0",
  "description": "Express Typescript Boilerplate",
  "main": "src/server.js",
  "author": "Sriram R",
  "scripts": {
    "start": "NODE_ENV=production node dist/src/app.js",
    "dev": "nodemon src/app.ts",
    "build": "tsc -p .",
    "test": "mocha --exit -r ts-node/register src/tests/*.spec.ts"
  },
  "dependencies": {
    // deps here
  },
  "devDependencies": {
    // deps here
  },
}

Так что теперь в одном из моих файлов я пытаюсь @config/typeConfig, но я просто получаю cannot find module ошибку.

Возможно, это из-за nodemon, но это не такработать с ts-node тоже. Любые советы о том, как заставить это работать?

1 Ответ

4 голосов
/ 03 октября 2019

Примечание: для рабочего примера с nodemon перейдите ко второму разделу моего ответа.

Если вы имеете в виду, что после компиляции файлов и запуска приложения модулине найден, тогда посмотрите на эту ветку: Карты путей к модулям не разрешены в передаваемом коде.

"Пути" предназначены для использования с загрузчиками, которые позволяют перераспределять

Скажем, у меня есть этот путь в моем tsconfig.json :

"paths": {
      "@config/*": ["src/config/*"]
    }

И мне нужен файл, использующий этот путь в файле

import test from '@config/test';

Глядя в скомпилированный файл, я получаю

var test_1 = __importDefault(require("@config/test"));

Как видите, пути не были разрешены, это все еще @ config / test. То же самое произойдет при тестировании вашего приложения с nodemon и ts-node .

Кроме того, вам необходимо использовать средство разрешения псевдонимов пути Typescript, как, например, tspath .

Компилятор TypeScript сможет разрешать пути, поэтому он будет компилироваться без проблем, однако вывод JavaScript не будет возможен для выполнения ни узлом, ни веб-браузером. , Почему? Причина проста!

Механизм JavaScript ничего не знает о конфигурации TypeScript времени компиляции.

Чтобы запустить код JavaScript, теперь псевдонимы путей должны быть преобразованы в относительные путиопять же, вот когда TSPath вступает в игру.


При этом, если вы хотите, чтобы все работало с nodemon , подойдет следующая конфигурация. Предварительно убедитесь, что вы установили tsconfig-paths .

npm i tsconfig-paths

Используйте это для загрузки модулей, местоположение которых указано в разделе путей tsconfig.json. Поддерживается как загрузка во время выполнения, так и через API. (...) Если вам требуется модуль tsconfig-paths / register этого пакета, он будет считывать пути из tsconfig.json и , преобразуя вызовы загрузки модуля узла в физический файл. пути , которые этот узел может загрузить.

Отлично, мы выполним node с -r tsconfig-paths/register для преобразования путей в физические пути к файлам и -r ts-node/register для выполнения файлов ts на лету и nodemon перезапустит приложение после изменений.

В вашем package.json вам необходимо добавить это (изменить его при необходимости):

    "nodemonConfig": {
          "ignore":
            [
              "**/*.test.ts",
              "**/*.spec.ts",
              ".git",
              "node_modules"
            ],
          "watch": [
            "src"
          ],
          "exec": "node -r tsconfig-paths/register -r ts-node/register ./src/server.ts",
          "ext": "ts, js"
        },
    "scripts": {
          "dev": "nodemon"
        }

Обратите внимание на добавленную конфигурацию для nodemon .

И, наконец,

npm run dev

И все должно работать гладко.

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