Как загрузить данные с сервера до того как загрузится приложение?
Вы можете использовать специально созданный для этого токен APP_INITIALIZER 
Благодаря нему приложение не будет стартовать пока не получите данные. 
Делается это примерно следующим образом.
Регистрируете в провайдерах глобальный сервис и этот токенproviders: [
  GlobalService,
  {
    provide: APP_INITIALIZER,
    useFactory: (service: GlobalService) => () => service.init(),
    deps: [GlobalService], multi: true
  }
],
Сервис примерно такой@Injectable()
export class GlobalService {
    data: any;
    constructor(private http: Http) { }
    init(): Promise<any> {
        var promise = this.http.get('src/data.json').map(res => res.json()).toPromise();
        promise.then(data => this.data = data);
        return promise;
    }
}
И потом получаете к примеру в корневом компоненте свои данныеexport class AppComponent {
  constructor(private service: GlobalService) {
    console.log(service.data);
  }
}Живой пример
Добавить resolver к корневому стейту