在Angular项目中,我使用的是modularized lib的leaflet
库。
尽管是模块化库,leaflet
仍为“旧版”应用声明了全局L
变量,但未在其应用上使用模块加载器。
最近,我们不得不在项目中集成NonTiledLayer Leaflet plugin。该库的目的是“丰富” L
提供的全局leaflet
变量,并添加新的实用程序类(例如,L.NonTiledLayer
)。
此插件通过npm
分发时,未声明为模块(在导入的npm源中不存在define()
)。
"use strict";
var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null);
L.NonTiledLayer = (L.Layer || L.Class).extend({
//....
据我了解,这意味着当Webpack在应用程序上提供代码时,代码按“原样”执行(不会延迟加载)。
问题在运行时出现是因为,按时间顺序(带有调试断点)可以看到的是:
leaflet
模块已声明,但由于当时没有模块消耗它,因此它的主体未执行。leaflet.nontiledlayer
被执行(没有模块声明),因此window.L
全局变量充斥着NonTiledLayer
对象。L
代码时,我不是100%理解为什么undefined
变量不是leaflet.nontiledlayer
……我想我有时会遗漏某些东西。 / em> leaflet
模块的模块使leaflet
的延迟加载得以执行。声明了一个新的window.L
变量,并覆盖了一个由leaflet.nontiledlayer
定义的变量,从而使leaflet.nontiledlayer
实用程序不可用。所以,主要来说,我担心的是:我要么想要:
leaflet
代码之前,考虑“非常早”加载leaflet.nontiledlayer
模块(避免延迟加载)leaflet.nontiledlayer
转换为模块并使其依赖于leaflet
模块,以确保leaflet
在leaflet.nontiledlayer
之前被加载我想我可以通过调整一点Webpack(我想使用shims
)来实现这一目标……但我想尽可能避免使用ng eject
。
我没有找到任何Angular文档,可以轻松声明此类配置。
当前,我的解决方法是将Leaflet.NonTiledLayer
个js文件直接集成到我的项目中,将其转换为TS文件,并在文件开头的import
上放置一个leaflet
,以声明对leaflet
的依赖关系,并将纯JS文件转换为TS模块。
这种快速而肮脏的解决方案可以工作,但是有很多缺点:
leaflet.nontiledlayer
版本升级(通过程序包管理器)我确定有更好的解决方案,但是这里缺少一些Angular x Webpack知识。
预先感谢