webpack使用及如何搭建cesium三維地球環(huán)境
Cesium介紹
CesiumJS是目前主流的一款三維地圖框架,是一個跨平臺、跨瀏覽器的展示三維地球和地圖的JavaScript庫,通過WebGL技術(shù)實現(xiàn)圖形的硬件加速,不需要任何插件支持。
Cesium提供了很多服務(wù),下面是最主要的一些:
- 支持全球級別的高精度的地形和影像服務(wù)
- 支持
2D、2.5D、3D
形式的地圖展示 - 可以繪制各種幾何圖形、高亮區(qū)域,支持導(dǎo)入圖片,甚至3D模型等多種數(shù)據(jù)可視化展示
- 可用于動態(tài)數(shù)據(jù)可視化并提供良好的觸摸支持,支持絕大多數(shù)的瀏覽器和mobile
- 支持基于時間軸的動態(tài)數(shù)據(jù)可視化展示
本文就來分享一下如何搭建Cesium的環(huán)境。
初始化一個Cesium地球
最簡單的方式就是從官網(wǎng)下載Cesium包,然后引入其中的cesium.js和widgets.css即可。
下載Cesium源碼包
官網(wǎng)下載地址:https://cesium.com/downloads/
下載完解壓后會發(fā)現(xiàn)有很多文件,如下圖所示:
其實只需要 Build
下面的 Cesium
這個文件夾,它是編譯后 Cesium 包的正式版本。
搭建環(huán)境
新建一個index.html文件,然后引入其中的cesium.js和widgets.css。
Build/Cesium目錄
Cesium.js:定義了Cesium對象
Build/Cesium/Widgets目錄
widgets.css:默認的Cesium CSS樣式文件
創(chuàng)建一個 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服務(wù)器上的,所以直接打開index.html是無效的,可以使用http-server服務(wù)器搭建一個簡單的服務(wù),全局安裝http-server,如下:
npm install -g http-server
項目根目錄下運行http-server開啟服務(wù)
此時,在瀏覽器輸入http://127.0.0.1:8080即可看到一個3D的地球:
是不是很簡單,不過接下來才是本文的重點。
Webpack的使用
近年來Web應(yīng)用變得越來越復(fù)雜與龐大,通過直接編寫JavaScript、CSS、HTML開發(fā)Web應(yīng)用的方式早已無法應(yīng)對當(dāng)前Web應(yīng)用的發(fā)展。于是就出現(xiàn)了一系列的構(gòu)建工具,如Gulp、Rollup等,溝構(gòu)建其實是工程化、自動化思想在前端開發(fā)中的體現(xiàn),將一系列流程用代碼去實現(xiàn),讓代碼自動化地執(zhí)行諸如代碼轉(zhuǎn)化、文件壓縮等一系列復(fù)雜地流程。
Webpack是目前最流行的前端構(gòu)建工具。在webpack里一切皆模塊,一個模塊對應(yīng)一個文件。通過分析模塊間的依賴關(guān)系,在其內(nèi)部構(gòu)建出一個依賴圖,最終編繹輸出模塊為 HTML、JavaScript、CSS 以及各種靜態(tài)文件(圖片、字體等),讓我們的開發(fā)過程更加高效。
日常開發(fā)者中,我們常常使用vue-cli
腳手架來構(gòu)建項目,其實也是對Webpack的封裝,為了更好地熟悉Webpack的配置,本文就使用Webpack來一步步地搭建Cesium環(huán)境。
Webpack搭建Web應(yīng)用
初始化項目
創(chuàng)建一個文件夾webpack-cesium,執(zhí)行npm init命令,初始化npm:
npm init
接著可以一路回車下去,就會發(fā)現(xiàn) package.json 文件已經(jīng)創(chuàng)建好了,如下所示:
{ "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下創(chuàng)建一個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,設(shè)置一個快捷方式
{ ... "scripts": { "build": "webpack ./src/index.js" }, ... }
執(zhí)行npm run build:
npm run build
此時可以看到,生成了一個dist目錄以及目錄下的main.js文件,說明已經(jīng)打包成功。
使用配置文件
上面例子使用的是webpack的默認配置,但是大多數(shù)項目會需要很復(fù)雜的設(shè)置,所以需要使用配置文件來進行更加豐富的自定義配置。
配置之前,我們需要知道,Webpack有幾大核心概念:
- Entry:入口,webpack執(zhí)行構(gòu)建的第一步從Entry開始,即webpack從哪個文件開始打包。
- Output:輸出,指示 webpack 打包完的文件輸出到哪里去,如何命名等 。
- Loader:加載器,webpack 本身只能處理 js、json 等資源,其他資源需要借助loader,webpack 才能解析。
- Plugins:插件,擴展webpack的功能。
- mode:模式,主要分為development開發(fā)模式和production生產(chǎn)模式。
下面開始配置。
首先創(chuàng)建webpack.config.js配置文件,代碼結(jié)構(gòu)如下:
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 當(dāng)前文件的文件夾絕對路徑,即輸出到根目錄下的dist目錄
path: path.resolve(__dirname, "dist"),
},
...
// 模式
mode: "development",//開發(fā)模式
};
上述配置即代表將src/index.js 作為入口點,會將打包后的結(jié)果輸出到dist目錄下的app.js。
修改npm script命令:
{ ... "scripts": { "build": "webpack --config webpack.config.js" }, ... }
再次執(zhí)行 npm run build
會發(fā)現(xiàn)生成了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為模板創(chuàng)建文件,新的html文件有兩個特點:1. 內(nèi)容和源文件一致 2. 自動引入打包生成的js等資源 template: "src/index.html", }), ], ... };
再次執(zhí)行npm run build,會發(fā)現(xiàn)dist目錄下生成了index.html和app.js文件。
并且index.html中已經(jīng)自動將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 = { ... // 開發(fā)服務(wù)器 devServer: { host: "localhost", // 啟動服務(wù)器域名 port: "3000", // 啟動服務(wù)器端口號 open: true, // 是否自動打開瀏覽器 hot: true, // 開啟HMR }, ... };
添加一個可以直接運行 dev server 的 script:
{ ... "scripts": { "build": "webpack --config webpack.config.js", "start": "webpack serve --config webpack.config.js --open" }, ... }
現(xiàn)在,在命令行中運行 npm start
,會看到瀏覽器自動加載頁面,并且如果修改代碼web server 將在編譯代碼后自動重新加載。
注意:當(dāng)使用開發(fā)服務(wù)器時,所有代碼都會在內(nèi)存中編譯打包,并不會輸出到 dist 目錄下。
管理資源
webpack 本身只能處理 js、json 等資源,其他資源如css樣式資源需要借助相應(yīng)loader。
安裝css-loader和style-loader:
npm i css-loader style-loader -D
css-loader
:負責(zé)將 css 文件編譯成 Webpack 能識別的模塊style-loader
:會動態(tài)創(chuàng)建一個 style 標簽,里面放置 Webpack 中 css 模塊內(nèi)容
配置loader,loader 有兩個屬性:test
屬性(識別出哪些文件會被轉(zhuǎn)換)和use
屬性(定義出在進行轉(zhuǎn)換時,應(yīng)該使用哪個 loader)。
const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { ... // 加載器 module: { rules: [ { // 只對 .css 結(jié)尾的文件進行相應(yīng)處理 test: /\.css$/, // use數(shù)組中Loader執(zhí)行順序是從右到左,需確保style-loader在前,css-loader在后 use: ["style-loader", "css-loader"], }, ], }, ... };
以上配置,相當(dāng)于告訴 webpack 編譯器(compiler) :當(dāng)碰到 require()
/import
語句中被解析為 '.css 的路徑時,在對它打包之前,先use(使用) style-loader
和css-loader 轉(zhuǎn)換一下。
當(dāng)然,還有許多其他資源如圖片、字體等,這里就不再進行配置。
集成Cesium
經(jīng)過上述操作,webpack已經(jīng)搭建好了一個基本的Web應(yīng)用,接下來就是添加Cesium。
安裝CesiumJS
npm i -D cesium
定義Cesium路徑
與傳統(tǒng)的 npm 模塊不同,Cesium沒有定義入口點,因為庫的使用方式多種多樣,所以需要定義Cesium的路徑。在webpack.config.js頂部添加如下代碼:
const cesiumSource = 'node_modules/cesium/Source'; const cesiumWorkers = '../Build/Cesium/Workers';
管理Cesium靜態(tài)文件
Cesium是一個龐大而復(fù)雜的庫,除了 JavaScript 模塊之外,它還包括靜態(tài)資源,例如CSS、圖像和 json 文件,還包括 Web Worker 文件,用于在單獨的線程中執(zhí)行密集計算,需要額外配置來確保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(""), }), ], ... };
上述配置做了兩件事:
- 將Assets、Widgets以及Web Worker文件復(fù)制到打包后的資源輸出目錄dist下。
- 定義一個環(huán)境變量,告訴Cesium使用webpack加載靜態(tài)文件的基本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");
執(zhí)行npm start,即可在瀏覽器看到初始化的三維地球。
踩坑
本文使用的是webpack5,webpack5 升級后默認是不支持polyfill的,編譯時會報錯。
polyfill即“墊片”的意思,當(dāng)新的api在舊版瀏覽器中不可用時,可以使用polyfill來填充這些缺失的功能。Webpack5之后,官方認為自動引入Polyfill會導(dǎo)致bundle體積過大,并且大多數(shù)情況下這些自動引入的Polyfill是沒有用到的,所以Webpack5需要我們手動引入Polyfill。
解決方法就是根據(jù)報錯內(nèi)容按需添加相應(yīng)配置:
module.exports = { ... resolve: { // 這里直接禁用相應(yīng)模塊 fallback: { https: false, zlib: false, http: false, url: false }, }, ... };
resolve.fallback指定了當(dāng)目標構(gòu)建環(huán)境中不存在對應(yīng)的包時,將使用fallback的值作為回退。
總結(jié)
本文主要介紹了Cesium以及Webpack的使用,如何將Cesium一步步地集成到Webpack中。
到此這篇關(guān)于webpack快速上手之搭建cesium三維地球環(huán)境的文章就介紹到這了,更多相關(guān)webpack 搭建cesium三維地球環(huán)境內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序使用wx.request請求服務(wù)器json數(shù)據(jù)并渲染到頁面操作示例
這篇文章主要介紹了微信小程序使用wx.request請求服務(wù)器json數(shù)據(jù)并渲染到頁面操作,結(jié)合實例形式分析了微信小程序使用wx.request發(fā)送網(wǎng)絡(luò)請求及返回結(jié)果渲染到wxml界面相關(guān)操作技巧,需要的朋友可以參考下2019-03-03JavaScript性能優(yōu)化 創(chuàng)建文檔碎片(document.createDocumentFragment)
講這個方法之前,我們應(yīng)該先了解下插入節(jié)點時瀏覽器會做什么。2010-07-07JavaScript最全公共方法匯總并解析(前端開發(fā)收藏必備)
JavaScript掌握各種常用的公共方法更是提升開發(fā)效率和代碼質(zhì)量的關(guān)鍵,無論你是初學(xué)者還是資深開發(fā)者,了解并熟練運用這些方法都能讓你的代碼更加簡潔、高效,本篇博客將為你詳細匯總并解析最全的JavaScript公共方法,涵蓋數(shù)組、對象、字符串、日期等各個方面的常用技巧2024-06-06Bootstrap組件學(xué)習(xí)之導(dǎo)航、標簽、面包屑導(dǎo)航(精品)
這篇文章主要介紹了Bootstrap組件學(xué)習(xí)之導(dǎo)航、標簽、面包屑導(dǎo)航(精品)的相關(guān)資料,需要的朋友可以參考下2016-05-05