前言

这个问题是 同事碰到的一个问题 

主要的影响因素在于 官方的 demo 从 mars3d-cesium 中暴露了一部分文件作为 http 服务, 然后 我们自己的 case 里面没有这部分服务, 然后 导致 js 访问不到 

以及 大部分的 css, js, img 等等 静态资源 访问不到 

 

Cesium is not defined 的问题定位 

项目启动之后 console 报错如下

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_css

 

首先是比较一下 demo 代码的调整

主要是比较 HelloWorld.vue 和 map.vue 和 vue.config.js 和 package.json

比较结果为, HelloWorld.vue 和 map.vue 无明显的感动, 仅仅是 codestyle 的差异

vue.config.js 仅仅是注释掉了 devServer 的配置  

package.json 仅仅是注释掉了一些元数据信息

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_前端_02

 

 

重新安装依赖

这种 not defined 另外一种可能是 安装的依赖存在问题, 因此 删除 node_modules 之后重新 npm install

然后 重新启动项目, 发现问题 依然存在

 

 

确定报错的位置

因为从 报错的堆栈信息中, 我们无法确认具体 是因为什么报错

因此 我们来进行一个简单的排除法 来定位是哪里 引起的 mars3d 的库函数的报错

注释 mars3d 的相关依赖, 以及使用的地方, 直到 页面可以正常使用

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_3d_03

 

正常页面如下

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_vue.js_04

 

然后发现 只要是有 “import * as mars3d from "mars3d";”相关 页面就会报错

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_3d_05

 

 

根据 mars3d 检索所有的 .vue, .js 判断问题

.vue 中如下, 可以看到 仅仅是 HelloWorld.vue 和 map.vue 这两个业务模块中有使用

其他的诸如 App.vue 等等 vue 的基础代码中没有 mars3d 的使用

因此 我们可以不管 .vue

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_vue.js_06

 

再来看一下 .js

可以看到, 只有 vue.config.js 中有 mars3d 的关键字, 然后 我们来查看一下 详细的代码

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_3d_07

 

这块代码如下, 先只看注释 else 排除使用 mars3d-cesium

然后 我们这里缺少的就是 Cesium

然后 对比正常的 demo 项目 mars3d-vue2

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_javascript_08

 

 

然后搜索一下 “VUE_APP_MARS3D_SOURCE”, 可以看到 mars3d-vue2 中是有 “VUE_APP_MARS3D_SOURCE=module” 的配置的

然后将 .env 拷贝到 mars3d_test, 之后 重启项目

VUE_APP_MARS3D_SOURCE 的作用可以参考这块的 README.md

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_javascript_09

 

更新 .env 增加环境变量如下, 然后 启动项目

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_3d_10

 

可以发现是 大部分功能是正常了, 但是 貌似还存在一些小问题

可能是 样式问题 或者 js加载异常导致的样式问题

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_javascript_11

 

 

根据 VUE_APP_MARS3D_SOURCE 的备注探讨其他的解决方式

其实产生 这个问题的原因是在 README.md 的 第三章节

三种导入 mars3d-cesium 库的方式, 第一种就是 mars3d-vue2 的方式, 只是我们这里 未加环境变量为 ”--dev” 的配置

第二种是直接通过 css,js 导入, 直接在 public/index.html 下面添加 css, js 的依赖

第三种是基于当前 项目提供 css, js 的服务

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_前端_12

 

 

在 public/index.html 中直接导入 css/js

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_前端_13

 

然后 效果如下, 可以看到 也没有上面的 样式错乱问题了

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_vue.js_14

 

 

下载官方 sdk 放在 public 下面由本项目提供这部分的 js/css/img 的服务

调整如下, 拷贝相关资源, 更新 index.html 

更新 VUE_APP_MARS3D_SOURCE 为 local 

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_css_15

 

然后启动项目情况如下 

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_javascript_16

 

 

存在的样式问题的调试排查

上面问题解决了之后, 我这边还会出现一个样式问题如下

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_vue.js_17

 

这个问题的排查方式如下, 一般要么就是 js, 要么就是 css 的问题

找一个存在问题的元素, 来查看 相关 listener, style, 比如我这里 是以左下角的一个 ”帮助切换按钮” 为例

 

 

js 这块的差异

先来看 js 这块, 正常的情况下 js 的回调如下

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_vue.js_18

 

然后 我们再来看一下 异常的情况, 然后 确认一下 click 的回调是否一致

可以看到的事 二者的是一样的, 然后 我们再来 查看 css 这边

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_3d_19

 

 

css 这块的差异

然后再来看 正常的这一边的 css

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_css_20

 

异常的情况下的 css

可以看到 相比于正常情况是 缺少一部分 css 的, 然后 我们来项目中搜索一下 这部分的 css

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_css_21

 

 

以 “.cesium-navigation-button-right” 为例, 可以找到如下, 前者是该 vue组件 的 css, 后者是 build 生成的 css, 我们应该使用的是后者

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_vue.js_22

 

这个 css 是在这里处理的, 可能因为 某些原因 编译, 没有吧这个 css 编译进去

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_前端_23

 

具体的原因 我们先不探究, 先解决问题, 我们的 map.vue 会引用 “/Users/jerry/WebstormProjects/mars3d_test/node_modules/mars3d/dist/mars3d.css”

我们先将目标 css 复制进去, 然后 重新启动项目 看一下 效果

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_3d_24

 

 

现在 页面正常了

32 mars3d 官方 demo 可以跑起来, 但是自己拷贝的 demo 跑不起来_css_25

 

 

完