webpack快速上手之搭建cesium三维地球环境

前言


 📫 大家好,我是南木元元,热衷分享有趣实用的文章,希望大家多多支持,一起进步!

🍅 个人主页:南木元元


目录

Cesium介绍

初始化一个Cesium地球

​编辑

Webpack的使用

Webpack搭建Web应用

初始化项目

使用配置文件

配置html模板

配置webpack-dev-server

管理资源

集成Cesium

安装CesiumJS

定义Cesium路径

管理Cesium静态文件

使用Cesium

踩坑

总结


Cesium介绍

CesiumJS是目前主流的一款三维地图框架,是一个跨平台、跨浏览器的展示三维地球和地图的JavaScript库,通过WebGL技术实现图形的硬件加速,不需要任何插件支持。

Cesium提供了很多服务,下面是最主要的一些:

  • 支持全球级别的高精度的地形和影像服务
  • 支持 2D、2.5D、3D 形式的地图展示
  • 可以绘制各种几何图形、高亮区域,支持导入图片,甚至3D模型等多种数据可视化展示
  • 可用于动态数据可视化并提供良好的触摸支持,支持绝大多数的浏览器和mobile
  • 支持基于时间轴的动态数据可视化展示

本文就来分享一下如何搭建Cesium的环境。

初始化一个Cesium地球

最简单的方式就是从官网下载Cesium包,然后引入其中的cesium.js和widgets.css即可。

  • 下载Cesium源码包

官网下载地址:https://cesium.com/downloads/

下载完解压后会发现有很多文件,如下图所示:

其实只需要 Build 下面的 Cesium 这个文件夹,它是编译后 Cesium 包的正式版本。

  • 搭建环境

新建一个index.html文件,然后引入其中的cesium.js和widgets.css。

 Build/Cesium目录

Cesium.js:定义了Cesium对象

 Build/Cesium/Widgets目录

widgets.css:默认的Cesium CSS样式文件

创建一个 div,用来作为三维地球的容器

<div id="cesiumContainer"></div>

初始化 CesiumViewer实例

var viewer = new Cesium.Viewer('cesiumContainer');

完整代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hello World</title>
    <script src="Cesium/Cesium.js"></script>
    <link rel="stylesheet" href="Cesium/Widgets/widgets.css">
    <style>
        html, body, #cesiumContainer {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
            overflow: hidden;
        }
    </style>
</head>
<body>
    <div id="cesiumContainer"></div>
    <script>
        var viewer = new Cesium.Viewer('cesiumContainer');
    </script>
</body>
</html>

Cesium是需要运行在Web服务器上的,所以直接打开index.html是无效的,可以使用http-server服务器搭建一个简单的服务,全局安装http-server,如下:

npm install -g http-server

项目根目录下运行http-server开启服务

此时,在浏览器输入http://127.0.0.1:8080即可看到一个3D的地球:

是不是很简单,不过接下来才是本文的重点。

Webpack的使用

近年来Web应用变得越来越复杂与庞大,通过直接编写JavaScript、CSS、HTML开发Web应用的方式早已无法应对当前Web应用的发展。于是就出现了一系列的构建工具,如Gulp、Rollup等,沟构建其实是工程化、自动化思想在前端开发中的体现,将一系列流程用代码去实现,让代码自动化地执行诸如代码转化、文件压缩等一系列复杂地流程。

Webpack是目前最流行的前端构建工具。在webpack里一切皆模块,一个模块对应一个文件。通过分析模块间的依赖关系,在其内部构建出一个依赖图,最终编绎输出模块为 HTML、JavaScript、CSS 以及各种静态文件(图片、字体等),让我们的开发过程更加高效。

日常开发者中,我们常常使用vue-cli脚手架来构建项目,其实也是对Webpack的封装,为了更好地熟悉Webpack的配置,本文就使用Webpack来一步步地搭建Cesium环境。

Webpack搭建Web应用

初始化项目

创建一个文件夹webpack-cesium,执行npm init命令,初始化npm:

npm init

接着可以一路回车下去,就会发现 package.json 文件已经创建好了,如下所示:

{
  "name": "webpack-cesium",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

安装webpack依赖(其中webpack-cli用于在命令行中运行webpack),如下:

npm i webpack webpack-cli -D

新建一个src目录,用于存放源代码,并在src下创建一个index.html文件和index.js文件。

index.html文件如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hello World</title>
</head>
<body>
    <p>Hello World</p>
</body>
</html>

index.js文件如下:

console.log('Hello World');

package.json中添加npm script,设置一个快捷方式

{
  ...
  "scripts": {
    "build": "webpack ./src/index.js"
  },
  ...
}

执行npm run build:

npm run build

此时可以看到,生成了一个dist目录以及目录下的main.js文件,说明已经打包成功。

使用配置文件

上面例子使用的是webpack的默认配置,但是大多数项目会需要很复杂的设置,所以需要使用配置文件来进行更加丰富的自定义配置。

配置之前,我们需要知道,Webpack有几大核心概念:

  1. Entry:入口,webpack执行构建的第一步从Entry开始,即webpack从哪个文件开始打包。
  2. Output:输出,指示 webpack 打包完的文件输出到哪里去,如何命名等  。
  3. Loader:加载器,webpack 本身只能处理 js、json 等资源,其他资源需要借助loader,webpack 才能解析。
  4. Plugins:插件,扩展webpack的功能。
  5. mode:模式,主要分为development开发模式和production生产模式。

下面开始配置。

首先创建webpack.config.js配置文件,代码结构如下:

module.exports = {
  // 入口
  entry: "",
  // 输出
  output: {},
  // 加载器
  module: {
    rules: [],
  },
  // 插件
  plugins: [],
  // 模式
  mode: "",
};

配置输入和输出:

const path = require("path");

module.exports = {
  // 入口
  entry: {
    app: "./src/index.js",
  },
  // 输出
  output: {
    // 指定输出文件名
    filename: "app.js",
    // path: 文件输出目录,必须是绝对路径,path.resolve()方法返回一个绝对路径,__dirname 当前文件的文件夹绝对路径,即输出到根目录下的dist目录
    path: path.resolve(__dirname, "dist"),
  },

  ...
  // 模式
  mode: "development",//开发模式

};

上述配置即代表将src/index.js 作为入口点,会将打包后的结果输出到dist目录下的app.js。

修改npm script命令:

{
  ...
  "scripts": {
    "build": "webpack --config webpack.config.js"
  },
  ...
}

再次执行 npm run build 会发现生成了dist目录以及app.js文件。

配置html模板

js文件打包好了,但是我们不可能每次在html文件中手动引入打包好的js,所以需要使用html-webpack-plugin来帮助我们完成这件事。

npm i -D html-webpack-plugin

将插件添加到webpack配置中:

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  ...
  // 插件
  plugins: [
    new HtmlWebpackPlugin({
      // 以src/index.html为模板创建文件,新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
      template: "src/index.html",
    }),
  ],
  ...
};

再次执行npm run build,会发现dist目录下生成了index.html和app.js文件。

并且index.html中已经自动将app.js引入,这时打开index.html,就会在浏览器上看到如下效果:

配置webpack-dev-server

webpack-dev-server 提供了一个基本的 web server,并具有实时重新加载的功能,即每次修改能够自动刷新浏览器。

npm i -D webpack-dev-server

配置dev server:

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  ...
  // 开发服务器
  devServer: {
    host: "localhost", // 启动服务器域名
    port: "3000", // 启动服务器端口号
    open: true, // 是否自动打开浏览器
    hot: true, // 开启HMR
  },
  ...
};

添加一个可以直接运行 dev server 的 script:

{
  ...
  "scripts": {
    "build": "webpack --config webpack.config.js",
    "start": "webpack serve --config webpack.config.js --open"
  },
  ...
}

现在,在命令行中运行 npm start,会看到浏览器自动加载页面,并且如果修改代码web server 将在编译代码后自动重新加载。

注意:当使用开发服务器时,所有代码都会在内存中编译打包,并不会输出到 dist 目录下。

管理资源

webpack 本身只能处理 js、json 等资源,其他资源如css样式资源需要借助相应loader。

安装css-loader和style-loader:

npm i css-loader style-loader -D
  • css-loader:负责将 css 文件编译成 Webpack 能识别的模块
  • style-loader:会动态创建一个 style 标签,里面放置 Webpack 中 css 模块内容

配置loader,loader 有两个属性:test 属性(识别出哪些文件会被转换)和use 属性(定义出在进行转换时,应该使用哪个 loader)。

const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");

module.exports = {
  ...
  // 加载器
  module: {
    rules: [
      {
        // 只对 .css 结尾的文件进行相应处理
        test: /\.css$/, 
        // use数组中Loader执行顺序是从右到左,需确保style-loader在前,css-loader在后
        use: ["style-loader", "css-loader"], 
      },
    ],
  },
  ...
};

以上配置,相当于告诉 webpack 编译器(compiler) :当碰到 require()/import 语句中被解析为 '.css 的路径时,在对它打包之前,先use(使用) style-loader和css-loader 转换一下。

当然,还有许多其他资源如图片、字体等,这里就不再进行配置。

集成Cesium

经过上述操作,webpack已经搭建好了一个基本的Web应用,接下来就是添加Cesium。

安装CesiumJS

npm i -D cesium

定义Cesium路径

与传统的 npm 模块不同,Cesium没有定义入口点,因为库的使用方式多种多样,所以需要定义Cesium的路径。在webpack.config.js顶部添加如下代码:

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

管理Cesium静态文件

Cesium是一个庞大而复杂的库,除了 JavaScript 模块之外,它还包括静态资源,例如CSS、图像和 json 文件,还包括 Web Worker 文件,用于在单独的线程中执行密集计算,需要额外配置来确保Cesium的Assets、Widgets和 Web Worker文件能正确提供和加载。

安装copy-webpack-plugin插件,进行资源的拷贝。

npm i -D copy-webpack-plugin

webpack.config.js中进行如下配置:

const cesiumSource = "node_modules/cesium/Source";
const cesiumWorkers = "../Build/Cesium/Workers";

const path = require("path");
const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const CopywebpackPlugin = require("copy-webpack-plugin");

module.exports = {
  ...
  // 插件
  plugins: [
    ...
    // 拷贝资源
    new CopywebpackPlugin({
      patterns: [
        { from: path.join(cesiumSource, cesiumWorkers), to: "Workers" },
        { from: path.join(cesiumSource, "Assets"), to: "Assets" },
        { from: path.join(cesiumSource, "Widgets"), to: "Widgets" },
      ],
    }),
    // 替换变量
    new webpack.DefinePlugin({
      CESIUM_BASE_URL: JSON.stringify(""),
    }),
  ],
  ...
};

上述配置做了两件事:

  1. 将Assets、Widgets以及Web Worker文件复制到打包后的资源输出目录dist下。
  2. 定义一个环境变量,告诉Cesium使用webpack加载静态文件的基本URL。

使用Cesium

完成上述配置后,接下来就可以正常使用cesium了。

首先定义一个main.css样式文件:

html, body, #cesiumContainer {
	width: 100%;
	height: 100%;
	margin: 0;
	padding: 0;
	overflow: hidden;
}

修改src/index.html,定义一个cesium的容器。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Hello World</title>
</head>
<body>
    <div id="cesiumContainer"></div>
</body>
</html>

修改src/index.js,初始化地球。

import { Ion, Viewer } from "cesium";
import "cesium/Build/Cesium/Widgets/widgets.css";
import "../main.css";

Ion.defaultAccessToken =
  "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJhMWRiNmQ3NS0xYWY0LTQ0OTktYjlhNC1lZDQxOWY2MjFjYzMiLCJpZCI6MTE0NjI5LCJpYXQiOjE2OTI1OTYyNzl9.43IFcv8UAssdObdzXC1QRo3HStHOnq5xCRVhKOadOh8";

var viewer = new Viewer("cesiumContainer");

执行npm start,即可在浏览器看到初始化的三维地球。

踩坑

本文使用的是webpack5,webpack5 升级后默认是不支持polyfill的,编译时会报错。

polyfill即“垫片”的意思,当新的api在旧版浏览器中不可用时,可以使用polyfill来填充这些缺失的功能。Webpack5之后,官方认为自动引入Polyfill会导致bundle体积过大,并且大多数情况下这些自动引入的Polyfill是没有用到的,所以Webpack5需要我们手动引入Polyfill。

解决方法就是根据报错内容按需添加相应配置:

module.exports = {
  ...
  resolve: {
    // 这里直接禁用相应模块
    fallback: { https: false, zlib: false, http: false, url: false },
  },
  ...
};

resolve.fallback指定了当目标构建环境中不存在对应的包时,将使用fallback的值作为回退。

总结

本文主要介绍了Cesium以及Webpack的使用,如何将Cesium一步步地集成到Webpack中。

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏、✍️评论支持一下博主~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/166942.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鼠标点击网页任何地方都显示光标闪烁输入状态

出现这种情况的原因 因为大概是用户无意中打开了浏览器无障碍模式中的使用文本光标浏览网页的功能。 对于Chrome浏览器而言就是这样的&#xff1a; 直接按F7关闭这个模式

谈谈系统性能调优中都需要考虑哪些因素

一、 什么是性能调优&#xff1f; 这个系统好慢、网站又打不开了&#xff0c;太卡了&#xff0c;又没响应了&#xff0c;相信大家都遇到过用户的这种抱怨&#xff0c;此时&#xff0c;说明我们的应用系统出现了性能问题&#xff0c;那么怎么办呢&#xff0c;首先想到的应该是优…

CNCC 2023 | 大模型全面革新推荐系统!产学界多位大咖精彩献言

随着人工智能领域的不断突破&#xff0c;大模型的潮流已然席卷而来。大模型一跃成为时代的新宠&#xff0c;展现出强大的通用性和泛化能力&#xff0c;为 AI 技术的应用进一步打开了想象空间。与此同时&#xff0c;推荐系统作为大规模机器学习算法应用较为成熟的方向之一&#…

腾讯混元模型

最近腾讯的混元大模型内测,我有幸申请到了一个名额。 身为一个程序员,我想大家最关注的一定是该模型的代码和类代码能力,因为这直接关系到这个模型能帮我们解决多少问题,节约多少时间,提高多少效率。 对此,我针对工作中可能会用到的几个点进行了详细的体验。 先说结论:腾讯混元…

工业基础类IFC—材质和纹理

在我们的 IFC技术交流群&#xff08;788206534&#xff09;里&#xff0c;经常会有人提问“如何学习 IFC文档或者其开发”的问题。对于这个问题&#xff0c;我一直没有机会做一个完整的回答&#xff0c;这次我认真回忆了自己关于IFC的学习经历&#xff0c;在此与大家分享。一是…

利用API连接抖音外卖与电商平台和营销系统,实现无代码开发的集成

利用API连接抖音外卖和电商平台 抖音来客&#xff0c;作为抖音生活服务商家经营平台&#xff0c;为商家提供一站式经营服务&#xff0c;其中包括入驻、上品、经营和履约等功能。商家可以通过API调用&#xff0c;实现电商平台和抖音外卖的连接&#xff0c;从而优化运营效率。例…

Java SE——*API API帮助文档

1. API概述 Java中的API可以理解为一本编程字典或者工具包&#xff0c;它包含了许多预定义的类、接口和方法&#xff0c;可以帮助我们更方便地开发Java程序 想象一下&#xff0c;当你要做一个饭菜的时候&#xff0c;你需要食谱和厨具。食谱告诉你需要哪些食材和步骤&#xff…

解决 VS2022 关于 c++17 报错: C2131 表达式必须含有常量值

使用 VS2022 编译 ORB-SLAM3 加载Vocabulary 二进制ORBvoc.bin 时&#xff0c;在 DBOW2 里修改 TemplatedVocabulary.h 代码显示这样的错误&#xff1a; 编译器错误 C2131 表达式的计算结果不是常数 定位到我的代码中&#xff1a; char buf [size_node] ; 原因 &#xff1a; …

基于GATK流程化进行SNP calling

在进行变异检测时&#xff0c;以群体基因组重测序数据为例&#xff0c;涉及到的个体基本都是上百个&#xff0c;而其中大多数流程均是重复的步骤。 本文将基于GATK进行SNP calling的流程写入循环&#xff0c;便于批量分析。 1 涉及变量 1.工作目录work_dir/ 2.参考基因组ref…

SMART PLC数值积分器功能块(矩形+梯形积分法完整源代码)

PLC的数值积分器算法也可以参考下面文章链接: PLC算法系列之数值积分器(Integrator)-CSDN博客文章浏览阅读1.5k次,点赞3次,收藏3次。数值积分和微分在工程上的重要意义不用多说,闭环控制的PID控制器就是积分和微分信号的应用。流量累加也会用到。有关积分运算在流量累加上…

助力安全生产--韩施电气为您提供电动机保护及电机故障解决方

上海韩施电气自成立于2008年&#xff0c;是一家专门从事销售电气自动化设备、电力设备、机电设备的综合型贸易公司&#xff0c;公司自成立以来一直专注于EOCR产品的推广销售和技术服务&#xff0c;成为韩国施耐德EOCR在国内的总代理&#xff0c;并授予代理证书&#xff0c;我们…

uni-app:前端实现心跳机制(全局)+局部页面控制心跳暂停和重新心跳

一、App.vue全局中写入心跳 在data中定义变量heartbeatTimer&#xff0c;便于暂停心跳使用在onLaunch中引用开始心跳的方法startHeartbeat()写入开始心跳方法写入暂停心跳方法写入请求后端刷心跳机制 定义变量 // 在全局设置的心跳机制中添加一个变量来保存定时器的标识 data(…

云计算行业敲门砖—证书盘点

未来10年&#xff0c;都会是云计算技术不断发展变革的时代&#xff0c;这其中会产生非常多的就业机会。有数据统计&#xff0c;未来五年&#xff0c;云计算行业人才缺口达150万&#xff0c;选对了行业&#xff0c;你就成功了一半。 云计算可以考的证书还是很多的&#xff0c;很…

React中StrictMode严格模式,导致开发环境,接口会请求两次或多次( useEffect 请求多次)

问题描述&#xff1a; 我在用 create-react-app时&#xff0c;开发环境&#xff0c;一进页面接口会请求两次或多次。 我在首页 useEffect里 请求一个接口&#xff0c;整个页面就在这里请求这一次接口。但 实际上请求了两次。我检查了代码&#xff0c;确定只调用了一次&#xf…

本地部署 Qwen-14B-Chat

本地部署 Qwen-14B-Chat 1. Qwen-14B 概述2. Github 地址3. 创建虚拟环境4. 安装依赖项5. 快速使用6. 启动 web 演示7. 访问 Qwen 1. Qwen-14B 概述 通义千问-14B&#xff08;Qwen-14B&#xff09; 是阿里云研发的通义千问大模型系列的140亿参数规模的模型。Qwen-14B是基于Tra…

快速上手 TypeScript

什么是TypeScript TypeScript 简称 TS &#xff0c;既是一门新语言&#xff0c;也是 JS 的一个超集&#xff0c;它是在 JavaScript 的基础上增加了一套类型系统&#xff0c;它支持所有的 JS 语句&#xff0c;为工程化开发而生&#xff0c;最终在编译的时候去掉类型和特有的语法…

一些损失函数的学习

CrossEntropy loss 交叉熵是用来衡量两个概率分布之间的差异性或不相似性的度量交叉熵定义为两个概率分布p和q之间的度量。其中&#xff0c;p通常是真实分布&#xff0c;而q是模型预测的分布 交叉熵还等于信息熵 相对熵 这里&#xff0c;x遍历所有可能的事件&#xff0c;p(x)…

从0开始学习JavaScript--JavaScript中的集合类

JavaScript中的集合类是处理数据的关键&#xff0c;涵盖了数组、Set、Map等多种数据结构。本文将深入研究这些集合类的创建、操作&#xff0c;以及实际应用场景&#xff0c;并通过丰富的示例代码&#xff0c;帮助大家更全面地了解和应用这些概念。 数组&#xff08;Array&…

grafana面板介绍

grafana 快速使用 背景 随着公司业务的不断发展&#xff0c;紧接来的是业务种类的增加、服务器数量的增长、网络环境的越发复杂以及发布更加频繁&#xff0c;从而不可避免地带来了线上事故的增多&#xff0c;因此需要对服务器到应用的全方位监控&#xff0c;提前预警&#xf…

在回调之间共享数据

可以在 App 中为 UI 组件编写回调函数&#xff0c;以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中&#xff0c;回调函数通常必须访问主 App 函数中定义的数据&#xff0c;或与其他回调函数共享数据。例如&#xff0c;如果创建一个具有列表框的 App&a…