首页 > 解决方案 > 运行 ng build --prod 时传单标记图标 url 编译错误

问题描述

由于某种原因,Leaflet 标记图标 url 在运行时编译错误,而ng build --prod不是在运行ng buildLeaflet 标记图标 url 时很好。

我的环境:

Angular CLI: 7.0.5
Node: 11.2.0
OS: linux x64
Angular: 7.0.3
... animations, common, compiler, compiler-cli, core, forms
... http, language-service, platform-browser
... platform-browser-dynamic, router

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.10.5
@angular-devkit/build-angular     0.10.5
@angular-devkit/build-optimizer   0.10.5
@angular-devkit/build-webpack     0.10.5
@angular-devkit/core              7.0.5
@angular-devkit/schematics        7.0.5
@angular/cli                      7.0.5
@ngtools/webpack                  7.0.5
@schematics/angular               7.0.5
@schematics/update                0.10.5
rxjs                              6.3.3
typescript                        3.1.6
webpack                           4.19.1

您可以在此url下找到 prod env

屏幕截图显示了错误编译的图标标记 url 的示例。

ng build --prod 时传单标记图标 url 编译错误

我想这与 Leaflet 上的这个问题有关,但我不知道如何解决这个问题。

标签: angularwebpackleafletngx-leaflet

解决方案


Leaflet 在运行时在 DOM 中重写其标记的 src 标签,当您使用 Angular 和 AOT 编译(在 prod 模式下打开)时,它会中断。

您看起来可能正在使用 ngx-leaflet。如果是这样,请阅读README 的这一部分,了解有关如何让 Leaflet 标记在 Angular 中工作的一些信息。

TL;DR 是您需要使您的标记使用自定义图标,这些图标引用由构建管道(例如,Webpack 或 Angular CLI)处理的图像。

首先,告诉 Angular CLI 将 Leaflet 图标复制到./dist目录中。在 angular.json 中:

{
  ...
  "assets": [
    "assets",
    "favicon.ico",
    {
      "glob": "**/*",
      "input": "./node_modules/leaflet/dist/images",
      "output": "assets/"
    }
  ],
  ...
}

然后,在创建标记时在代码中引用这些图标:

let layer = marker([ 46.879966, -121.726909 ], {
   icon: icon({
      iconSize: [ 25, 41 ],
      iconAnchor: [ 13, 41 ],
      iconUrl: 'assets/marker-icon.png',
      shadowUrl: 'assets/marker-shadow.png'
   })
});

这将确保 Angular CLI 将node_modules/leaflet/dist/images目录中的所有内容复制到./dist/assets中,您可以在其中在客户标记中引用它们。


推荐阅读