今天研究了下 Vue + Cesium 的相关配置,用的是 Cesium 1.69。 网上找到了很多参考文章,如:https://www.jianshu.com/p/ff26886f7255,
但配置完后使用 import Cesium from 'cesium/Cesium'
导入模块时总会报错:javascript
"export 'default' (imported as 'Cesium') was not found in 'cesium/Cesium'
查找缘由,发现 Cesium 1.63 版本以前是用的AMD的方式进行编译的,css
而在1.63版时使用ES6进行了重构:
因此1.63以后的版本,导入模块时应该使用以下方式:vue
import * as Cesium from 'cesium/Source/Cesium.js' //或者: import {Viewer} from 'cesium/Source/Cesium.js'
这样就不会报错了。若是你遇到了一样的问题,恭喜你接下来的配置步骤能够略过了。java
使用vue-cli工具建立一个vue项目:node
vue init webpack cesium_demo
安装cesium:webpack
cd cesium_demo npm install cesium --save
这里须要修改webpack.base.conf.js, webpack.dev.conf.js, webpack.prod.conf.js 三个文件git
const cesiumSource = '../node_modules/cesium/Source'
在output中添加sourcePrefix:' '
es6
output: { path: config.build.assetsRoot, filename: '[name].js', publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath, sourcePrefix: ' ' },
须要在resolve中设置cesium别名,这样在引入的时候就能够根据别名找到Cesium的包。
(注:也能够不设置别名,导包是直接导入'cesium/Source/Cesium.js'
就行。其实设置别名的目的就是让“别名”指向/node_modules/cesium/Source
目录)github
resolve: { extensions: ['.js', '.vue', '.json'], alias: { 'vue$': 'vue/dist/vue.esm.js', '@': resolve('src'), cesium: path.resolve(__dirname, cesiumSource) } },
unknownContextCritical:false
module: { rules:[ ... ], unknownContextCritical: false, }
const cesiumSource = 'node_modules/cesium/Source' const cesiumWorkers = '../Build/Cesium/Workers'
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({ // Define relative base path in cesium for loading assets CESIUM_BASE_URL: JSON.stringify('') })
const cesiumSource = 'node_modules/cesium/Source' const cesiumWorkers = '../Build/Cesium/Workers'
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({ // 注意这里和dev的配置不一样 // 定义Cesium从哪里加载资源,若是使用默认的'',却变成了绝对路径了,因此这里使用'./',使用相对路径 CESIUM_BASE_URL: JSON.stringify('./') })
再次强调这里不能使用 import Cesium from 'cesium/Cesium'
导入模块,由于Cesium 1.63 版本之后使用的是ES6。应该使用以下方式:web
<template> <div class="container"> <div id="cesiumContainer"></div> </div> </template> <script> import { Viewer } from 'cesium/Cesium' import 'cesium/Source/Widgets/widgets.css' export default { name: "cesiumPage", data() { return {}; }, mounted() { let viewer = new Viewer("cesiumContainer"); } }; </script> <style scoped> .container { width: 100%; height: 100vh; } #cesiumContainer { width: 100%; height: 100vh; } </style>
成功!
https://www.jianshu.com/p/ff26886f7255
https://github.com/CesiumGS/cesium/issues/8471
https://cesium.com/docs/tutorials/cesium-and-webpack/