【问题标题】:Order of Import statements in Angular 2Angular 2 中的 Import 语句顺序
【发布时间】:2017-05-22 12:42:28
【问题描述】:

Angular 样式指南提到了导入行距:

  • 考虑在第三方导入和 应用程序导入。
  • 考虑列出按字母顺序排列的导入行 模块。
  • 考虑列出已解构的导入符号 按字母顺序。
  • 为什么?空行将您的东西与他们的东西分开 东西。
  • 为什么?按字母顺序排列可以更轻松地阅读和定位符号。

查看包括 Angular 本身在内的许多 Angular 项目,惯例是首先导入 Angular (@angular) 模块,然后是第三方模块(例如 AngularFire2),然后是我们自己的模块(服务、组件等),例如./some-service.ts.

这似乎是导入服务的惯例,然后是模型,然后是组件。

但是接口和管道等呢?导入“无名”或通配符模块的约定是什么,例如Firebase SDK 或 RxJs 运营商?

例如:

导入 RxJs 运算符的示例服务

import { Injectable } from '@angular/core';

import { AngularFireAuth } from 'angularfire2/auth';
import {
  AngularFireDatabase,
  FirebaseListObservable
} from 'angularfire2/database';
import * as firebase from 'firebase/app';
import 'rxjs/add/operator/take';
...

或者

import { Injectable } from '@angular/core';

import {
  AngularFireDatabase,
  FirebaseListObservable
} from 'angularfire2/database';
import * as firebase from 'firebase/app';
import { Observable } from 'rxjs/Observable';

import { AuthService } from './auth.service';
// `GridMetadata` is an Interface
import { GridMetadata } from './grid-metadata';
...

【问题讨论】:

  • 这不是 SO 的问题。如果风格指南对此一无所知,则由您自行决定。我个人按字母顺序维护导入,核心依赖项(@angular 和 rxjs)排在其他第三方之前,第一方排在最后。

标签: angular convention


【解决方案1】:

实际上,查看 Angular 代码库并更好地理解指南,就有了答案。

“考虑在第三方导入和应用程序导入之间留一个空行。”

这里只需要一个例子来说明:

// Core imports
import { TestBed, async, inject } from '@angular/core/testing';

// Third party imports
import { AngularFireAuth } from 'angularfire2/auth';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/observable/of';

// Application imports
import { AuthService } from './auth.service';
import { environment } from '../environments/environment';

“考虑按模块的字母顺序列出导入行。”

将“模块”视为“来自”之后的位。模块包含要导入的符号。

import { Injectable } from '@angular/core';

import { AngularFireAuth } from 'angularfire2/auth';
import * as firebase from 'firebase/app';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/catch';

符号是什么并不重要;重要的是导入行按模块的字母顺序排列。例如

  1. angularfire2/auth
  2. firebase/应用程序
  3. rxjs/Rx
  4. rxjs/add/observable/of
  5. rxjs/add/operator/catch

在 Angular 代码库中,很明显小写字符列在大写或大写字符之后,因此:“rxjs/Rx”列在之前“rxjs/add/observable/of”和“rxjs” /add/operator/catch'

“考虑按字母顺序列出已解构的导入符号。”

import { TestBed, async, inject } from '@angular/core/testing';

import { AngularFireAuth } from 'angularfire2/auth';
import { Observable } from 'rxjs/Rx';
import 'rxjs/add/observable/of';

将“解构的导入符号”视为从其父模块中提取的导出符号。在这个例子中 AngularFireAuth、Observable、TestBed、async 和 inject 都是解构的导入符号。

同样,顺序是按字母顺序排列的;先大写,再大写,再小写。这是来自 Angular 代码库的一个很好的例子:

import {CUSTOM_ELEMENTS_SCHEMA, Compiler, Component, Directive, Inject, Injectable, Injector, Input, NgModule, Optional, Pipe, SkipSelf, ɵstringify as stringify} from '@angular/core';

在 Angular 代码库中导入服务、管道、模型、指令或组件等似乎没有任何特定顺序

注意,父目录中的模块是在 那些更靠近它们被导入的模块之后导入的,例如

import { AuthService } from './auth.service';
import { environment } from '../environments/environment';
import { abc } from '.../abc';

【讨论】:

  • 是否有任何可用的工具可以自动实现此行为?
  • @Zozo:是的,你可以试试palantir.github.io/tslint/rules/ordered-imports。 tslint 订购进口商品是一条规则。 "ordered-imports": [ true, { "grouped-imports": true } ] 这样的东西在你的 tslint.json 中应该足够了。
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 2012-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多