【发布时间】:2018-10-04 01:42:20
【问题描述】:
假设我们有这样的标记(多个 tbody,我知道)。
<tbody repeat.for="order of orders">
<tr repeat.for="line of order.lines">
<td>
<img if.bind="order.urgent === 'T'" src="../app/alert.svg">
<img if.bind="line.outOfSquare" src="../app/oos.svg">
</td>
<td class="min-width">
<img src.bind="'../app/'+line.type+'.svg'" alt="${line.type}">
</td>
</tr>
</tbody>
在dotnet new Aurelia 创建的默认项目中,由于图像很小,图像被内联为 DataUrls。这是合理的,但它们根据绑定数据在许多行中重复。调整 webpack.config.js 以将阈值降低到 1024 字节,我们有
{ test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=1024' }
现在图像在 wwwroot/dist 中以散列名称显示,并且 URL 被重写。计算出的 URL 目标也通过这个添加捆绑到 webpack.config.js
,new GlobDependenciesPlugin({
"boot": [
"ClientApp/app/components/**/*.svg"
]
})
不幸的是,计算的 URL 没有被重写。
src.bind="'../app/'+line.type+'.svg'"
他们现在坏了。
如何在运行时解析应用程序的相对路径?
我们需要在运行时解决这个问题,但到目前为止我找不到任何支持这样做。提出了各种可能性:
- 完全禁止处理图像并使用构建任务来打包它们
- 在运行时使用 require 来转换 URL
- 使用一个隐藏的 div,其中充满了带有静态 URL 的 img 和原始 URL 作为 id 值,然后使用这些在运行时进行映射。
我自己的研究表明,有一些 webpack 插件将这些映射作为 json 发出,但我对 Aurelia 构建过程的浅薄理解不允许我利用这一点——除此之外,我不知道如何导致将其输出提供给应用程序。
这似乎是相关的,但无知阻碍了我。 How to load image files with webpack file-loader
我尝试使用 require 没有成功,但我怀疑自动在 Aurelia 模块范围内的 require 方法不是可能解析映射的 Webpack require。大概 webpack 可以在运行时加载和解码打包的应用程序,但我真的不知道,因为到目前为止它刚刚工作,让我可以在幸福的无知中操作。
我知道我可以通过使用对资源的静态引用分别处理每种线型来将其嵌入到页面中,如下所示:
<img if.bind="line.type === 'AL'" src="../app/al.svg">
<img if.bind="line.type === 'GD'" src="../app/gd.svg">
但这是高维护代码。
另一种可能性是走另一条路。借用放置一个充满imgs的隐藏div的建议,如果这些都是内联的,那么可以使用绑定复制图像。
【问题讨论】:
-
CopyWebpackPlugin不是一个选项吗?只是让它物理地将文件复制到 dist 文件夹吗?
标签: webpack aurelia asp.net-core-2.0