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

时间:2017-05-17 15:15:40

标签: typescript

我正在尝试在打字稿下完成模块解析。

如果我有:

/modulename/index.ts

应该通过以下方式解决:

import * as modulename from "modulename"

我无法让它发挥作用。但

import * as modulename from "modulename/index"

效果很好。

修改

正如aluan-haddad所建议的那样,必须正确配置tsc。

这个对我有用:

{
   ...
   "baseUrl": ".",
   "module": "commonjs",
   "moduleResolution": "node",
   ...
}

修改

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

只有我发现100%工作的解决方案是创建类似的东西:

src
   node_modules
      module_being_currently_developed
         submodules

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

2 个答案:

答案 0 :(得分:6)

主要取决于--moduleResolution标记( tsconfig.json 中的compilerOptions.moduleResultion

将导入目录自动解析为名为index的文件是NodeJS约定。

指定--moduleResolution node时,TypeScript将遵循此惯例。

此外,当--module标记( tsconfig.json 中的compilerOptions.module)设置为commonjs时,即使没有--moduleResolution旗帜。

请注意,该设置适用于应用程序代码和node_modulesjspm_packagesbower_components等目录中的依赖项。

虽然它对CommonJS项目最有意义,但设置--moduleResolution node在其他模块格式中可能是有利的,因为它有助于解决依赖关系,并避免替代classic带来的某些陷阱分辨率模式。

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

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

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

现在,让我们转到--baseUrl,因为它适用于您的方案。

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

import * as modulename from "modulename";

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

但是,如果您计划使用CommonJS模块(我再次建议不再使用仅限浏览器的应用程序),您最好将"baseUrl"设置为"."而不是"/" 。即便如此,像Native NodeJS这样的工具需要的功能也不支持源自浏览器工具世界的baseUrl概念。然而,Webpack确实支持它。

无论如何,要将您的第一方代码视为第三方代码,我建议以下内容(请注意装载机要求!):

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

答案 1 :(得分:0)

您必须在文件夹(模块)名称中添加斜杠,这会将 index.ts 视为文件夹索引。

num1 = num1 ^ num2;