【问题标题】:Using paths in TypeScript in a NodeJS project在 NodeJS 项目中使用 TypeScript 中的路径
【发布时间】:2019-01-12 00:12:06
【问题描述】:

我正在尝试在 NodeJS 项目中使用 tsconfig.json 中的 paths 属性。

tsconfig.json 我有这样的东西:

"baseUrl": ".",
"paths": {
  "@myApp/server/*": [
    "server/src/*"
  ],
  "@myApp/common/*": [
    "common/src/*"
  ]
},

运行 tsc 按预期输出所有 JS 文件,但它们保留 @myApp... 导入。因此,node 将无法运行,因为它无法解析路径为@myApp... 的所有模块。

我找不到将我在tsconfig.json 中设置的paths 转换为node 可以使用的值的方法。我只找到了this question on SO,但它已经过时了,而且不会导致一个干净的解决方案。

我们有没有办法以我们能够使用paths 的方式将 TS 转换为 JS?

【问题讨论】:

  • 为什么你使用 baseUrl 到 "../" 而不是 "."
  • @AvinashMaurya 错字,我已经编辑了问题:-)
  • 我相信你知道baseUrl是相对于'tsconfig.json'的位置的。你能确认一下吗?
  • 当然可以。正如我所说,打字稿工作正常,tsconfig.json 中的设置是正确的。问题是tsconfig.json中定义的绝对paths在JS中不起作用,我正在寻找一种将它们转换为相对路径的方法。
  • 你用来转译ts代码的命令是什么?

标签: node.js typescript import


【解决方案1】:

如果这里有人使用 nodejs 和 tsconfig-paths。您可以使用以下命令使绝对路径起作用:

// With ts-node    
ts-node -r tsconfig-paths/register src/main.js

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

从这里得到这个: https://github.com/dividab/tsconfig-paths/issues/61

【讨论】:

    【解决方案2】:

    直到今天,我一直按照接受的答案中的建议使用 tspath,但我开始遇到一些问题,即相对路径为 baseUrl: '../'

    我切换到基于webpack 的方法,使用此webpack.config.ts 配置:

    import { TsConfigPathsPlugin } from 'awesome-typescript-loader';
    import * as fs from 'fs-extra';
    import { join } from 'path';
    import * as webpack from 'webpack';
    
    const packageConfig = fs.readJSONSync('./package.json', { encoding: 'utf-8' });
    
    const externals = {};
    for (const packageName in packageConfig.dependencies)
      externals[packageName] = packageName;
    
    const serverConfig: webpack.Configuration = {
      entry: {
        index: './src/index.ts'
      },
      resolve: {
        extensions: ['.ts', '.js'],
        plugins: [
          new TsConfigPathsPlugin({ configFileName: 'tsconfig.json' })
        ]
      },
      target: 'node',
      node: {
        __dirname: false
      },
      externals,
      output: {
        path: join(__dirname, 'dist'),
        filename: '[name].js',
        library: '[name]',
        libraryTarget: 'umd'
      },
      module: {
        rules: [{
          test: /\.ts$/,
          loader: 'awesome-typescript-loader'
        }]
      },
      plugins: [
        new webpack.BannerPlugin(`Copyright © 2018-${new Date().getFullYear()} BOHR. All rights reserved.`)
      ],
      mode: 'production',
      optimization: {
        minimize: false
      }
    };
    
    // tslint:disable-next-line:no-default-export
    export default [serverConfig];
    

    注意导入,您需要添加一些包才能使用此配置。

    【讨论】:

      【解决方案3】:

      我发现了这个npm 包,它将所有绝对路径转换为相对路径:https://www.npmjs.com/package/tspath

      运行tsc 将生成具有绝对路径的文件(例如@myApp/server/my-library)。然后运行tspath会将所有路径转换为相对路径。

      【讨论】:

        【解决方案4】:

        您为什么不直接在代码中使用path 模块,并解析相对于您启动服务器的目录的其余目录的路径?

        看看这个例子中的第 6 行: https://github.com/Farata/angulartypescript/blob/master/code-samples/Angular6/chapter12/server/rest-server-angular.ts.

        __dirname 指向服务器启动的目录,public 是该目录的子目录。我没有使用 tsc 的paths 选项。

        【讨论】:

        猜你喜欢
        • 2016-07-05
        • 2023-04-08
        • 2021-04-20
        • 2018-12-07
        • 1970-01-01
        • 1970-01-01
        • 2017-06-03
        • 1970-01-01
        • 2014-08-23
        相关资源
        最近更新 更多