AngularDart: Как настроить routerProviders / routerProvidersHa sh для сред разработки и производства? - PullRequest
0 голосов
/ 15 февраля 2020

Существует один ТАК вопрос о той же проблеме. Но я не могу найти готовый пример кода, как использовать routerProviders / routerProvidersHash в реальном приложении.

Как я понимаю, нам нужно определить два инжектора и использовать один из них в зависимости от среды времени компиляции переменная, как показано ниже.

// File: web/main.dart

// >>> Have to use 2 injectors:
@GenerateInjector([
  routerProvidersHash,
  ClassProvider(Client, useClass: BrowserClient),
])
final InjectorFactory injectorDev = self.injectorDev$Injector;

@GenerateInjector([
  routerProviders,
  ClassProvider(Client, useClass: BrowserClient),
])
final InjectorFactory injectorProd = self.injectorProd$Injector;
// <<<

void main() {
  final env = ServerEnvironment();
  if (env.isProduction) {
    runApp(ng.AppComponentNgFactory, createInjector: injectorProd);
  } else {
    runApp(ng.AppComponentNgFactory, createInjector: injectorDev);
  }
}
// File: lib/server_environment.dart

enum ServerEnvironmentId { development, production }

class ServerEnvironment {

  ServerEnvironmentId id;

  static final ServerEnvironment _instance = ServerEnvironment._internal();
  factory ServerEnvironment() => _instance;

  ServerEnvironment._internal() {
    const compileTimeEnvironment = String.fromEnvironment('MC_ENVIRONMENT', defaultValue: 'development');
    if (compileTimeEnvironment != 'development') {
      id = ServerEnvironmentId.production;
    } else {
      id = ServerEnvironmentId.development;
    }
  }

  bool get isProduction {
    return id == ServerEnvironmentId.production;
  }

}
File: build.production.yaml

targets:
  $default:
    builders:
      build_web_compilers|entrypoint:
        generate_for:
          - web/main.dart
        options:
          compiler: dart2js
          # List any dart2js specific args here, or omit it.
          dart2js_args:
          - -DMC_ENVIRONMENT=production
          - --fast-startup
          - --minify
          - --trust-primitives

# Build execution

pub run build_runner build --config production --release -o web:build

Является ли предположение о наличии двух форсунок правильным способом?

Заранее спасибо!

1 Ответ

1 голос
/ 17 февраля 2020

Я бы сделал другой файл main.dart для вашей другой установки инжектора. В main.dart не должно быть слишком много вещей, они должны просто служить механизмом для запуска вашего приложения. Разветвление должно происходить в build.production.yaml как указание другого основного для производства (т. Е. Web / main_production.dart), и этот файл принадлежит поставщику маршрутов не-ha sh. Это исключило бы необходимость «ServerEnvironment» и if / else с потенциально запутанной двойной установкой инжектора в одном файле.

// File: web/main.dart

@GenerateInjector([
  routerProvidersHash,
  ClassProvider(Client, useClass: BrowserClient),
])
final InjectorFactory injector = self.injector$Injector;

void main() {
  runApp(ng.AppComponentNgFactory, createInjector: injector);
}

и

// File: web/main_production.dart

@GenerateInjector([
  routerProviders,
  ClassProvider(Client, useClass: BrowserClient),
])
final InjectorFactory injector = self.injector$Injector;

void main() {
  runApp(ng.AppComponentNgFactory, createInjector: injector);
}

с

File: build.production.yaml

targets:
  $default:
    builders:
      build_web_compilers|entrypoint:
        generate_for:
          - web/main_production.dart
        options:
          compiler: dart2js
          # List any dart2js specific args here, or omit it.
          dart2js_args:
          - --fast-startup
          - --minify
          - --trust-primitives

Ран как

# Build execution

pub run build_runner build --config production --release -o web:build
...