代码之家  ›  专栏  ›  技术社区  ›  Michael

在Nuxt/Vue中安装传单的正确方法

  •  0
  • Michael  · 技术社区  · 9 月前

    我试图在我的Nuxt 3项目中安装传单,而不使用@nuxtjs/parlear等包装器,但它说“找不到模块‘传单’的声明文件,尽管我安装了 leaflet 来自npm的包。

    //template
    <div id="map"></div>
    
    //script
    <script setup lang="ts">
    import * as L from "leaflet";
    
    onMounted(() => {
        const map = L.map("map").setView([34.299074, -118.45949], 13);
        L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
            maxZoom: 19,
            attribution:
                '&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
        }).addTo(map);
        L.marker([34.299074, -118.45949]).addTo(map);
    });
    </script>
    

    然后我在nuxt.config.ts中添加一个css文件:

    css: [
        "leaflet/dist/leaflet.css",
    ],
    

    我现在得到的只是一张带有放大/缩小按钮的空地图,右下角有标题“传单|开放街道地图”。

    这是复制品: https://stackblitz.com/edit/nuxt-starter-jcj5xn?file=app%2Fpages%2Findex.vue,app%2Fapp.vue,app%2Fpages%2Fevents.vue 。如果您单击“转到活动”链接,将打开空白地图。如果重新加载页面,则会出现未定义“窗口”的错误。在我的实际项目中,我甚至不能拖动地图,也没有标记。此外,它一直在说“试图加载无限数量的图块”,尽管 https://tile.openstreetmap.org/{z}/{x}/{y}.png 根据官方文件,这是一个正确的tileLayer leafletjs.com/examples/quick-start .

    寻找一个可能的解决方案。

    1 回复  |  直到 9 月前
        1
  •  1
  •   Estus Flask    9 月前

    不包含TypeScript类型的流行最新包与来自 @types 范围作为经验法则。在这种情况下 @types/leaflet 应与一起安装 leaflet .

    页面重新加载时发生的错误是Nuxt服务器特有的。 传单 模块仅供客户端使用,访问不安全 window 全局变量。模块是否被评估或在服务器端由Nuxt的构建工具决定。为了避免这种情况,不应在服务器端导入该模块:

    onMounted(async () => {
      const L = await import('leaflet');
      ...
    

    地图图块未显示的问题是特定于 particular sandbox 在devtools中可以看到,地图被渲染,但地图图块请求被标记为“被阻止”:

    https://tile.openstreetmap.org/13/1400/3263.png

    https://tile.openstreetmap.org/13/1400/3264.png

    ...

    在请求详细信息和“问题”选项卡中解释了原因:

    未设置跨源资源策略:

    因为您的站点启用了跨源嵌入器策略(COEP), 每个资源都必须指定合适的跨源资源策略 (公司)。此行为可防止文档跨源加载 未明确授予加载权限的资源。

    要解决此问题,请在资源响应标头中添加以下内容:

    跨源资源政策:如果资源和您的网站相同,则使用同一网站 它们来自同一个网站。

    跨源资源策略:如果资源得到服务,则跨源 从您网站以外的其他位置。如果你设置了这个标题,任何 网站可以嵌入此资源。

    这是由于演示在预览框中运行,跨源限制应用于iframe。这可以通过在单独的窗口中打开预览来修复,这可能会在Stackblitz或本地运行Nuxt上不可靠地工作。