🚀🚀🚀记录vue/cli5.04 引入cesium@1.98.1版本报错异常❌以及引入cesium的坑🕳

758 阅读3分钟

记录vue/cli5.04 引入cesium@1.98.1版本报错异常以及引入cesium的坑

在使用vue/cli5.04引入cesium@1.98.1版本时,运行时遇到cesium is undefined报错,以及一开始引入正常,多次刷新引入失败。

此方法不唯一,方法来源百度,若不成功,自行百度解决。

一、引入cesium,本案例引入cesium@1.98.1版本(高版本会带有引入cesium方法失败问题,可能是vue2版本太低或webpack没有配置正常导致,自行百度)

1,下载包

npm install cesium@1.98.1 -S 或  yarn add  cesium@1.98.1 -S

2,将下载后的文件从node_modules中复制一部分到public文件夹下

1.png

2.png

3,在index.html中引入js文件和css文件

<link rel="stylesheet" href="./Cesium/Widgets/widgets.css">
<script src="./Cesium/Cesium.js"></script>  

注意: 放在body内

4,使用cesium

<template>
   <div id="cesiumContainer" style="width: 100%; height: 100%;"></div>
</template><script>
export default{
    name:'cesium',
    mounted(){
         Cesium.Ion.defaultAccessToken = 'your token';
         const viewer = new Cesium.Viewer('cesiumContainer');
         console.log(viewer)
   }
}
</script>

注意:若想要在data中实例化Cesium.Viewer,请在构造函数中全局对象上挂载或在window上挂载,虽然在单组件中不会有任何影响,问题出现在当cesium导入大量数据渲染时,导致页面异常卡顿或不加载,原因是viewer与vue中的data或者computed进行了绑定,导致vue对viewer进行了数据劫持,劫持了太多数据。导致异常加载或卡顿。

5,问题出现在加载cesium多次过程中

现象:首次或前几次加载页面以及渲染页面都没有任何问题,经过反复加载引入有cesium的页面时却无法显示地图。

经过多次研究以及排查,最终在一篇issue回答中找到问题所在

如果vue中模式为mode: 'history',可以变成 hash  模式或者在index.html引入的时候,将相对路径转换成绝对路径,比如:
相对路径:<script src="./cesium/Cesium.js"></script>
绝对路径:<script src="/powerbi.js"></script>

当即恍然大悟,问题的关键就是关键的问题,oh my gad , please no !

回过头来,查看了router.js 文件,没错就是’history’,当然为了项目我改成了绝对路径,如何抉择请根据自己的需求修改。

二、main.js引入(此方法我未成功,webpack与vue版本太多羁绊,网上各种配置,导致我无法根据我的配置来配置,或许你可以呢)

1,安装依赖

npm install cesium@1.98.1 -S 或者yarn add cesium@1.98.1 -S

npm install copy-webpack-plugin@5.00 -S 或者yarn add copy-webpack-plugin@5.00 -S (此版本与vue/cli版本相关联,如若报错自行百度)

2,配置vue.config.js

const CopyWebpackPlugin = require('copy-webpack-plugin')
const webpack = require('webpack')
const path = require('path')

let cesiumSource = './node_modules/cesium/Source'
let cesiumWorkers = '../Build/Cesium/Workers'

module.exports = {
    publicPath: "./",
    outputDir: "dist",
    lintOnSave: false,
    devServer: {
        open: process.platform === "darwin",
        host: "0.0.0.0",
        port: 5000,
        https: false,
        hotOnly: false
    },
    configureWebpack: {
        output: {
            sourcePrefix: ' '
        },
        amd: {
            toUrlUndefined: true
        },
        resolve: {
            alias: {
                'vue$': 'vue/dist/vue.esm.js',
                '@': path.resolve('src'),
                'cesium': path.resolve(__dirname, cesiumSource)
            }
        },
        plugins: [
            new CopyWebpackPlugin([{ from: path.join(cesiumSource, cesiumWorkers), to: 'Workers' }]),
            new CopyWebpackPlugin([{ from: path.join(cesiumSource, 'Assets'), to: 'Assets' }]),
            new CopyWebpackPlugin([{ from: path.join(cesiumSource, 'Widgets'), to: 'Widgets' }]),
            new CopyWebpackPlugin([{ from: path.join(cesiumSource, 'ThirdParty/Workers'), to: 'ThirdParty/Workers' }]),
            new webpack.DefinePlugin({
                CESIUM_BASE_URL: JSON.stringify('./')
            })
        ],
        module: {
            unknownContextCritical: /^.\/.*$/,
            unknownContextCritical: false
        }
    }
};

3,main.js

import Vue from 'vue'
import App from './App.vue'

Vue.config.productionTip = false

//引入cesium相关文件
const Cesium = require('cesium/Cesium');
//或者
import * as Cesium from "cesium/Cesium";

Vue.prototype.Cesium = Cesium

new Vue({
    render: h => h(App)
}).$mount('#app')

4,使用cesium,同上方法一

最后我想说在学习的路上没有一条路是最捷径的,一步一个脚印的走下去,走多了,路走通了,再去寻找捷径的路。