【问题标题】:paths from tsconfig.json doesn't work after tsc来自 tsconfig.json 的路径在 tsc 之后不起作用
【发布时间】:2020-08-04 03:40:48
【问题描述】:

在我的 Express 项目中,我从 @common/foo 之类的路径导入。感谢tsconfig.json 中的paths,它只是../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】:

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

    node -r ts-node/register/transpile-only -r tsconfig-paths/register dist/index.js
    

    这是你需要做的。

    【讨论】:

      【解决方案2】:

      很多地方都问过这个问题,显然 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": ["path/to/env"]
          }
        }
      }
      

      这解决了开发运行时的路径,但不是在使用“tsc”构建之后。为了解决这个问题,我添加了“模块别名”包并进行了以下更改:

      server.js:

      import './paths';
      import env from '@env';
      import app from './app';
      
      app.listen(env.SERVER_PORT || 3000);
      

      paths.js

      import 'module-alias/register';
      import { addAliases } from 'module-alias';
      
      addAliases({
        '@env': `${__dirname}/path/to/env`,
      });
      

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

      【讨论】:

        猜你喜欢
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 2016-11-17
        • 1970-01-01
        • 2017-09-03
        • 2020-03-29
        相关资源
        最近更新 更多