以下部分为cesium官方文档翻译,文档地址 cesium安装官方文档
增加CesiumJS到一个webpack app中
安装CesiumJS
从npm安装cesium模块,并添加到package.json中
npm install --save-dev cesium
在webpack中配置CesiumJS
CesiumJS是一个一个庞大且复杂的库。除了JavaScript模块之外,它也包含一些像CSS,image和json文件等静态资源。它包含一些web开发者文件(web worker files)在单线程内执行密集运算。由于使用库的方式多种多样,CesiumJS没有定义入口点,这点上CesiumJS和传统的npm模块不同。我们在webpack里面使用它时,需要进行一些额外配置一些选项。
首先要定义CesiumJS的位置,本教程使用源代码,因此webpack可以包含单个模块并跟踪依赖。或者你可以使用CesiumJS的built版(已压缩或未压缩版),但是这些模块已经合并和压缩,灵活性更小。
在webpack.config.js头部增加:
// The path to the CesiumJS source code// CesiumJS源代码路径const cesiumSource = 'node_modules/cesium/Source';const cesiumWorkers = '../Build/Cesium/Workers';
增加如下选项到配置文件中,用来处理webpack如何编译CesiumJS的一些怪癖。
output: {filename: '[name].js',path: path.resolve(__dirname, 'dist'),// Needed to compile multiline strings in CesiumsourcePrefix: ''},amd: {// Enable webpack-friendly use of require in CesiumtoUrlUndefined: true},node: {// Resolve node module use of fsfs: 'empty'},
output.sourcePrefix: '',覆盖webpack的默认设置,即在每行之前添加\t制表符。CesiumJS有一些多行字符串,因此需要使用空前缀来覆盖此默认值。amd.toUrlUndefined: true告诉CesiumJS,用于评估require语句的AMD Webpack版本与标准的toUrl函数不兼容。node.fs: 'empty'解决了fs模块的某些第三方用法,该模块旨在在Node环境中而非浏览器中使用。
增加cesium别名,以便在代码中引用
resolve: {alias: {// CesiumJS module namecesium: path.resolve(__dirname, cesiumSource)}},
管理CesiumJS静态文件
最后,确保静态CesiumJS资产,widget和Web worker file已正确提供和加载。在构建过程中,使用copy-webpack-plugin将静态文件复制到dist目录。
npm install --save-dev copy-webpack-plugin
在webpack.config.js顶部引用
const CopywebpackPlugin = require('copy-webpack-plugin');
增加插件如下插件
plugins: [new HtmlWebpackPlugin({template: 'src/index.html'}),// Copy Cesium Assets, Widgets, and Workers to a static directorynew 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' } ])],
添加后可以复制Assets和Widgets目录以及构建的Web Worker脚本。
定义一个环境变量,该变量告诉CesiumJS使用webpack DefinePlugin加载静态文件的基本URL。plugins数组将如下所示:
plugins: [new HtmlWebpackPlugin({template: 'src/index.html'}),// Copy Cesium Assets, Widgets, and Workers to a static directorynew 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 webpack.DefinePlugin({// Define relative base path in cesium for loading assetsCESIUM_BASE_URL: JSON.stringify('')})],
引入CesiumJS 模块到项目中
我们可以通过几种方法在我们的应用程序中要求CesiumJS模块。您可以使用CommonJS语法或ES6 import语句。您可以导入整个CesiumJS库,也可以只需要所需的特定模块。包含模块将导致webpack仅编译包中的那些模块及其依赖性,而不编译整个库。
CommonJS style require
全体引入
var Cesium = require('cesium/Cesium');var viewer = new Cesium.Viewer('cesiumContainer');
按需引入
var Color = require('cesium/Core/Color');var color = Color.fromRandom();
ES6 style import
全体引入
import Cesium from 'cesium/Cesium';var viewer = new Cesium.Viewer('cesiumContainer');
按需引入
import Color from 'cesium/core/Color';var color = Color.fromRandom();
Requiring asset files
webpack的基本原理是将每个文件都视为一个模块。这使得导入asset与包括JavaScript一样。我们告诉webpack如何使用加载器加载配置文件中的每种类型的文件,因此我们只需要调用require即可。
require('cesium/Widgets/widgets.css');
Hello world!
创建一个新文件, src/css/main.css ,为项目添加样式
html, body, #cesiumContainer {width: 100%;height: 100%;margin: 0;padding: 0;overflow: hidden;}
在index.html中给CesiumJS Viewer 创建一个div
<div id="cesiumContainer"></div>
创建viewer
var viewer = new Cesium.Viewer('cesiumContainer');
运行 npm start 在浏览器中查看Viewer
高级Webpack配置
可以通过多种方式利用webpack提高性能表现,降低打包尺寸并执行其他复杂构建步骤,在这里,我们将讨论一些与使用CesiumJS库有关的配置选项。
我们可以在webpack.release.config.js的示例存储库中找到最佳生产Cesium Webpack构建的配置。
代码拆分
默认情况下,webpack将CesiumJS与我们的应用程序打包在同一个chunk中,这回导致打包出来的文件很大。我们可以将CesiumJS拆分成自己的bundle,并使用CommonChunksPlugin改善我们的应用程序性能。如果最终在项目中创建了多个chunk,它们都可以引用一个公共的cesium chunk。
将插件添加到webpack.config.js文件中,并指定用于分解CesiumJS模块的规则:
plugins: [new webpack.optimize.CommonsChunkPlugin({name: 'cesium',minChunks: module => module.context && module.context.indexOf('cesium') !== -1})]
启用source map
开启source map后,webpack可以将错误追踪到原始内容。他们提供或多或少的详细调试信息,以换取编译速度。我们建议使用’eval’选项。
devtool: 'eval'
移除警告
CesiumJS源代码中存在开发人员错误和警告,这些错误和警告已从我们的压缩版中删除。由于没有内置的Webpack方式可以删除这些警告,因此我们将使用strip-pragma-loader。
npm install strip-pragma-loader --save-dev
将加载程序包含在module.rules中,并将debug设置为false:
rules: [{// Strip cesium pragmastest: /\.js$/,enforce: 'pre',include: path.resolve(__dirname, cesiumSource),use: [{loader: 'strip-pragma-loader',options: {pragmas: {debug: false}}}]}]
压缩和最小化
统一和最小化代码可在生产中减小文件大小,对于发布版本,CesiumJS会最小化JavaScript文件并减少CSS文件。使用 uglifyjs-webpack-plugin 来压缩CesiumJS资源。
npm install uglifyjs-webpack-plugin --save-dev
在配置文件中引用
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
添加到插件列表中
plugins: [new webpack.optimize.UglifyJsPlugin()]
使用css-loader上的最小化选项来最小化CSS。
module: {rules: [{test: /\.css$/,use: ['style-loader',{loader: 'css-loader',options: {// minify loaded cssminimize: true}}]}]}
资源列表
- 官方的 cesium-webpack-example存储库包含最小的webpack配置,本教程中介绍的hello world代码以及有关可选代码配置的说明。
- 有关要包含在新应用程序中的CesiumJS功能的浏览,请参阅 Cesium Workshop Tutorial。
- 浏览Sandcastle中的演示,并查看CesiumJS Documentation。
- 要了解有关webpack的更多信息,请查看webpack Concepts或深入阅读 Documentation。
