<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被重写。通过对webpack.config.js进行补充,计算的URL目标也被捆绑在一起。
,new GlobDependenciesPlugin({
"boot": [
"ClientApp/app/components/**/*.svg"
]
})
很遗憾,计算机生成的URL没有被重写。
src.bind="'../app/'+line.type+'.svg'"
它们现在已经损坏了。
如何在运行时解决应用程序相对路径?
我们需要在运行时解决这个问题,但到目前为止我找不到任何支持此操作的方法。有几种可能性:
- 完全禁止处理图像并使用构建任务将它们打包
- 使用 require 在运行时转换 URL
- 使用一个包含静态 URL 和原始 URL 作为 id 值的隐藏 div 来进行映射,然后在运行时使用它们来做映射。
我的研究表明,有 webpack 插件会将这些映射作为 json 发出,但我的浅薄理解不能让我利用它 —— 除此之外,我不知道如何使输出可供应用程序使用。
这似乎很相关,但我的无知阻碍了我。如何使用 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">
但这是高维护代码。
另一种可能性是采取另一个方向。借鉴放置充满图片的隐藏div的建议,如果这些都内联,则可以通过绑定复制图像。
CopyWebpackPlugin
不是一个选项吗?只需将文件物理复制到dist
文件夹中即可。 - Fred Kleuver