简单的绝对导入会导致“找不到模块”错误

时间:2018-12-06 08:49:39

标签: typescript

我已经在小项目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中的项目根。我在做什么错了?

2 个答案:

答案 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代码:

VS Code Auto Completion

顺便说一句,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"