2017-05-18 1 views
0

Contexte

Je suis en train de créer un projet à l'aide Aurelia, en utilisant Webpack2 pour empaqueter. Le code est écrit en utilisant TypeScript. J'utilise Yarn pour gérer les dépendances NPM.faisceaux multiples avec Aurelia + Webpack 2

Ma page Web est constituée de plusieurs pages HTML principales. L'idée est alors d'avoir une application Aurelia pour chacune de ces pages.

Ainsi, le index.html sur chacune de ces pages aurait un <div aurelia-app="some_module">, chacun faisant référence à un module différent. Chacun d'entre eux sont alors situés dans leur propre faisceau. Le code partagé entre eux est dans des groupes distincts.

config actuelle

Ma structure de répertoire se présente comme suit:

aurelia-webpack/src/monitor/ # main.ts, app.ts, app.html 
aurelia-webpack/src/test/  # main.ts, app.ts, app.html 

Donc, pour commencer, j'ai cette config Webpack. Mon index.html ressemble à ceci (ce qui se {% static est de Django):

<div aurelia-app="main"> 
    <p>Loading...</p> 
    <script src="{% static "aurelia-webpack/dist/app.js" %}"></script> 
</div> 

Puis-je avoir cette config.

webpack.config.js

var path = require('path'); 
const { AureliaPlugin } = require('aurelia-webpack-plugin'); 
const { optimize: { CommonsChunkPlugin }, ProvidePlugin } = require('webpack'); 

module.exports = { 
    entry: { 
     app: ['aurelia-bootstrapper'], 
     vendor: ['bluebird', 'jquery', 'bootstrap'], 
    }, 
    output: { 
     filename: "[name].js", 
     chunkFilename: "[name].js", 
     sourceMapFilename: "[name].js.map", 
     publicPath: "/dist/", 
     path: path.resolve(__dirname, 'dist') 
    }, 
    resolve: { 
     extensions: [".ts", ".js"], 
     modules: [ 
      "src/monitor", 
      "node_modules" 
     ].map(x => path.resolve(x)) 
    }, 
    module: { 
     rules: [ 
      { test: /\.css$/i, use: ["style-loader", "css-loader"] }, 
      { test: /\.ts$/, loader: "awesome-typescript-loader" }, 
      { test: /\.html$/, loader: "html-loader" } 
     ] 
    }, 
    plugins: [ 
     new AureliaPlugin(), 
     new ProvidePlugin({ 
     $: "jquery", 
     jQuery: "jquery" 
    }) 
    ] 
} 

Résultat

Cela fonctionne très bien avec une application Bonjour tout le monde pour monitor. Quand je construis à l'aide Webpack je peux voir ceci:

... 
[app] ./src/monitor/app.ts 156 bytes {0} [built] 
[app.html] ./src/monitor/app.html 57 bytes {0} [built] 
[main] ./src/monitor/main.ts 267 bytes {0} [built] 
... 

Et je peux charger l'amende de la page et il rend comme prévu. Comme vous pouvez le voir, j'utilise aurelia-webpack-plugin ainsi que aurelia-bootstrapper. Si je l'ai bien compris, le bootstrappeur est responsable de trouver l'étiquette aurelia-app sur mon <div> et d'y injecter les bits aurelia, en fonction du nom du module main auquel je fais référence.

Le contenu de mon main.ts:

import { Aurelia, PLATFORM } from 'aurelia-framework'; 

export function configure(aurelia: Aurelia) 
{ 
aurelia.use 
     .standardConfiguration() 
     .developmentLogging(); 
aurelia.start().then(() => aurelia.setRoot(PLATFORM.moduleName('app'))); 
} 

Confusion

Cependant, ces deux font des choses "magiques" que j'ai du mal à suivre.

Par exemple, je ne comprends pas comment le nom module est décidé. Dans ce cas, c'est main, mais je ne le configure jamais explicitement. C'est en quelque sorte fait par aurelia-bootstrapper ou le aurelia-webpack-plugin?

Lors de la lecture du manuel WebPack sur l'entrée, il est beaucoup plus claire: https://webpack.js.org/configuration/entry-context/#entry

règle simple: un point d'entrée par page HTML. SPA: un point d'entrée, MPA: points d'entrée multiples.

entry: { 
home: "./home.js", 
about: "./about.js", 
contact: "./contact.js" 
} 

Ce que je veux

Avec tout ce qui précède, ce que je veux maintenant est de pouvoir ajouter d'autres points d'entrée/modules/ou des applications quel que soit le terme correct est.

Je veux être en mesure de créer 2 ou plusieurs fichiers d'index:

Moniteur:

<div aurelia-app="monitor"> 
    <p>Loading...</p> 
    <script src="{% static "aurelia-webpack/dist/monitor.js" %}"></script> 
</div> 

test:

<div aurelia-app="test"> 
    <p>Loading...</p> 
    <script src="{% static "aurelia-webpack/dist/test.js" %}"></script> 
</div> 

chacun d'entre eux ayant leur propre paquet/point d'entrée/module/application, comment configurer ceci avec Webpack et Aurelia?

Le cas d'utilisation du aurelia-webpack-plugin est-il en quelque sorte limité à un seul point d'entrée? J'ai essayé d'ajouter des entrées explicites pour src/monitor/main.ts et src/test/main.ts mais je n'ai rien pour fonctionner correctement.

+0

Avez-vous déjà commencé? – m0ngr31

+0

Oui, lisez la réponse que j'ai postée – Joakim

Répondre

0

Je trouve cette question sur la aurelia-webpack projet github qui explique que ce soit par la conception: https://github.com/jods4/aurelia-webpack-build/issues/35#issuecomment-302657535

Le résumé est que l'on doit utiliser plusieurs compilations pour chaque point d'entrée. Depuis la config de webpack est JavaScript, ces configs peuvent partager la plupart des paramètres pour une configuration de base, puis simplement importer ceux pour chaque point d'entrée.

Voir le fil d'édition pour plus de détails et de contexte.

L'auteur a précisé à ce sujet dans le fil mentionné ci-dessus:

Vous avez raison, l'API de plugin est conçu pour le point d'entrée unique (SPA) en premier. Avec les étapes de cet autre commentaire, je ne vois pas pourquoi points d'entrée multiples ne fonctionneraient pas, mais il est difficile de comprendre cela par vous-même sans une profonde compréhension de la façon dont Aurelia + Webpack + le plugin fonctionnent ensemble. Si cela est assez commun, peut-être que je devrais penser sur l'ajout d'un support plus simple pour plusieurs points d'entrée. (Il n'y a pas de plan en ce moment, mais pourquoi pas?)

+0

J'ai fait exactement la même chose pour un projet basé sur le noyau ASPNET. J'ai créé un bundle webpack commun pour les assets du fournisseur puis un bundle pour chacune de mes pages qui sont effectivement des applications Aurelia indépendantes. Je les référence ensuite comme vous l'avez fait, c'est-à-dire dans la page qui amorce l'application Aurelia. Cela signifie que j'ai une configuration webpack pour chacune de mes applications, par ex. webpack.config.monitor.js & webpack.config.test.js. Est-ce ce que vous faites aussi? J – jcaddy

+0

Oui exactement comme ça – Joakim

0

Juste pour donner suite à mon commentaire ci-dessous. Voici quelques captures d'écran de la section correspondante dans chacune de mes config webpack.

Mon tableau de bord page - dashboard.js créé par webpack.config.dashboard.js

weback.config.dashboard.js

Mon compte Page - account.js créé par webpack.config.account.js

weback.config.account.js

Cela fonctionne dans ma propre application de base aspnet Je vois donc aucune raison pour laquelle il ne serait pas pour tout autre cadre. Vous pouvez également conserver chaque fichier js spécifique à l'application en créant le fichier vendor.js et en utilisant le plug-in DLL Webpack pour créer un fichier manifeste que les scripts de la page d'application peuvent référencer.

Cependant, même si cela fonctionne, je ne suis pas sûr que ce soit la meilleure façon d'atteindre les résultats. Comme chaque "page" est une application Aurelia complètement indépendante, je ne peux partager l'état qu'en utilisant d'autres moyens de navigation, par ex. session ou stockage local. Je peux regarder Aurelia "Caractéristiques" comme un moyen de diviser les fonctionnalités des applications - genre de sens.