Javascript 传单在通过CDN而非npm pakcage使用时呈现Windy地图
我正在通过CDN使用in-React,它工作正常: 在index.js中:Javascript 传单在通过CDN而非npm pakcage使用时呈现Windy地图,javascript,reactjs,leaflet,Javascript,Reactjs,Leaflet,我正在通过CDN使用in-React,它工作正常: 在index.js中: 反应组分: export const renderMap=():void=>{ 常量选项={ 键:“xyz”, 拉丁美洲:41.3, lon:2.1, 缩放:10, }; //eslint禁用下一行@typescript eslint/无显式任何 (如有窗口)。windyInit(选项,(windyAPI:any)=>{ const{map}=windyAPI; //eslint禁用下一行@typescript es
反应组分:
export const renderMap=():void=>{
常量选项={
键:“xyz”,
拉丁美洲:41.3,
lon:2.1,
缩放:10,
};
//eslint禁用下一行@typescript eslint/无显式任何
(如有窗口)。windyInit(选项,(windyAPI:any)=>{
const{map}=windyAPI;
//eslint禁用下一行@typescript eslint/无显式任何
(如有窗口)。L.弹出窗口()
.setLatLng([41.3,2.1])
.setContent(“:)”)
.openOn(地图);
});
};
然而,我希望能够使用传单npm包,而不是CDN。导入包时,它已定义,但Windy会抛出错误:
libBoot.js:3传单库丢失
在index.js中:
反应组分:
从“传单”导入L;
导出常量renderMap=():void=>{
console.log('L',L);//已定义-对象存在
常量选项={
键:“xyz”,
拉丁美洲:41.3,
lon:2.1,
缩放:10,
};
//eslint禁用下一行@typescript eslint/无显式任何
(如有窗口)。windyInit(选项,(windyAPI:any)=>{
const{map}=windyAPI;
L.弹出窗口()
.setLatLng([41.3,2.1])
.setContent(“:)”)
.openOn(地图);
});
};
关于在线设置的信息很少,因为Windy遵从传单,传单遵从Windy。传单快速入门指南或其github中没有任何信息
使用“传单库丢失”错误的正确方法是什么?原因很简单,是这些JS库的加载顺序:
在脚本开头加载传单库,然后从URLhttps://api.windy.com/assets/map-forecast/libBoot.js
- 当您在HTML页面中显式地编写
标记(通过CDN加载它们)时,首先正确地加载传单,然后是Windy - 但是当你导入传单时,webpack(当你使用React时,它是默认的构建引擎)会将它与你的应用程序代码捆绑在一起,默认情况下,它会将
标签插入HTML页面的
最后一个位置,从而使它在Windy之后加载(然后抛出错误消息) - 当您重新引入
标签以从
文件夹加载传单时,我想您应该先将其放回(即,在Windy标签之前);但是,这只在开发中起作用,因为节点模块
文件夹在生产中不可用node\u modules
- 在我们的应用程序代码中动态生成Windy的
标签;这样可以确保它在传单之后加载;但我们必须延迟应用程序中依赖Windy的部分的执行(例如,将其包装在
中,最好检查Windy现在是否可用,因为其加载延迟可能会有所不同)setTimeout
- 使用一些webpack插件在我们的代码中导入Windy,但是webpack实际上仍然从URL加载:例如,使用特定配置来指定URL;不确定是否仍然有正确的加载顺序,因为它可能无法识别对传单的依赖性
考虑到Windy需要对
any
进行的强制转换,我发现您实际上使用了TypeScript。因此,您可能希望提供活页打字,当您导入活页打字时(并且安装了活页打字),活页打字几乎是自然而然的,这给您的印象是,必须从npm加载活页打字才能工作。在这种情况下,我们可以利用以下事实:类型和实际运行时代码是两个独立的东西。在这种情况下,您仍然可以导入代码中的
传单,并从其类型中获益,但请指示webpack不要将其捆绑;您将使其在外部可用,通常是因为您从CDN加载。请参阅webpack的externals选项。这样,您就可以两全其美:您可以在Windy之前按自己的方式加载传单,并且仍然可以打印传单。请尝试在cdn上使用最新版本的传单。
,是否有效?谢谢@FalkeDesign good point。实际上,它不工作,并抛出一个错误,表示v1.4.x是必需的。我尝试了v1.4.0,但出现了最初的错误。