如何从angular2和webpack中的动态src加载图像?

时间:2017-02-15 07:48:29

标签: angular webpack

我在我的项目中使用angular2和webpack2。

我的同事从Angular2 QuickStart启动项目,然后将其移至Webpack环境。

我使用html-loader加载组件templats并使用url-loader提取图像和字体:

{
    test: /\.html$/,
    loader: 'html-loader'
},
{
    test: /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/,
    use: 'url-loader?limit=1000&name=assets/[name].[hash].[ext]'
},

模板是这样的:

<section class="creation-mobile">
    <img src="../../../images/camera/cn/mobile/creation.jpg" alt="" class="img-cn">
    <img src="../../../images/camera/en/mobile/creation.jpg" alt="" class="img-en">
</section>

当我构建它时,Webpack可以找到图像并将它们导出到asstes/

在我遇到这样的模板之前一切正常:

<li *ngFor="let i of [1,2,3]" class="item{{i}} m1-view">
    <div class="{{lang}}-video-view">
        <img src="../../../images/os/{{lang}}/medium/one-step{{i}}{{deviceRatio == 1?'':'@2x'}}.jpg">
        <video class="video-medium" preload="auto" src="../../../videos/os/{{lang}}/medium/one-step-{{i}}{{deviceRatio == 1?'':'@2x'}}.mp4" [video-play]="onestepVideoState[i-1]"></video>
        <img src="../../../images/os/{{lang}}/large/one-step{{i}}{{deviceRatio == 1?'':'@2x'}}.jpg">
        <video class="video-large" preload="auto" src="../../../videos/os/{{lang}}/large/one-step-{{i}}{{deviceRatio == 1?'':'@2x'}}.mp4" [video-play]="onestepVideoState[i-1]"></video>
    </div>
    <a class="replay" [innerHTML]="os.replay.title" [ngClass]="{'active': onestepReplayState[i-1]}" (click)="onestepReplay(i-1)"></a>
</li>

../../../images/os/{{lang}}/medium/one-step{{i}}{{deviceRatio == 1?'':'@2x'}}.jpg这样的src包含{{lang}}{{i}}以及{{deviceRatio == 1?'':'@2x'}}来获取不同的资源,url-loader无法解析此类网址。

我们必须展开*ngFor并使用ngif,写下大量<img>代码来导入图片。

有没有办法在angular2和webpack中加载这种网址?

Add1 :抱歉忘记声明,langdeviceRatio取决于浏览器环境,因此构建时值不确定。 lang的值将是cnen之一,因此我们要将../../../images/os/en/medium/..xxx.jpg../../../images/os/cn/medium/..xxx.jpg加载到最终的dist目录。

1 个答案:

答案 0 :(得分:0)

根据您的构建设置,您可以使用JS文件中的require.context预先获取图像。

function importAll (r) {
  return r.keys().map(r);
}
var modules = importAll(require.context(directory, useSubdirectories = true, regExp = /\.(png|jpe?g|gif|svg|woff|woff2|ttf|eot|ico)$/));

您所做的是 - 递归地要求带有图像的文件夹,它们将在所需位置可用。 点击此处:https://webpack.js.org/guides/dependency-management/#require-context