前提
最近想写一个自己关于cesium的demo库,发现网上用法很多,加在自己项目中却各种不行,最后选择了最方便的vue-cli-plugin-cesium
vue-cli-plugin-cesium
专门为脚手架vue-cli3.0和2.0打造的针对Cesium的VueCli扩展插件,自动化包括:
1.自动扩展 VueCLI 中 Cesium 相关的 webpack 配置
2.添加一个 cesium 别名,以便我们在项目中轻松的引入 Cesium 文件资源
- 使 Cesium 对象实例可在每个 Vue 模块中使用而无须 import 引入
- 使 webpack 可正常打包 Cesium
- 允许 webpack 友好地在 Cesium 中使用 require,解决 require 引入警告
- 开发环境生成 sourcemap,生产环境取消 sourcemap
- 生产环境抽取公共模块执行压缩
- 生产环境 loader 切换到优化模式
3.自动在全局 main.js 中引入Widgets.css,可选
4.自动在 components/ 文件夹下生成示例文件,可选
自动扩展 VueCLI 中 Cesium 相关的 webpack 配置
安装步骤
使用方式1:
推荐使用 vue add 这种方式安装,一步到位,简单便捷
vue add vue-cli-plugin-cesium
// 非全局安装的vue-cli可以
npx vue add vue-cli-plugin-cesium
使用方式2:
首先安装 vue-cli-plugin-cesium 插件,推荐使用 yarn 安装,因为它更简洁
// npm
npm install --save-dev vue-cli-plugin-cesium
// yarn
yarn add vue-cli-plugin-cesium
复制代码
安装完成后我们要使用 vue invoke 来初始化这个插件
vue invoke vue-cli-plugin-cesium
// 非全局安装的vue-cli可以
npx vue invoke vue-cli-plugin-cesium
安装过程中出现的3个问题:
- (1)版本选择最新版本
- (2)是否全局引入样式,该操作将自动在main.js引入widgets.css? yes
- (3)是否添加示例组件到项目components目录? yes
出现问题
/node_modules/cesium/Source/ThirdParty/zip.js" 这个文件不能打包
解决办法:package.json中"dependencies": { "cesium": "1.80.0" }版本切换为1.80.0,目前1.85.0会报错
配上vue.config.js
// 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",
// eslint-loader 是否在保存的时候检查
lintOnSave: false,
// webpack-dev-server 相关配置
devServer: {
open: process.platform === "darwin",
host: "0.0.0.0",
port: 8082,
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: {
//解决Critical dependency: require function is
// used in a way in which dependencies cannot be statically extracted的问题
unknownContextCritical: false
}
},
chainWebpack: config => {
const oneOfsMap = config.module.rule('scss').oneOfs.store
oneOfsMap.forEach(item => {
item
.use('sass-resources-loader')
.loader('sass-resources-loader')
.options({
// Provide path to the file with resources
// 要公用的scss的路径
resources: './src/assets/css/global.scss'
})
.end()
})
},
}
可以直接引入我的vue.config.js,显示插件未安装时,只需要删除依赖包,直接yarn重新下载依赖即可
最后贴上我的页面使用代码:
<template>
<div class="map-box">
<div id="cesiumContainer"></div>
</div>
</template>
<script>
export default {
name: "",
mounted() {
// var viewer = new Cesium.CesiumWidget('cesiumContainer')
// eslint-disable-next-line no-undef
var viewer = new Cesium.Viewer("cesiumContainer");
// eslint-disable-next-line no-console
console.log(viewer)
}
};
</script>
<style scoped>
.map-box{
width: 100%;
height: 100%;
}
#cesiumContainer{
width: 100%;
height: 100%;
}
</style>
完整使用代码:
<template>
<div class="cc-model-move-">
<cc-header :headtitle="'ModelMove(模型移动)'" />
<cc-scroll>
<div class="map-box">
<div id="cesiumContainer"></div>
</div>
<!-- <CesiumViewer /> -->
</cc-scroll>
</div>
</template>
<script>
const COMPONENT_NAME = "dialog-from";
// import * as Cesium from "cesium";
// import "cesium/Build/Cesium/Widgets/widgets.css";
// import CesiumViewer from '../../components/CesiumExample/No01-init'
import ccHeader from "../../components/cc-header/cc-header.vue";
import ccScroll from "../../components/cc-scroll/cc-scroll.vue";
export default {
name: COMPONENT_NAME,
components: {
ccHeader,
ccScroll,
// CesiumViewer
},
props: {},
data() {
return {};
},
mounted() {
this.initView();
},
methods: {
initView() {
// var viewer = new Cesium.Viewer("cesiumContainer")
// console.log(viewer, "viewer");
const vmodels = Cesium.createDefaultImageryProviderViewModels()
var token = "0b018552994f71a9467d24461a8f8238";
Cesium.Ion.defaultAccessToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIzZjQ0Mjg3Yy05ZDcxLTQyZDAtYTY3Yy03YmI0MDM3MDZhMjgiLCJpZCI6NzI3NjQsImlhdCI6MTYzNjM2MDU3MH0.yEsenwMWNDoP9-4CoT77mLJpJNJKtbiDSaD9jiv5O8s";
var viewer = new Cesium.Viewer("cesiumContainer", {
geocoder: true,
// homeButton:视角返回初始位置
homeButton: true,
// sceneModePicker:选择视角的模式,分别为3d,2d,哥伦布视图
sceneModePicker: true,
// baseLayerPicker:图层选择器,选择要显示的地图服务和地形服务
baseLayerPicker: true,
// navigationHelpButton:导航帮助按钮,显示默认的地图控制帮助
navigationHelpButton: true,
// animation:动画器件,控制视图动画的播放速度
animation: true,
// creditContainer:版权显示,显示数据归属,必选
// creditContainer: "credit",
// timeline: 时间线设置,控制视图动画的播放速度
timeline: true,
// fullscreenButton: 全屏按钮
fullscreenButton: true,
// vrButton: vr按钮
vrButton: true,
imageryProviderViewModels: vmodels,
// selectedImageryProviderViewModel: 选择基础图象层的视图模型
selectedImageryProviderViewModel: vmodels[1],
});
viewer.scene.debugShowFramesPerSecond = true; // 显示帧速(fps)
}
}
};
</script>
<style scoped>
.map-box {
width: 100%;
height: 100%;
}
#cesiumContainer {
width: 100%;
height: 100%;
}
</style>
效果图:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。