TS+Cesium配置

记录一下 TS + Cesium 配置过程

首先 npm 安装 cesium 和 webpack 一众包,如下:

{
  // package.json   
  "dependencies": {
    "@babel/preset-env": "^7.20.2",
    "@open-wc/webpack-import-meta-loader": "^0.4.7",
    "babel-loader": "^9.1.2",
    "cesium": "^1.101.0",
    "clean-webpack-plugin": "^4.0.0",
    "copy-webpack-plugin": "^11.0.0",
    "css-loader": "^6.7.3",
    "html-webpack-plugin": "^5.5.0",
    "node-polyfill-webpack-plugin": "^2.0.1",
    "style-loader": "^3.3.1",
    "ts-loader": "^9.4.2",
    "webpack-cli": "^5.0.1",
    "webpack-dev-server": "^4.11.1"
  }
}

tsconfig

{
    "compilerOptions": {
      "module": "es2015",
      "target": "es2015",
      "strict": true,   // 严格模式
      "noEmitOnError": true,  // 错误禁止打包
      "moduleResolution": "node"  // 配置了才能找node_modules
    }
}

webpack.config.js

webpack 配置文件根据自己的需求添加loader即可,但 copy-webpack-plugin 非常重要,因为 cesium 库的结构有点怪,直接引入有点问题

注意,因为我的 node_modules 在根目录外层,并非根目录,所以在 path.resolve 中添加了 "../",常规来讲不需要这个,若出现了 unable to locate 'XXX' glob 这个错误,大概率就是 from 里的目录错了

const path = require("path")
const webpack = require("webpack")
const CopyWebpackPlugin = require("copy-webpack-plugin")
const HtmlWebpackPlugin = require("html-webpack-plugin")
// 重新编译自动清空build文件夹
const {CleanWebpackPlugin} = require("clean-webpack-plugin")

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

module.exports = {
    entry: "./index.ts",
    output: {
        path: path.resolve(__dirname, "build"),
        filename: "bundle.js",
        environment:{
            // 是否允许webpack使用箭头函数(为了兼容IE)
            arrowFunction: true,
        }
    },
    module:{
        rules:[
            {
                test:/\.ts$/,
                use: [
                    {
                        // 当配置项复杂时可用{}
                        // 指定加载器
                        loader:"babel-loader",
                        // 设置预定义的环境
                        options:{
                            // 设置预定义的环境
                            presets:[
                                [
                                    // 指定环境插件
                                    "@babel/preset-env",
                                    // 配置信息
                                    {
                                        // 要兼容的目标浏览器
                                        targets:{
                                            "chrome":"88",
                                            "ie":"11"
                                        },
                                        // 指定corejs版本
                                        "corejs":"3",
                                        // 使用corejs的方式为"usage",表示按需加载
                                        "useBuiltIns": "usage"
                                    }
                                ]
                            ]
                        }
                    },
                    "ts-loader"
                ],
                // 排除node-modules中的ts
                exclude:/node-modules/
            },
            {
                test: /\.js$/,
                use: {
                    loader: '@open-wc/webpack-import-meta-loader',
                },
            },
            {
                test:/\.css$/,
                use:[
                    "style-loader",
                    "css-loader"
                ]
            }
        ]
    },
    plugins:[
        new HtmlWebpackPlugin({
            template: "./index.html"
        }),
        new CleanWebpackPlugin(),
        new CopyWebpackPlugin({
            patterns:[
                {
                    from: path.resolve("../", cesiumSource, cesiumWorkers),
                    to: "Workers"
                },
                {
                    from: path.resolve("../", cesiumSource, "Assets"),
                    to: "Assets"
                },
                {
                    from: path.resolve("../", cesiumSource, "Widgets"),
                    to: "Widgets"
                },
                {
                    from: path.resolve("../", cesiumSource, "ThirdParty/Workers"),
                    to: "ThirdParty/Workers",
                }
            ]
        }),
        new webpack.DefinePlugin({
            CESIUM_BASE_URL: JSON.stringify("./"),
        })
    ],
    // 用来设置引用模块
    resolve:{
        // ts,js文件都可以设置为引用模块
        extensions:[".ts", ".js"],
    },

}

接下来还可能有个错误,Module not found: Error: Can't resolve 'zlib' in 'XXX' 

BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default.

This is no longer the case. Verify if you need this module and configure a polyfill for it.

If you want to include a polyfill, you need to:

      - add a fallback 'resolve.fallback: { "zlib": require.resolve("browserify-zlib") }' - install 'browserify-zlib'

If you don't want to include a polyfill, you can use an empty module like this:

      resolve.fallback: { "zlib": false }

错误大概是上述的样子,报错原因是由于在 webpack5 中移除了 nodejs 核心模块的 polyfill 自动引入,所以需要手动引入:

所以只需,安装:

npm install node-polyfill-webpack-plugin -d

配置:

...
const NodePolyfillPlugin = require('node-polyfill-webpack-plugin')
...

module.exports = {
    ...
    plugins:[
        ...
        // 引入 polyfill
        new NodePolyfillPlugin()    
        ...
    ],
    ...
}

此时 index.ts 中引入 cesium 就不会报错了

import * as Cesium from "cesium"
import "cesium/Build/Cesium/Widgets/widgets.css"

// 初始化地球
let viewer = new Cesium.Viewer('MapContainer', {
    ...
});
(viewer.cesiumWidget.creditContainer as HTMLElement).style.display = "none";

posted @ 2023-01-09 23:35  邢韬  阅读(562)  评论(0编辑  收藏  举报