问题 从深层嵌套的目录结构导入模块


导入不在同一文件夹中或周围的模块非常麻烦。你必须继续计算'../'。如下例所示:

import {AnswersService, AddAnswerModel, Answer} from '../../../../../../../BackendServices/AnswersService';

通过将我的System.config修改为下面的示例,我可以解决所有这些'../'并且代码在浏览器上完美运行。

System.config({
        packages: { 
            'app': { defaultExtension: 'js' },
            'rxjs': { defaultExtension: 'js' }
        },
        paths: {
            'rxjs/*': 'node_modules/rxjs/*',
            'BackendServices/*': 'app/BackendServices/*'
        }
    });

它将import语句减少到下面的可管理命令。

import {AnswersService, AddAnswerModel, Answer} from 'BackendServices/AnswersService';

但是这种方法的问题在于我在Visual Studio Code中丢失了智能感知。我不确定这是打字稿问题,视觉工作室代码问题还是其他问题。

有没有人知道如何在不失去intellisense的情况下使用它?


3072
2017-12-19 17:47


起源

为什么你有这么令人难以置信的深度目录结构?保持整棵树2-3层深。


答案:


Visual Studio只能解析位于node_modules中的相对路径和模块 angular2/* 要么 rxjs/*

它是TypeScript默认的moduleResolution(节点)..您可以使用'classic'在tsconfig.json中更改它..但VS Code将不再识别节点模块。

此故障单中讨论了该问题 https://github.com/Microsoft/TypeScript/issues/5039

有很多提议......但还没有实施。


4
2017-12-19 20:51



对于OP,也许解决方案是将应用程序资源打包到具有必需的npm元数据的私有仓库中,以便使用npm将应用程序安装到开发环境中? - RibaldEddie
您可以在单独的npm模块中打包应用程序的某些部分(例如,支持的连接器)..并创建一个导出模块的.d.ts文件。但这不切实际。我检查了Angular2的代码源。他们不使用'../ ..'路径解析。在tsconfig.json中他们有“moduleResolution”:“经典”(默认值是“节点”)我试过它..它工作..但节点模块不再被重新认识。 :( - Mourad Zouabi
谢谢你的回复。我想我们将不得不等到将来解决这个问题。将应用程序部件打包到私有代表中对我当前的项目似乎不可行。所以我想我现在必须保留一个平面组件目录。一旦他们解决了这个问题,就在将来重构应用程序。感谢您的帮助! - Zorthgo


您可以复制由。实现的模式 angular-cli 通过导出您想要的其他所有组件 index.ts 在目录级别。这样,您可以在更高级别公开嵌套组件。

这是一个例子:

parent
├── child
│   ├── child.component.ts
│   └── index.ts
├── parent.component.ts
└── index.ts

child/index.ts 只需导出相关组件。

export { ChildComponent } from './child.component';

然后 parent/index.ts 可以继续出口链。

export { ParentComponent } from './parent.component';
export { ChildComponent } from './child';

注意:请注意以上内容如何引用 child.component 文件,但是 child  目录 代替!

child 目录的 index.ts 通过导出来表示这些组件 index.ts。这可以通过深层嵌套组件来完成。

最后,如果是另外一个组件 parent/ 想要消耗任何东西 parent/,它可以在最顶层轻松引用。

import { ParentComponent, ChildComponent } from './parent';

5
2017-08-19 17:52





您可以使用相对路径。看看这个例子: https://github.com/angular/angular/tree/master/modules/playground/src/relative_assets


0
2017-12-20 11:13



谢谢回复!但是从我所看到的,index.ts是从嵌套文件夹中提取my_cmp。我指的是我有一个组件位于不与父组件嵌套在同一文件夹中的文件夹的情况。 - Zorthgo