typescript Angular 2根相对进口

aurhwmvo  于 2022-12-24  发布在  TypeScript
关注(0)|答案(6)|浏览(161)

我在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能够识别这些导入的东西。

lrl1mhuk

lrl1mhuk1#

答案

从TypeScript 2.0开始,您可以按如下方式设置tsconfig.json属性baseUrl

{
  "compilerOptions": {
    "baseUrl": "app"
}

然后,您可以使用所需的方式导入零部件,例如:

import { Calendar } from 'components/calendar';

附录

回退路径解析

一个重要的注意事项是,指定baseUrl选项会导致TypeScript编译器:
1.查找与baseUrl相关的路径
1.解析失败(未找到模块)时,查找与moduleResolution选项相关的路径

系统

由于SystemJS在Angular开发阶段大量使用,因此请确保相应地配置systemjs.config.js,以便正确解析路径。
来源和进一步详情:https://github.com/Microsoft/TypeScript/issues/5039

mitkmikd

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(请原谅我的法语)节点的模块解析算法。我只是放了“经典”,并开始以明显的方式工作。

cpjpxq1n

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**

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2017",
      "dom"
    ]
  }
}

安格拉尔烟囱
ng -v

Angular CLI: 6.0.8
Node: 8.9.0
OS: win32 x64
Angular: 6.0.7
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.6.8
@angular-devkit/build-angular     0.6.8
@angular-devkit/build-optimizer   0.6.8
@angular-devkit/core              0.6.8

@angular-devkit/schematics        0.6.8
@angular/cli                      6.0.8
@ngtools/webpack                  6.0.8
@schematics/angular               0.6.8
@schematics/update                0.6.8
rxjs                              6.2.1
typescript                        2.7.2
webpack                           4.8.3
ilmyapht

ilmyapht4#

一种方法是重新导出文件,并使用较短的路径捆绑文件。
您可以在应用程序的根目录中使用components.ts文件夹。

export {Calendar} from './components/calendar'
export {*} from './components/map'

并从组件导入

import {Calendar, Map} from '../../components';

然而,这将更适合于导出模块,以便其他人可以使用它们,而不是构建项目的方式。
另一种方法是放弃使用import语句,而使用内部模块。
calendar.ts

module Components {
    export class Calendar {}
}

你可以像这样在你的项目中的任何文件中使用它。

new Components.Calendar();

或者使用别名导入。

import Calendar = Components.Calendar;
new Calendar();
r55awzrz

r55awzrz5#

tl; dr:现在应该可以使用src作为根,它将"正常工作"。
在Angular 2.0中,当你运行ng new my-proj时,它会自动创建一个文件my-proj/src/tsconfig.app.json。这个文件包含一个baseUrl行:

"baseUrl": "./",

因此,您不需要更改任何配置,并且可以将所有导入的根目录设置为src。假设您的项目结构如下:

my-proj/
  README.md
  src/
    app/
      sidebar/
        sidebar.component.ts
      user.service.ts

您可以使用以下命令导入文件:

import { Sidebar } from 'app/sidebar/sidebar.component';
import { UserService } from 'app/user.service';

编辑以添加:不过,Sublime不读取src/tsconfig.json,它只读取顶层的tsconfig.json(参见this issue)。如果在Sublime中的导入行出现Cannot find module 'app/...'错误,可以添加:

"baseUrl": "./src",

添加到顶级tsconfig.json文件。

im9ewurl

im9ewurl6#

对于Angular-CLI生成的新Angular项目,您不需要更改其默认配置。不确定以前的版本,但从版本6开始,我知道这是正确的。要执行根目录相对导入,请在导入开始时使用src/,如下所示:

import { VideoPlayerComponent } from 'src/app/pages/shared/video-player/video-player.component';

这是比@ MarekDubowski的answer更好的解决方案,因为根相关导入可以很容易地识别,并且可以通过查询"src/很容易地在全局范围内找到/搜索。
我从下面的解决方案中了解到这一点:https://stackoverflow.com/a/51582699/1253298

相关问题