TypeScript应该将index.ts解析为默认模块文件吗?

Fis*_*Fis 7 typescript

我正在尝试在打字稿下进行模块解析。

如果我有:

/modulename/index.ts
Run Code Online (Sandbox Code Playgroud)

是否应通过以下方式解决:

import * as modulename from "modulename"
Run Code Online (Sandbox Code Playgroud)

我无法正常工作。但

import * as modulename from "modulename/index"
Run Code Online (Sandbox Code Playgroud)

效果很好。

编辑

正如aluan-haddad向我推荐的那样,必须正确配置tsc。

这个为我工作:

{
   ...
   "baseUrl": ".",
   "module": "commonjs",
   "moduleResolution": "node",
   ...
}
Run Code Online (Sandbox Code Playgroud)

编辑

请注意,此配置与VS一起使用时不起作用。如果将其放在外部tsconfig文件中,则编译效果很好,但语言服务无法处理。如果将其同时放在msconfig(csporj)中,则编译和语言服务都会失败。

我发现只能为100%工作的一种解决方案是创建以下内容:

src
   node_modules
      module_being_currently_developed
         submodules
Run Code Online (Sandbox Code Playgroud)

在这种情况下,模块分辨率将正常工作。

Alu*_*dad 8

它主要取决于--moduleResolution标志(compilerOptions.moduleResultiontsconfig.json中

自动将导入目录解析为名为indexNodeJS 的文件。

指定--moduleResolution nodeTypeScript时将遵循此约定。

此外,将--module标记(compilerOptions.moduletsconfig.json中)设置commonjs为此约定时,即使没有该--moduleResolution标记,也会自动应用。

需要注意的是,设置适用于应用程序代码和依赖关系的目录,例如node_modulesjspm_packagesbower_components

尽管对于CommonJS项目来说最有意义,但是设置--moduleResolution node可以在其他模块格式中发挥优势,因为它有助于解析依赖项,并且避免了替代classic解析模式附带的某些陷阱。

但是请注意,诸如RequireJS和SystemJS之类的加载程序不会在您的本地应用程序代码中自动采用此约定,因此,在导入您自己的应用程序代码时,仍建议在模块说明符中使用显式索引文件。

尽管设置了CommonJS --moduleResolution node,但即使在浏览器中不使用CommonJS,Webpack或Browserify时,我仍然更喜欢并推荐(我可能会避免使用它们)。

我选择的加载器是SystemJS,选择的软件包管理器是JSPM,但是我仍然更喜欢使用节点解析方案,因为它使导入依赖项更加容易,这部分归功于JSPM对SystemJS加载器的自动配置。

现在,让我们继续将--baseUrl其应用于您的方案。

您正在尝试将本地模块导入为

import * as modulename from "modulename";
Run Code Online (Sandbox Code Playgroud)

并且已经设置--module commonjs--baseUrl /尝试导入一个本地模块,就像它是第三方程序包一样,以准备将其代码库拆分为独立的程序包。我可能会补充说,这是很好的计划,因此:+10!

但是,如果您打算使用CommonJS模块(对于仅用于浏览器的应用程序,我再次建议不要这样做),则绝对应该将设置"baseUrl"为,"."而不是"/"。即使那样,诸如Native NodeJS的require函数之类的工具也不支持源自浏览器工具世界的baseUrl概念。Webpack确实支持它。

无论如何,要将您的第一方代码当作第三方代码,无论如何我都建议您这样做(请注意加载程序的要求!):

  1. 设置"baseURl""."
  2. 设置"moduleResolution""node"
  3. "module"显式设置为"commonjs""system""amd"(建议不要使用“ UMD”)。
  4. 如果不使用"commonjs"下节点,请考虑使用,"paths"因为它允许进行一些非常复杂的重组。

  • 我有 "baseUrl": "/", "module": "commonjs", "moduleResolution": "node" 但它似乎仍然无法正常工作:( (2认同)