我已经在小项目here中复制了此内容。
所以我有一个parse
,看起来像:
main.ts
和import hello from "dm/lib/helper"
hello("Jeff")
中的helper.ts
如下:
src/lib/herlper.ts
非常简单。现在到export default function hello(name: string) {
console.log(`Hello ${name}`)
}
:
tsconfig.json
编译/转换工作正常,并弹出了一些Javascript。使用{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"outDir": "dist",
"strict": true,
"noImplicitAny": true,
"moduleResolution": "node",
"baseUrl": "./",
"paths": {
"dm/*": [
"./src/*"
],
},
},
"include": [
"src/**/*"
]
}
运行main.js
会出现类似以下错误:
npm start
我没想到TypeScript会包含module.js:549
throw err;
^
Error: Cannot find module 'dm/lib/helper'
at Function.Module._resolveFilename (module.js:547:15)
,因为我用来引用最终JS中的项目根。我在做什么错了?
答案 0 :(得分:2)
根据this closed issue,在TypeScript中没有外部工具就无法使用绝对导入,主要是因为它不会在发出的JavaScript中重写您的导入。
在前端项目中,您可以让 webpack 解决这些导入问题,但是由于我正在执行nodejs / electron项目,因此这里仍然没有webpack设置。
VSCode设法在TypeScript中使用绝对导入也很有趣,但是它们也使用了webpack,但我不知道它们是如何实现这种效果的。如果您知道他们如何做到这一点,请随时回答这个问题。
更新
因此,我设法使用 webpack 在TypeScript / nodejs项目中启用绝对导入。这绝不是唯一的方法,但是可以。
我更新了project code here。这里有一些亮点:
安装这些:
npm install --save-dev webpack webpack-cli webpack-node-externals ts-loader
在webpack.config.js
中添加webpack配置:
const path = require("path")
const nodeExternals = require("webpack-node-externals")
module.exports = {
mode: "development",
target: "node",
entry: {
app: ["./src/main.ts"]
},
module: {
rules: [
{
test: /\.ts$/,
use: "ts-loader",
exclude: /node_modules/
}
]
},
resolve: {
alias: {
dm: path.resolve(__dirname, "src/")
},
extensions: [".ts", ".js"]
},
output: {
path: path.resolve(__dirname, "dist/"),
filename: "main.js"
},
externals: [nodeExternals()]
}
构建并运行项目:
npm run build && npm start
答案 1 :(得分:1)
您的项目结构为:
main.ts
-- lib
helper.ts
因此,您的导入应为:
import hello from './lib/helper';
键入./
后,您的IDE或文本编辑器应介入并帮助您正确找到路径,即Visual Studio代码:
顺便说一句,Node中的模块解析意味着您需要在路径中放入./
才能加载相关模块。您可以在Node Modules docs中阅读模式。您要点击以下列表中的规则(3)。
require(X) from module at path Y
1. If X is a core module,
a. return the core module
b. STOP
2. If X begins with '/'
a. set Y to be the filesystem root
3. If X begins with './' or '/' or '../'
a. LOAD_AS_FILE(Y + X)
b. LOAD_AS_DIRECTORY(Y + X)
4. LOAD_NODE_MODULES(X, dirname(Y))
5. THROW "not found"