Javascript 在TypeScript中导入本地安装的节点模块

Javascript 在TypeScript中导入本地安装的节点模块,javascript,node.js,typescript,Javascript,Node.js,Typescript,场景: 我正在使用TypeScript(版本>=3)开发一个脚本。我的脚本具有依赖于著名图形库的特性,图形库本身是用JavaScript编写的。我已经在我的项目中本地安装了这个库及其TypeScript类型定义,导致相关文件被放置在“node_modules”目录的相应子目录中 我已将我的项目设置为将我的TypeScript传输到ES6-规范JavaScript 我在表单的主TypeScript文件顶部有一条导入语句: import * as LIB from 'library' 其中“lib

场景:

我正在使用TypeScript(版本>=3)开发一个脚本。我的脚本具有依赖于著名图形库的特性,图形库本身是用JavaScript编写的。我已经在我的项目中本地安装了这个库及其TypeScript类型定义,导致相关文件被放置在“node_modules”目录的相应子目录中

我已将我的项目设置为将我的TypeScript传输到ES6-规范JavaScript

我在表单的主TypeScript文件顶部有一条导入语句:

import * as LIB from 'library'
其中“library.js”是必需的库文件,隐藏在“node_modules”的子目录中。TypeScript编译器有自己复杂的过程,这意味着它可以找到这个文件,而不需要相对的文件路径或文件扩展名

如果我在主“.ts”文件上运行TypeScript编译器,就会得到一个JavaScript文件。因为我使用的是ES6,所以生成的JavaScript文件中的import语句与我的TypeScript源代码中的import语句相同。这是我的问题

在本地开发服务器上运行时,脚本找不到生成的JavaScript试图导入的文件,因为它试图导入的文件位于“node_modules”目录中的某个位置,并且导入未指向该目录。因此,执行代码时,浏览器控制台中将显示沿
错误解析模块说明符
行的错误

我希望代码能够从TypeScript传输到JavaScript(ES6),以便在我从本地测试服务器向浏览器提供代码时,可以解析生成的JavaScript中的导入。

问题:

1) 这种行为是由于我不正确地配置TypeScript编译器造成的吗

2) 这种行为是由“tsconfig.json”和/或“package.json”配置文件中的属性导致的还是直接受其影响

3) 这实际上是一个问题,还是因为我不了解如何从节点服务器组织和提供文件


提前感谢您的帮助。

当您说您正在“基于节点的服务器”上运行代码时,您的错误消息表明您实际上正在为ES6模块提供服务,该模块包含从“库”到浏览器的非相对导入,如
import*as LIB。正如您所建议的,这是不受支持的,因为浏览器中非相对导入的解析算法尚未标准化;例如,请参见。您需要一个单独的工具将非相对导入重写为相对导入(我不熟悉此类工具,但会邀请其他人在其他答案中描述它们),或者您需要从浏览器本机模块切换到非本机模块,如Webpack、Rollup、Browserify或RequireJS,其中任何一个都应该支持您的场景。

在撰写本文时,如果不使用@Matt McCutchen建议的模块绑定器或加载程序,我的问题似乎无法解决(以一般方式)。在TypeScriptGithub页面上有几个关于这个问题的讨论:

对于将来发现这个问题的其他人,我以一种非常不令人满意的方式解决了我的具体案例中的问题——完全避免使用导入,只需在加载主依赖脚本之前将所需的库加载到HTML脚本标记中。这是可以接受的,因为我的项目有一个不会被更新的依赖项(所以我永远不需要手动更改脚本标记中的“src”)


我再次强调,在一般情况下,这不是一个令人满意的解决方案,因此我将把问题留待一段时间,以防有人提出更好的答案。

它应该可以正常工作,但避免导入
*
库,除非库作为ESM提供。无论如何,测试这个问题很容易。1:
>节点
2:
var lib=require(“库”);控制台表(lib)感谢您的回复。您说得对,我正在为浏览器提供ES6模块,而不是在服务器上运行它。我编辑了我的问题以澄清这一点。还感谢您对捆绑机和装载机的建议。理想的情况是,我在工作流程中尽量少使用额外的工具。