我在angular2/typescript中导入时遇到问题。我想使用像'app/components/calendar'这样的根目录导入,而我只能使用类似以下的方式:
//app/views/order/order-view.ts
import {Calendar} from '../../components/calendar
其中,Calendar的定义如下:
//app/components/calendar.ts
export class Calendar {
}
而且这显然会变得更糟,你在层次结构中越低,最深的是'../../..',但它仍然是非常糟糕和脆弱的。有什么办法如何使用相对于项目根的路径吗?
我在VisualStudio中工作,相对导入似乎是唯一使VS能够识别这些导入的东西。
6条答案
按热度按时间lrl1mhuk1#
答案
从TypeScript 2.0开始,您可以按如下方式设置tsconfig.json属性
baseUrl
:然后,您可以使用所需的方式导入零部件,例如:
附录
回退路径解析
一个重要的注意事项是,指定
baseUrl
选项会导致TypeScript编译器:1.查找与baseUrl相关的路径
1.解析失败(未找到模块)时,查找与
moduleResolution
选项相关的路径系统
由于SystemJS在Angular开发阶段大量使用,因此请确保相应地配置
systemjs.config.js
,以便正确解析路径。来源和进一步详情:https://github.com/Microsoft/TypeScript/issues/5039
mitkmikd2#
更新
只是不要使用这个解决方案。拥抱节点模块解析算法。社区依赖于它,所以如果你试图不这样做,一切都会分崩离析。使用别名或其他一些提供的解决方案。
简短回答有一种方法,但您不应该这样做。将compilerOption
"moduleResolution"
设置为"classic"
。长长的回答
你在使用
tsconfig.json
吗?我想你是的。我一直在寻找一种方法来把import someModule = require ("../../../../someModule"
这样的语句转换成import someModule=require("src/path/to/someModule")
。我发现在浪费了几个小时之后,tsc可能会使用不同的算法来进行模块解析。我使用atom,它创建了tsconfig.json
,并将compilerOption属性moduleResolution
设置为"node"
,它使用了shitty(请原谅我的法语)节点的模块解析算法。我只是放了“经典”,并开始以明显的方式工作。cpjpxq1n3#
基本上,在
Angular 6
中,您可以从顶部或底部启动import
。∮我的两个选择∮
它们可用于
angular CLI
生成的默认配置1.从头开始
如果它离应用程序的根目录更近,我更喜欢这种方式
import { DateService } from "src/app/shared-services/context/date.service";
1.从底部
import { DateService } from "../../../../../../../shared-services/context/date.service";
上下文:
类型脚本配置:* * 系统配置json**
安格拉尔烟囱
ng -v
ilmyapht4#
一种方法是重新导出文件,并使用较短的路径捆绑文件。
您可以在应用程序的根目录中使用components.ts文件夹。
并从组件导入
然而,这将更适合于导出模块,以便其他人可以使用它们,而不是构建项目的方式。
另一种方法是放弃使用import语句,而使用内部模块。
calendar.ts
你可以像这样在你的项目中的任何文件中使用它。
或者使用别名导入。
r55awzrz5#
tl; dr:现在应该可以使用
src
作为根,它将"正常工作"。在Angular 2.0中,当你运行
ng new my-proj
时,它会自动创建一个文件my-proj/src/tsconfig.app.json
。这个文件包含一个baseUrl
行:因此,您不需要更改任何配置,并且可以将所有导入的根目录设置为
src
。假设您的项目结构如下:您可以使用以下命令导入文件:
编辑以添加:不过,Sublime不读取
src/tsconfig.json
,它只读取顶层的tsconfig.json(参见this issue)。如果在Sublime中的导入行出现Cannot find module 'app/...'
错误,可以添加:添加到顶级tsconfig.json文件。
im9ewurl6#
对于Angular-CLI生成的新Angular项目,您不需要更改其默认配置。不确定以前的版本,但从版本6开始,我知道这是正确的。要执行根目录相对导入,请在导入开始时使用
src/
,如下所示:这是比@ MarekDubowski的answer更好的解决方案,因为根相关导入可以很容易地识别,并且可以通过查询
"src/
很容易地在全局范围内找到/搜索。我从下面的解决方案中了解到这一点:https://stackoverflow.com/a/51582699/1253298