Node.js中的Typescript baseUrl

22
为避免在导入中出现过长的路径,我正在使用Typescript的baseUrl选项来配置我的tsconfig.json文件。
这是我的tsconfig.json文件:
{
    "compilerOptions": {
        "target": "ES6",
        "module": "none",
        "removeComments": true,
        "rootDir": "./",
        "outDir": "Build",
        "moduleResolution": "node",
        "noImplicitAny": true,
        "pretty": true,
        "baseUrl": "./"
    },
    "exclude": [
        "node_modules",
        "Build"
    ]
}

所以不要这样做

import foo from "../../../../hello/foo"

我做这件事

import foo from "hello/foo"

在 TypeScript 编译器中一切正常,但当我用 Node.js 运行我的应用程序时,出现了这个错误:

module.js:474
    throw err;
    ^

Error: Cannot find module 'hello/foo'

P.s: 我不想像在互联网上看到的那样替换 require() 函数。

那么我该如何让 node.js 使用 baseUrl 或者让 typescript 将路径替换成 "../../../../hello/foo" ?

Typescript 编译器版本:

Version 2.3.0-dev.20170303
4个回答

24

在使用 node.js 运行应用程序时,请传递 NODE_PATH 环境参数。

示例:

set NODE_PATH=./src
node server.js

1
如果我使用以下命令,就会出现这个错误:```Running seed command NODE_PATH=./ ts-node --compiler-options {"module":"CommonJS"} prisma/seed.ts ...运行种子命令时发生错误: Error: Command failed with ENOENT: NODE_PATH=./ ts-node --compiler-options {"module":"CommonJS"} prisma/seed.ts spawn NODE_PATH=./ ENOENT``` - Dimitri Borgers

9

正如@jez所说,运行节点应用程序时需要设置NODEPATH。这是可能会帮助你的配置:

tsconfig.json

"outDir": "dist",
"baseUrl": "./",

Package.json

"scripts": {
    "build": "tsc",
    "dev": "NODE_PATH=./ ts-node ./src/index.ts",
    "start": "NODE_PATH=./dist node ./dist/index.js",
    "prod": "npm run build && npm run start"
  },

1
这个答案是针对 Windows 10 操作系统设计的吗?我无法让它工作。我总是从 Nodejs 加载器中得到这个错误:在 Function.Module._resolveFilename (internal/modules/cjs/loader.js:892:15)。 - user10832440

2

对于使用Windows的用户,建议使用cross-env来实现上述答案。

package.json

"scripts": {
    "dev": "cross-env NODE_PATH=./ ts-node ./src/index.ts"
 }

-3

只需在您的 tsconfig.json 文件中添加此行。

"baseUrl": "./src"

它应该可以完美运行。


7
它在用于浏览器中运行的脚本时表现非常好。但是在node.js上运行时,加载器似乎无法解析 require("abc/xyz"),但它可以解析 require("./abc/xyz")。 - user10832440

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接