如何在简单的TypeScript中导入Node模块

5

我对TypeScript还不熟悉,我只是试图引入一个从node模块导入的模块。我没有使用webpack或任何其他构建工具,因为我想尽可能保持简单以便理解。

这是我的结构:

/node_modules    -- contains node modules I want to import in main.ts
/scripts/ts/main.ts
/scripts/main.js -- the transpiled main.ts file
/index.html      -- includes the module script tag for scripts/main.js
/package.json
/tsconfig.json

这是我的 tsconfig.json 文件:

{
    "compilerOptions": {
        "target": "ES6",
        "module": "ES2015",
        "strict": true,
        "forceConsistentCasingInFileNames": true,
        "outDir": "scripts",
        "moduleResolution": "Node",
        "experimentalDecorators": true
    },
    "$schema": "https://json.schemastore.org/tsconfig",
    "exclude": [],
    "include": [
        "scripts/ts/**/*"
    ]
}

我的main.ts文件有以下导入:

import { css, html, LitElement } from 'lit';
import { customElement, property } from 'lit/decorators.js';

main.ts文件被转译为main.js成功加载,但是我遇到了以下错误:

Uncaught TypeError: Failed to resolve module specifier "lit". Relative references must start with either "/", "./", or "../".

导入语句被逐字转换。在转换后的文件中,它们看起来完全相同,因此我想问题在于模块路径错误:浏览器不知道“lit”在“node_modules / lit”中,当我手动更改转换后文件中的路径为 ../node_modules/lit/index.js,那么就会出现另一个错误。
Uncaught TypeError: Failed to resolve module specifier "@lit/reactive-element". Relative references must start with either "/", "./", or "../".

我想这是一个由其他lit模块在层次结构中导入的模块。 基本上我的导入路径没有被正确转译,我不知道该怎么办。 任何帮助都将是极好的!

1
你的 html 文件长什么样子?它只是从 scripts/main.js 导入吗?如果是这样,我认为问题在于 Typescript 无法将你的依赖项捆绑成一个单独的文件,这就是为什么它不起作用的原因。这通常是 webpack 的用武之地。已经有类似的问题关于避免使用 webpack:https://dev59.com/questions/I1YN5IYBdhLWcg3wNFt4 - cdimitroulas
是的,它只是执行一个<script type="module" src="scripts/main.js">。嗯...我没想到它需要将它捆绑在一个单独的文件中。模块可以引用其他模块,只需要知道在哪里查找对吧?我会看一下链接的,谢谢! - frezq
1
你是对的 - 问题在于浏览器不知道如何解析导入到node_modules文件夹的内容。你可以像这个答案所示那样手动写出node_modules路径: https://dev59.com/-FQK5IYBdhLWcg3wDLrP#52558858 - cdimitroulas
当我这样做时,我得到了Uncaught TypeError: Failed to resolve module specifier "@lit/reactive-element". Relative references must start with either "/", "./", or "../". 我没有直接使用@lit/reactive-element,所以这一定是依赖图中较低层次的导入。无论如何,你是对的,我现在记得ES6导入需要有绝对或相对路径 - "普通节点导入"根本不起作用,这些需要以某种方式进行转换,不仅适用于我的模块,还适用于依赖图中的每个其他模块。非常感谢您花时间讨论这个问题。 - frezq
1
这就是为什么我更喜欢在后端工作 :P 所有前端工具都变得非常复杂!不过很高兴你解决了问题。Webpack确实可以打包所有需要的内容,包括第三方依赖项。它通过所有导入并选择用于添加到最终捆绑包中的代码来工作。 - cdimitroulas
显示剩余2条评论
1个回答

2

感谢@cdimitroulas让我思考这个问题。

ES6导入需要具有绝对或相对路径 - “普通节点导入”根本不起作用,这些路径需要以某种方式解析,不仅适用于主模块的导入,还适用于依赖图中每个其他模块的导入。

TypeScript编译器无法处理此问题,因此当前设置缺少一个工具来解决这些路径(例如web-dev-server),或者将模块及其所有依赖项捆绑在一个文件中(例如webpack),从而消除了解决路径的需要。


我需要在 tsconfig 文件中添加一些代码吗? - VAAA

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