我正在尝试在打字稿下进行模块解析。
如果我有:
/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)
在这种情况下,模块分辨率将正常工作。
它主要取决于--moduleResolution标志(compilerOptions.moduleResultion在tsconfig.json中)
自动将导入目录解析为名为indexNodeJS 的文件。
指定--moduleResolution nodeTypeScript时将遵循此约定。
此外,将--module标记(compilerOptions.module在tsconfig.json中)设置commonjs为此约定时,即使没有该--moduleResolution标记,也会自动应用。
需要注意的是,设置适用于应用程序代码和依赖关系的目录,例如node_modules,jspm_packages和bower_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确实支持它。
无论如何,要将您的第一方代码当作第三方代码,无论如何我都建议您这样做(请注意加载程序的要求!):
"baseURl"于".""moduleResolution"到"node","module"显式设置为"commonjs","system"或"amd"(建议不要使用“ UMD”)。"commonjs"下节点,请考虑使用,"paths"因为它允许进行一些非常复杂的重组。| 归档时间: |
|
| 查看次数: |
2995 次 |
| 最近记录: |