javascript - 没有模块的缩小 OpenLayers
问题描述
使用 openlayers 时,我使用普通的 JS(无模块)分布,使用
<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.9.0/build/ol.js">
或 ol.js 的本地副本,并在我的本地浏览器中随意调试。
当一切都在使用像这样的声明时
var map = new ol.Map({ ...});
var mySource = new ol.source.Vector();
etc ...
我希望能够构建一个比 ol.js 更小的 custom-ol.js,其中包含我使用的内容。
我尝试了不同的方法,但没有取得很大成功。在 Node 中安装一个开发环境,使用一个简单的 main.js 导入我需要的东西似乎是一个很好的解决方案:
import {Map, View} from 'ol';
import Vector from 'ol/layer/Vector';
...
但是,当按照https://openlayers.org/en/latest/doc/tutorials/bundle.html中的说明使用节点构建时,使用提供的众多选项(Vite、Webpack、RollUp 等),我面临一个这两个问题中:
- 要么 custom-ol.js 构建为模块,本地开发不再可能
- 或者 custom-ol.js 被构建为一个普通的 JS 文件,没有模块,但我不能像 ol.source.Vector() 这样的语法工作
我还尝试使用“npm run build-legacy”从源代码构建 Openlayers,但是尝试错误猜测要排除哪个源代码很麻烦。
我真的很想念一个很好的教程来手动构建一个最小的自定义 Openlayers 库,同时保留 ol.xxx.yyy 样式的声明。
解决方案
我休息了一段时间,并且阅读了一些关于 Javascript 的非常好的文章。然而,在开发小型网站时使用模块对我来说仍然有点矫枉过正,至少目前是这样。
所以这是我为获得一个更小的 ol.js 库所做的:
- 分叉OpenLayers
- 安装依赖项
npm install
- 构建 index.js
npm run build-index
- 编辑
./build/index.js
以评论不必要的导出
//~ import $ol$source$Raster from './ol/source/Raster.js';
import $ol$source$Source from './ol/source/Source.js';
//~ import $ol$source$Stamen from './ol/source/Stamen.js';
import $ol$source$Tile from './ol/source/Tile.js';
...
//~ ol.source.Raster = $ol$source$Raster;
//~ ol.source.Raster.Processor = _ol_source_Raster$Processor;
//~ ol.source.Raster.RasterSourceEvent = _ol_source_Raster$RasterSourceEvent;
//~ ol.source.Raster.newImageData = _ol_source_Raster$newImageData;
ol.source.Source = $ol$source$Source;
//~ ol.source.Stamen = $ol$source$Stamen;
ol.source.Tile = $ol$source$Tile;
...
这有点乏味,但很有效。
- 构建遗留的 ol.js 平面文件
npx webpack --config config/webpack-config-legacy-build.mjs && npx cleancss --source-map src/ol/ol.css -o build/legacy/ol.css
通过仅删除我不使用的格式和源,以及矢量切片和 webgl,ol.js
从 1.2MB 减少到 540kB。
推荐阅读
- sql - 调用用户定义函数
- button - 带有标题栏(和按钮)的 PyGame 全屏
- ubuntu-16.04 - 为什么控制台中的节点名称与 .launch 文件中的不同?
- postgresql - 从 PostGIS 点获取纬度/经度
- python - 如何将“对话”输出流式传输到标准输出?
- reactjs - 如何设置 react-admin Datagrid 的标题?
- html - 为什么最后一个 li 项目出现在父容器之外?
- swift - 如何在 SwiftUI 列表中显示领域结果?
- visible - anylogic 如何设置端口在上层可见 false
- html - 如何在不显示空格的情况下使用 CSS 在 HTML 中对齐元素(部分与标题)