Псевдонимы путей машинописного текста не решаются правильно во время выполнения - PullRequest
0 голосов
/ 05 февраля 2020

Я использую VS Code и в настоящее время пытаюсь настроить псевдонимы в моем проекте машинописного текста.

Моя установка dev опирается на nodemon и ts-node, код компилируется в папку dist.

До сих пор мне удалось заставить Typescript Hero управлять импортом с псевдонимами:

alias resolution vscode

Пока что моя структура папок:

.
└─┬ src
  ├──modules
  ├────Category
  ├────Ressource
  ├──shared
  ├────debug

// tsconfig.json
{
    "compilerOptions": {
        "module": "commonjs",
        "moduleResolution": "node",
        "pretty": true,
        "sourceMap": true,
        "target": "es6",
        "outDir": "./dist",
        "baseUrl": "./src",
        "paths": {
            "@shared/*": [
                "shared/*"
            ],
            "@modules/*": [
                "modules/*"
            ]
        },
        "resolveJsonModule": true,
        "esModuleInterop": true
    },
    "include": [
        "src/**/*.ts"
    ],
    "exclude": [
        "node_modules",
        "**/*.spec.ts",
        "**/*.test.ts",
    ]
}

И это первый импорт псевдонимов, который не удался.

//Server.ts file
import Print from '@shared/debug/Print.class';
import App from './App';

const MyApp: App = new App();

MyApp.ExpressApp.listen(MyApp.Config.ExpressPort, () => {
    Print.Log('Express server listening on port ' + MyApp.Config.ExpressPort);
});

Однако я получаю сообщение об ошибке: "Не удается найти модуль '@ shared / debug / Print.class'" в "cross-env NODE_ENV = узел разработкиmon ts-node. /src/server.ts». CMD logs

И вот где я стою.

Теперь я прочитал некоторые вопросы и ответы по SO, и кажется, что даже если мне удастся сделать псевдонимы работают в то время как в dev, он потерпит неудачу в производстве, так как я работаю из папки Typescript sr c, а мои выходные данные встроены в dist? Если так, есть ли способ исправить? Большое спасибо

1 Ответ

0 голосов
/ 09 февраля 2020

Проблема заключалась в разрешении псевдонимов пути узла во время выполнения. Даже если машинопись была выполнена во время выполнения ts-node, псевдонимы не могут быть разрешены узлом как есть. (Я думаю)

Но это была только вершина айсберга. Я столкнулся бы с этим позже с моей настройкой шутки и во время выполнения JS.

Мне приходилось находить способ, чтобы в каждой среде выполнения интерпретировать мои псевдонимы. Было несколько npm пакетов, но для многих из них требовалось больше объявлений.

И я не хотел объявлять свои псевдонимы во всех конфигурационных файлах, которые у меня были, и зависел только от моего файла tsconfig.

После долгих испытаний у нас было только два модуля для установки tsconfig-paths для выполнения машинописного текста на ts-node. И @ ef-carbon / tspm для преобразования моих псевдонимов в место назначения сборки.

npm i -D tsconfig-paths @ef-carbon/tspm

Для ts-узла сценарий был изменен следующим образом:

ts-node -r tsconfig-paths/register ./src/server.ts

Для скомпилированного js вам нужно только выполнить:

ef-tspm

Для jest ts-jest требуется, он у меня уже был, но он не был правильно настроен. Я использовал встроенный помощник, чтобы настроить мои пути. Мой файл конфигурации Jest теперь выглядит так:

//jest.config.js
const { pathsToModuleNameMapper } = require('ts-jest/utils');
const { compilerOptions } = require('./tsconfig');
module.exports = {
    roots: ['<rootDir>/src'],
    globals: {
        'ts-jest': {
            tsConfig: 'tsconfig.json',
            diagnostics: {
                warnOnly: true,
            },
        },
    },
    clearMocks: true,
    coverageDirectory: 'coverage',
    testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
    moduleFileExtensions: ['js', 'json', 'jsx', 'node', 'ts', 'tsx'],
    testEnvironment: 'node',
    moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/src/' }),
    pathToJest: 'npm test',
    preset: 'ts-jest',
    testMatch: null,
};

Вот как мои скрипты выглядят в моем пакете. json

  "scripts": {
    "dev:ts": "cross-env NODE_ENV=development nodemon",
    "dev:js": "cross-env NODE_ENV=development npm run start:js",
    "staging": "cross-env NODE_ENV=staging npm run start:js",
    "production": "cross-env NODE_ENV=production npm run start:js",

    "test": "cross-env NODE_ENV=testing jest --runInBand",
    "test:debug": "npm run test --detectOpenHandles",

    "start:js": "npm run build && nodemon --config nodemon-js.json",
    "build": "npm run compile && npm run post:compile && npm run copyAssets",
    "compile": "tsc",
    "post:compile": "ef-tspm",
    "copyAssets": "copyfiles -e ./src/**/*.ts -e ./src/**/*sample* -e ./src/**/*.json -u 1 ./src/**/* ./dist/"
  },

Посмотрим, как это будет, я вероятно, добавьте решение grunt / gulp позже. Но пока это достаточно хорошо.

...