【问题标题】:'L' refer to a UMD global - compilation error'L' 指的是 UMD 全局 - 编译错误
【发布时间】:2018-02-15 23:35:24
【问题描述】:

我在我的项目中使用插件ngx-leafletangular-cli

我正在尝试使用文档中描述的传单,例如:

问题是当我尝试编译时出现以下错误:

编译:

ng serve --aot

这里的上下文:


我确实尝试使用不同的方式导入L

import { LeafletModule } from '@asymmetrik/ngx-leaflet';

但我在文档和github 中找不到任何内容。

我确实删除了要编译的模块 atm,但我需要一个解决方法。

这是我使用的package.json


这是我的组件内的代码,'L' 的用户:

@Component({
  selector: 'app-map-screens-element',
  templateUrl: './map-screens-element.component.html',
  styleUrls: [
    './map-screens-element.component.scss',
  ],
})

export class MapScreensComponent implements OnInit {
  /**
   * setting map options
   */
  public $mapOptions = {
    // we use the layer openstreetmap
    layers: [
      L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'),
    ],
    zoom: 15,
    center: L.latLng([48.866667, 2.333333]),
  };
}

这里将模块导入到我的项目中:

import { LeafletModule } from '@asymmetrik/ngx-leaflet';

@NgModule({
  imports: [
    LeafletModule,
  ],
  declarations: [
    // ...
  ],
  exports: [
    // ...
  ],
})

export class SharedElementModule { }

【问题讨论】:

  • 为什么我们可以有实际的代码?这里的copypasta会好很多
  • 我确实使用代码进行了编辑

标签: angular typescript webpack angular-cli ngx-leaflet


【解决方案1】:

您在组件顶部缺少 L 的导入。像这样:

import * as L from 'leaflet';

【讨论】:

  • 我遇到了同样的问题...但是如果您的答案是正确的,为什么我的打字稿文件中对 L.**** 的其他引用没有出现编译错误?
  • 感谢您的回答,我会尽快尝试并给您回报:)
  • @Ronnie,我无法回答。我只是偶然发现了同样的错误,这个解决方案为我解决了它。如果您有任何进一步的解释,我很乐意更新我的答案。
  • @pgross 非常感谢,它有效!你是真正的 mvp - 抱歉迟到了测试
【解决方案2】:

angular-cli 克隆到一个新的空项目后,我通过 NPM 添加了 sockjs-client。然后我尝试像这样在 NG-Service 中创建一个 SockJS 实例。 SockJs 只是一个不兼容角度的 npm 包的示例:

import { SockJS } from 'sockjs-client';
//...
private socket: SockJs;
//...
this.socket = new SockJS(this.serverURI);

编译正常,但运行时错误提示

SockJS 不是构造函数

经过一番谷歌搜索后,我偶然发现了 Angular 中的类型,以使 js-types 可用于打字稿转译器https://www.typescriptlang.org/docs/handbook/tsconfig-json.html。为了使它工作,我必须通过从 NPM 安装 @types/sockjs-client 来添加类型。这导致编译器错误

'SockJS' 指的是一个 UMD 全局,但当前文件是一个模块。 考虑改为添加导入。

此错误意味着 typescript 转译器已知类型但未显式导入。您必须导入类型以明确告诉 typescript 您知道您正在使用外部脚本,该脚本在编译时无法通过 typescript 验证其存在。该包的存在只会在运行时检查。显式导入语句如下所示

import * as SockJsClient from 'sockjs-client';
//...
private socket: SockJsClient.Socket;
//...
this.socket = new SockJsClient(this.serverURI);

【讨论】:

  • 不是完全相同的导入,而是另一个模块?我看不出有什么区别。你能详细说明区别吗?
  • 我想明确指出,在 Angular 中使用旧的 js-libs 时会面临一系列问题,并且该行为是 Angular 的意图。首先,您安装了一个不可用的 npm 包,然后您了解如何键入并安装类型(或自己创建它们),然后您会得到可以通过正确导入来解决的 UMD 异常(这也是 indetended)。上面的答案为我指明了正确的方向,但对我来说并不是“如何解决”。我也承认我的答案非常相似。
猜你喜欢
  • 2023-03-17
  • 2022-09-23
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多