【发布时间】:2023-03-20 03:51:01
【问题描述】:
我有 Vue SPA,我正在尝试迁移到 nuxt。我在一个包含在<client-only> 标签中的组件中使用vue2leaflet,但仍然收到来自nuxt 的错误消息,即window is not defined。
我知道我可以使用 nuxt-leaflet 或创建一个插件,但这会显着增加供应商捆绑包,我不希望这样。我只想为需要它的组件导入传单插件。有什么办法吗?
<client-only>
<map></map>
</client-only>
还有map 组件:
<template>
<div id="map-container">
<l-map
style="height: 80%; width: 100%"
:zoom="zoom"
:center="center"
@update:zoom="zoomUpdated"
@update:center="centerUpdated"
@update:bounds="boundsUpdated"
>
<l-tile-layer :url="url"></l-tile-layer>
</l-map>
</div>
</template>
<script>
import {
LMap,
LTileLayer,
LMarker,
LFeatureGroup,
LGeoJson,
LPolyline,
LPolygon,
LControlScale
} from 'vue2-leaflet';
import { Icon } from 'leaflet';
import 'leaflet/dist/leaflet.css';
// this part resolve an issue where the markers would not appear
delete Icon.Default.prototype._getIconUrl;
export default {
name: 'map',
components: {
LMap,
LTileLayer,
LMarker,
LFeatureGroup,
LGeoJson,
LPolyline,
LPolygon,
LControlScale
},
//...
【问题讨论】:
-
组件不是这里的问题,而是包含不适合 ssr 的传单。
<client-only>所做的只是阻止 ssr 期间的渲染,而不是阻止包含脚本。 -
我明白了。有什么办法可以为这个组件使用像
nuxt-leafletonly 这样的插件? -
不,因为即使使用动态导入,它仍然会在 ssr 期间被转译。我会假设图书馆的包含必须在有条件的情况下发生