typescript - Varför skapas inte vyerna i Aurelias produktionsbyggläge


Jag försöker bygga min Aurelia-applikation i produktionsläge (devMode:production). Bygget lyckas men när jag kör det genom att öppna index.html får jag felet "Kan inte bestämma standardvystrategi för objekt."

Applikationen fungerar alldeles utmärkt när den byggs i utvecklingsläge och körs lokalt genom att bara öppna index.html eller genom att köra "au run".

Applikationen genererades av Aurelia-cli. Jag har försökt stänga av varje inställning i webpack.config.js som är inställd på produktionsläge utan någon framgång.

I min huvudsakliga applikationsviewmodell skapar jag en array av viewmodeller som kommer att användas i vyn för att skapa delkomponenter:

application.ts

...  
let newBayViewModel = new bay(sectionListLeftBay);
this._bayViewModels.push(newBayViewModel);

newBayViewModel = new bay(sectionListRightBay);
this._bayViewModels.push(newBayViewModel);
...

ansökan.html

<div class="bay" repeat.for="bay of bayViewModels">
  <compose view-model.bind="bay"></compose>
</div>

Och i bay-klassen skapar jag en array av sektionens vy-modeller som kommer att bindas i bay-vyn:

bay.ts

export class bay {
  private _sectionViewModels: section[] = [];
  public get sectionViewModels() : section[] {
    return this._sectionViewModels;
  }

  constructor(
    private _sectionList: string[]) {

      this._sectionList.forEach(sectionName => {
        let newSectionViewModel = new section(sectionName);
        this._sectionViewModels.push(newSectionViewModel);
      });
    }
}

bay.html

<template>
  <div class="section-header" repeat.for="section of sectionViewModels">
      <compose view-model.bind="section"></compose>
  </div>
</template>

Om jag tar bort koden i bay.ts som skapar sektionens vy-modeller kommer det inte att uppstå något fel, så på något sätt är problemet relaterat till den delen. Vad kan problemet vara?

Jag använder aurelia-cli 1.0.0-beta.15, webpack 4.31.0, aurelia-webpack-plugin 4.0.0

Svar #1

Problemet du har beror på olika beteenden mellan debug- och produktionsbyggen med Webpack. För debug-bygget, som du använder under utveckling, behålls alla moduler som de är, vilket innebär att din HTML-modul är åtkomlig och därför fungerar utan några problem. För produktionsbygget träder olika optimeringar in och en av dem är modulkonkatenering. På grund av detta bevaras inte modulers ursprung (eller vägen till dessa moduler), så du får inget ursprung för din view-modell, vilket gör det omöjligt att hitta din vy eftersom den använder view-modellens ursprung för att hitta vyens URL.

Det du kan göra är att dekorera din vy-modell med useView:

@useView(PLATFORM.moduleName('path/to/my-view'))
export class bay {

}

Nu kommer class bay, även med modulkonkatenering, fortfarande att ha information om var dess vy ska vara.

Svar #2

bara genom att titta på koden i bay.ts, ser det ut som meningen

this._sectionList.forEach(...)

bör vara istället

_sectionList.forEach(...)

Hoppas det här hjälper.

Relaterade artiklar