2017-05-18 92 views
0

背景

多束我試圖創建一個使用Aurelia一個項目,使用Webpack2進行捆綁銷售。該代碼使用TypeScript編寫。我使用Yarn來處理NPM依賴關係。與奧裏利亞+的WebPack 2

我的網頁將由多個核心HTML頁面組成。這個想法是爲每個這些頁面都有一個Aurelia應用程序。

因此,每個頁面上的index.html將有一個<div aurelia-app="some_module">,每個指的是不同的模塊。其中每個都位於自己的包中。它們之間的共享代碼分別捆綁在一起。

當前配置

我的目錄結構如下所示:

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

於是開始與我有這樣的WebPack配置。我index.html看起來像這樣(的{% static東西是從Django中):

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

然後,我有這個配置。

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" 
    }) 
    ] 
} 

結果

這正常工作與Hello World應用程式爲monitor。當我使用Webpack構建時,我可以看到:

... 
[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] 
... 

而且我可以正常加載頁面並按預期進行渲染。

正如你所看到的我使用aurelia-webpack-plugin以及aurelia-bootstrapper。如果我已經正確地理解了它,引導程序是負責在我的<div>上找到aurelia-app標記並根據我所指的模塊名稱main在那裏注入aurelia位。

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'))); 
} 

混亂

然而,這兩個正在做一些「神奇」的事情,我有以下的困難時期。

例如,我不明白module名稱是如何決定的。在這種情況下,它是main,但我從不明確配置。這是通過aurelia-bootstrapperaurelia-webpack-plugin完成的?

當讀取的條目的WebPack手動這是一個更加清晰: https://webpack.js.org/configuration/entry-context/#entry

規則很簡單:每個HTML頁面一個切入點。 SPA:一個入口點,MPA:多個入口點。

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

我想

隨着上述所有的什麼,我現在想的是能夠增加更多的入口點/模塊/應用程序或任何正確的術語。

我希望能夠創建2個或更多索引文件:

監視器

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

測試

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

每一個有自己捆綁/入口點/模塊/應用程序,我如何配置這個與WebpackAurelia

對於aurelia-webpack-plugin的用例是否僅限於一個入口點?我試過爲src/monitor/main.tssrc/test/main.ts添加明確的條目,但我沒有得到任何正確的工作。

+0

你有過這樣的事嗎? – m0ngr31

+0

是的,閱讀我發佈的答案 – Joakim

回答

0

,我發現這個問題上奧裏利亞-的WebPack github上的項目,解釋說,這是由設計: https://github.com/jods4/aurelia-webpack-build/issues/35#issuecomment-302657535

摘要是一個具有使用多個編譯每個入口點。由於webpack的配置爲JavaScript,這些配置可以共享基本配置的大部分設置,然後只需爲每個入口點導入這些配置。

有關更多詳細信息和上下文,請參閱問題主題。

筆者在上述螺紋澄清這個:

你是正確的,該插件API是專爲單一入口點 (SPA)第一。從其他評論開始,我沒有看到爲什麼 多個入口點不起作用,但是很難在沒有深入瞭解Aurelia + Webpack + 插件如何協同工作的情況下自行計算出 。如果這足夠普遍,也許我應該認爲 有關爲多個入口點添加更簡單的支持。 (目前沒有 計劃,但爲什麼不呢?)

+0

我一直在做一個基於ASPNET核心的項目完全相同。我爲供應商資產創建了一個通用的webpack包,然後爲我的每個頁面提供了一個捆綁,這些頁面實際上是獨立的Aurelia應用程序。然後我引用它們與您的相同,即在引導Aurelia應用程序的頁面中。這意味着我爲每個應用程序都有一個webpack配置,例如webpack.config.monitor.js&webpack.config.test.js。這也是你在做什麼? J – jcaddy

+0

是的,就是這樣 – Joakim

0

只是後續我的評論如下。以下是每個webpack配置中相關部分的截圖。

我的儀表板頁面 - 通過webpack.config.dashboard.js

weback.config.dashboard.js

我的賬戶頁面創建dashboard.js - account.js通過webpack.config.account創建。JS

weback.config.account.js

這並不在我自己的ASPNET核心應用程序工作,所以我不明白爲什麼它不會爲任何其他框架。您還可以通過創建vendor.js文件並使用Webpack DLL插件創建應用程序頁腳本可以引用的清單文件來保持每個「應用程序」特定的js文件輕鬆。

但是,雖然這個工作,我不知道這是實現結果的最佳方式。由於每個「頁面」是一個完全獨立的Aurelia應用程序,因此我只能使用其他瀏覽器方式共享狀態,例如,會話或本地存儲。我可能會將Aurelia的「功能」視爲分離應用程序功能的一種方式,這種方法很有意義。