Turf.js представляет собой модульную библиотеку для геопространственных вычислений в JavaScript-экосистеме. Она распространяется как набор независимых функций, которые подключаются по отдельности или целиком, в зависимости от выбранного способа интеграции.
Наиболее распространённый способ подключения в современных JavaScript-проектах основан на пакетных менеджерах Node.js. Библиотека публикуется в npm-реестре и устанавливается стандартной командой:
npm install @turf/turf
После установки пакет становится доступен в
node_modules, а зависимости автоматически фиксируются в
package.json.
Использование в коде:
import * as turf from "@turf/turf";
const point = turf.point([30.5, 50.5]);
const buffered = turf.buffer(point, 10, { units: "kilometers" });
Такой способ подключения загружает весь набор функций библиотеки. Это удобно на этапе разработки или при небольших проектах, где размер бандла не является критичным фактором.
Архитектура Turf.js основана на принципе tree-shaking: каждая геофункция существует как отдельный пакет. Это позволяет подключать только необходимые части.
Пример установки конкретной функции:
npm install @turf/buffer
Использование:
import buffer from "@turf/buffer";
import point from "@turf/point";
const center = point([10, 10]);
const area = buffer(center, 5, { units: "miles" });
Такой подход уменьшает итоговый размер сборки и повышает производительность в браузерных приложениях.
Для использования в браузере без сборщика доступна загрузка через CDN. Подключение осуществляется через глобальный объект:
<script src="https://cdn.jsdelivr.net/npm/@turf/turf@latest/turf.min.js"></script>
После загрузки библиотека становится доступна через глобальную переменную:
const point = turf.point([40, 55]);
const distance = turf.distance(
turf.point([40, 55]),
turf.point([41, 56]),
{ units: "kilometers" }
);
CDN-вариант сохраняет простоту интеграции, но не предоставляет механизмов оптимизации размера бандла.
В современных фронтенд-стеков (Vite, Snowpack, Webpack, Rollup) предпочтительным считается использование ES Modules.
import distance from "@turf/distance";
import point from "@turf/point";
const from = point([0, 0]);
const to = point([1, 1]);
const result = distance(from, to, { units: "kilometers" });
Сборщики автоматически выполняют tree-shaking, исключая неиспользуемый код.
В проектах, использующих Node.js без ESM, применяется CommonJS-синтаксис:
const turf = require("@turf/turf");
const pt = turf.point([12, 14]);
const area = turf.circle(pt, 10, { units: "kilometers" });
Несмотря на поддержку, такой подход постепенно уступает место ES Modules, особенно в новых проектах.
При работе с Webpack или аналогичными сборщиками важно учитывать оптимизацию импорта. Полная загрузка пакета может приводить к избыточному размеру итогового файла.
Пример конфигурации:
import centroid from "@turf/centroid";
import polygon from "@turf/helpers";
const poly = polygon([
[
[0, 0],
[10, 0],
[10, 10],
[0, 10],
[0, 0]
]
]);
const center = centroid(poly);
В таких конфигурациях сборщик анализирует зависимости и исключает неиспользуемые части библиотеки.
Turf.js включает встроенную поддержку TypeScript-типов, что позволяет использовать строгую типизацию без дополнительных пакетов.
Пример:
import point from "@turf/point";
import { Feature, Point } from "geojson";
const p: Feature<Point> = point([25, 60]);
Типы обеспечивают контроль структуры GeoJSON-объектов и снижают вероятность ошибок при работе с координатами.
В серверных приложениях Turf.js используется для геообработки данных, анализа расстояний, построения зон и обработки GeoJSON.
import bbox from "@turf/bbox";
import polygon from "@turf/helpers";
const poly = polygon([
[
[0, 0],
[20, 0],
[20, 20],
[0, 20],
[0, 0]
]
]);
const bounds = bbox(poly);
Node.js не требует дополнительных настроек, так как Turf.js не зависит от DOM или браузерных API.
Каждая функция Turf.js реализована как чистая функция без состояния. Это влияет на способ подключения:
Такой дизайн позволяет гибко комбинировать функциональность.
Экосистема построена вокруг пакета @turf/turf, который
агрегирует отдельные модули:
@turf/helpers — создание GeoJSON-объектов@turf/buffer — построение буферных зон@turf/distance — вычисление расстояний@turf/area — расчёт площади@turf/intersect — пересечение геометрийКаждый модуль имеет минимальные зависимости и может использоваться независимо.
В монорепозиториях (Nx, Turborepo, Lerna) Turf.js устанавливается на уровне отдельных пакетов или корневого workspace.
Пример структуры:
packages/
map-app/
geo-service/
node_modules/
В каждом пакете могут использоваться разные наборы Turf-функций, что снижает избыточность зависимостей.
При работе с большими картографическими приложениями критичным становится размер итогового бандла. Использование точечных импортов позволяет уменьшить нагрузку:
import simplify from "@turf/simplify";
В отличие от:
import * as turf from "@turf/turf";
Первый вариант предпочтителен в production-сборках.
Turf.js развивается как набор независимых пакетов с синхронизированными версиями. При обновлении важно учитывать:
Несовпадение версий отдельных пакетов может привести к расхождениям в результатах геоопераций.
Механизм подключения Turf.js строится вокруг трёх основных сценариев:
Каждый сценарий соответствует разным уровням контроля над производительностью, размером кода и архитектурой приложения.