2017-05-18 94 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的“功能”视为分离应用程序功能的一种方式,这种方法很有意义。