tsc 后来自 tsconfig.json 的路径不起作用

Ita*_*nor 4 node.js typescript tsc

在我的 Express 项目中,我从@common/foo. 感谢pathsin 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"
  }
Run Code Online (Sandbox Code Playgroud)

问题是我不能让它在生产模式下工作。

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

node -r tsconfig-paths/register dist/index.js
Run Code Online (Sandbox Code Playgroud)

不幸的是它不起作用,我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"
  }
}

Run Code Online (Sandbox Code Playgroud)

我的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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

han*_*mza 5

对于仍然坚持这一点的人:

node -r ts-node/register/transpile-only -r tsconfig-paths/register dist/index.js
Run Code Online (Sandbox Code Playgroud)

这是你需要做的。

  • 它可以工作,但是在生产环境中使用 ts-node 不是不好的做法吗? (2认同)

Vic*_*nha 3

在很多地方都有人问过这个问题,显然 Typescript 可以为开发创建路径别名,但不能为生产创建路径别名(不要引用我的话,我使用它还不到一个月)。

为了解决这个问题,我安装了“module-alias”,这是一个包,可以解决构建后的路径问题,而不会干扰开发。

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

服务器.js:

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

app.listen(env.SERVER_PORT || 3000);
Run Code Online (Sandbox Code Playgroud)

tsconfig.json(相关部分):

{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "@env": ["path/to/env"]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

服务器.js:

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

app.listen(env.SERVER_PORT || 3000);
Run Code Online (Sandbox Code Playgroud)

路径.js

import 'module-alias/register';
import { addAliases } from 'module-alias';

addAliases({
  '@env': `${__dirname}/path/to/env`,
});
Run Code Online (Sandbox Code Playgroud)

这确保了 @env 在开发运行时和构建后都能解析。希望能帮助到你!