tsconfig.json中的路径在tsc之后不起作用

问题描述 投票:0回答:1

在我的Express项目中,我从@common/foo之类的路径导入。多亏了paths中的tsconfig.json,它只是../common/src/foo的别名。太棒了,可以在nodemon.json

中使用此脚本进行开发
{
    "watch": ["src", "../common/src"],
    "ext": "ts",
    "ignore": ["src/public"],
    "exec": "ts-node -r tsconfig-paths/register src/index.ts"
  }

问题是我无法使其在生产模式下工作。

我使用tsc构建项目,如果我检查生成的文件,它们将从@common/而不是../common/src/导入内容。起初我认为这很好,因为tsconfig-paths在运行时有效,所以我只需要像这样将其包含在start脚本中:

node -r tsconfig-paths/register dist/index.js

不幸的是,它没有用,并且我在控制台中收到了这些Cannot find module '@common/foo错误消息。

有什么问题?我配置错了吗?


我的package.json(删除了所有不相关的部分):

{
  "main": "index.js",
  "scripts": {
    "start": "cross-env NODE_ENV=prod node dist/index.js",
    "build": "rimraf ./dist/ && cross-env NODE_ENV=prod tsc"
  },
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {
    "@types/express": "^4.17.4",
    "@types/node": "^13.11.0",
    "cross-env": "^6.0.3",
    "rimraf": "^3.0.2",
    "ts-node": "^8.8.2",
    "tsconfig-paths": "^3.9.0",
    "typescript": "^3.8.3"
  }
}

我的tsconfig.json(删除了所有不相关的部分):

{
  "compilerOptions": {
    "module": "commonjs",
    "baseUrl": "./",
    "outDir": "dist",
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "noImplicitAny": false,
    "target": "es6",
    "emitDecoratorMetadata": true,
    "moduleResolution": "node",
    "importHelpers": true,
    "types": [
      "node"
    ],
    "typeRoots": [
      "node_modules/@types"
    ],
    "paths": {
      "@common/*": [
        "../common/src/*"
      ]
    }
  },
  "include": [
    "./src/**/*.ts"
  ],
  "exclude": [
    "./src/dist/"
  ],
  "references": [
    {
      "path": "../common"
    }
  ]
}
node.js typescript tsc
1个回答
0
投票

这在很多地方都被问到了,显然Typescript可以为开发提供路径别名,但不能为生产提供路径别名(请不要在此引用我,它已经使用了不到一个月的时间。]

要解决此问题,我安装了'module-alias',这是一个在构建后即可解决路径问题而又不干扰开发的软件包。

我正在构建一个Express-js应用程序,并且具有以下文件:

server.js:

import env from '@env';
import app from './app';

app.listen(env.SERVER_PORT || 3000);

tsconfig.json(相关部分):

{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "@env": ["src/path/to/env"]
    }
  }
}

这解决了开发运行时的路径,但是在使用'tsc'构建之后没有解决。要解决此问题,我添加了“ module-alias”包,并进行了以下更改:

server.js:

import 'module-alias/register';
import env from '@env';
import app from './app';

app.listen(env.SERVER_PORT || 3000);

package.json(相关部分):

{
  "_moduleAliases": {
    "@env": "dist/path/to/env"
  }
}

这可以确保@env在开发运行时和构建后都能解析。希望对您有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.