由于服务端渲染,vuepress
不能使用vue
依赖 DOM 导入库的组件。
即这不起作用,因为mapbox-gl
需要在导入时访问 DOM:
import mapboxgl from 'mapbox-gl'
建议的解决方案是在created()
钩子中使用动态导入,例如
created () {
import('mapbox-gl').then(MapboxModule => {
window.mapboxgl = MapboxModule.default
}
}
但是,我无法使动态导入与模块捆绑一起正常工作。[编辑](错误启动后,动态导入方法确实有效。)
另一种策略可能是使用head 部分加载mapbox-gl
脚本。vuepress
config.js
例如,在我的docs/.vuepress/config.js
文件中,我有:
head: [
['link', {
rel: 'stylesheet',
type: 'text/css',
href: 'https://api.tiles.mapbox.com/mapbox-gl-js/v0.53.1/mapbox-gl.css'
}],
['script', {
src: 'https://api.tiles.mapbox.com/mapbox-gl-js/v0.53.1/mapbox-gl.js'
}]
],
除了import
语句之外,整个组件都可以正常使用,因为mapboxgl
变量在window
命名空间中可用。
因此我的问题是:是否有一种简单而优雅的方式来停用import
专门用于 from 的语句vuepress
?
我当前的解决方案包括创建一个没有导入的基本组件(用于 from vuepress
),然后在另一个组件中扩展它,然后显式导入并注册全局变量,例如
<script>
import mapboxgl from 'mapbox-gl'
window.mapboxgl = mapboxgl
// eslint-disable-next-line
import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder'
window.MapboxGeocoder = MapboxGeocoder
// eslint-disable-next-line
import MyComponentBase from './MyComponentBase.vue'
export default {
name: 'MyComponent',
extends: MyComponentBase
}
</script>