Import 使用ES6语法和绝对路径导入外部模块

Import 使用ES6语法和绝对路径导入外部模块,import,typescript,Import,Typescript,所以我有一个项目看起来像这样: app/ bin/ lib/ src/ main/ submodule.ts utilities/ common.ts main.ts tsconfig.json gulpfile.js 其中根/是app/src/,因为在那里可以找到tsconfig。是的,app/src/utilities/common.ts确实导出名为common的模块 问题是我得到了“找不到模块'/utilities/c

所以我有一个项目看起来像这样:

app/ bin/ lib/ src/ main/ submodule.ts utilities/ common.ts main.ts tsconfig.json gulpfile.js 其中根
/
app/src/
,因为在那里可以找到
tsconfig
。是的,
app/src/utilities/common.ts
确实导出名为
common
的模块

问题是我得到了“找不到模块'/utilities/common'”错误。我试过很多东西:

  • utilities/common
  • /src/utilities/common
  • /app/src/utilities/common
这些都不管用。
。/utilities/common
的相对路径确实有效,但公共模块的相对路径是维护的噩梦

值得注意的是,我刚刚从TS 1.5更新到1.6:使用
utilities/common
在1.5中起作用。不过,在1.6版本的注释中,我找不到任何关于这方面的突破性变化

我提到了
gulpfile.ts
和其他文件夹,因为我最终希望Gulp从
src
获取ts文件,并将编译后的JS文件放入
bin
。我有理由相信,我已经使用
Gulp typescript
为此正确配置了Gulp,但为了完整起见,这里是我的
tsconfig.json
gulpfile.js

  • tsconfig.json

    { "compilerOptions": { "module": "commonjs", "target": "es5", "experimentalDecorators": true, "emitDecoratorMetadata": true, "noEmitOnError": true }, "filesGlob": [ "./**/*.ts", "!./typings/**/*.ts" ] }

如果路径以
/
开头,则相对于当前文件执行模块解析

下面是一个快速示例,使用:

/
/src/
/src/thing.ts
/main/
/main/submodule.ts
/utilities/
/utilities/common.ts
因此,将
common.ts
导入
submodule.ts
的正确语句是:

import {common} from '../utilities/common';
您还可以使用以下根路径(请注意,此处没有前导的
/
或任何
s):

这在Visual Studio代码中适用,父文件夹
src
作为工作文件夹打开。就我而言,我的目标是使用UMD模块的ES5

如果可以通过从当前位置向上遍历找到模块,则还可以解析该模块(这是NodeJS的一个功能)。因此,您可以使用以下方法将
thing.ts
导入
子模块.ts

import {something} from 'thing';
冲突解决程序将检查当前文件夹,然后检查父文件夹,然后检查父文件夹的父文件夹。。。等等

绝对路径与相对路径 当涉及到网页上的链接时,我同意您的观点,即绝对路径更容易维护,特别是在资源在多个级别共享的情况下

当谈到模块时,我不确定我是否看到了相同的维护问题,因为这里的路径是“相对于导入语句出现的文件”,而不是相对于网页。我不知道这是否是在错误的地方应用了非常合理的规则。

最终解决了这个问题。根据,1.6更改了模块分辨率,使其行为类似于节点。我还没有调查节点的模块解析以确定是否可以使用该行为进行修复,但我找到了一个解决方法:


通过指定
“moduleResolution”可以触发旧的行为:
tsconfig.json

中的“classic”
将注释移动到了answer中。您的屏幕截图与我希望实现的内容相匹配(路径中的
src
稍后会给我带来麻烦,但这不是问题的一部分),但是VS代码给了我一个相同设置的错误。我使用的是版本0.9.1,带有类型脚本1.6.2;你也是这样吗?是的-Visual Studio代码的0.9.1,TypeScript 1.6.2。你的机器上还有其他版本的编译器吗?如果是这样的话,我希望它可以工作,因为它在我更新之前就可以工作。我确实安装了(几个)其他版本的
tsc
,但1.6绝对是我的路径中的版本,由PowerShell找到,并由Visual Studio 2015使用。我会试着去掉旧的,看看它是否能让事情突然变好,但我很怀疑。不幸的是,现在不能这样做。把我的旧TypeScript编译器塞进回收站;没有变化。至于你在那里的最后一部分,正如名字
utilities/
可能表明的那样,我有许多共享的、通用的实用程序函数,它们在我的项目中使用。计算每个给定文件需要到达根目录的
。/
的数量既难看又混乱,并且使重新组织文件变得不必要的痛苦。我绝对坚持我的主张,绝对的道路在这里是必要的。对于我的文件夹或我的子文件夹中的内容,我可以看到相对路径的优点,但只要你必须上下不同的分支,就不会。
import {common} from '../utilities/common';
import {common} from 'src/utilities/common';
import {something} from 'thing';