Hvordan bruker jeg MapLibre-GL fra TypeScript?
Jeg prøver å vise et MapLibre-kart på en enkel nettside ved å bruke TypeScript.
Eksemplet på MapLibre-nettstedet bruker JavaScript, jeg vil gjøre det samme i TypeScript.
Her er min index.html:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel='stylesheet' href='https://unpkg.com/[email /dist/maplibre-gl.css' />
<script src='https://unpkg.com/[email /dist/maplibre-gl.js'></script>
<script defer src="script.js"></script>
<style>
body {
margin: 0;
padding: 0;
}
html, body, #map {
height: 100%;
}
</style>
</head>
<body>
<div id="map"></div>
<script>var exports = {};</script>
</body>
</html>Her er min script.ts:
import MapLibreGL from 'maplibre-gl';
const map = new MapLibreGL.Map({
container: 'map', // container id
style: 'https://demotiles.maplibre.org/style.json', // style URL
center: [0, 0], // starting position [lng, lat]
zoom: 1 // starting zoom
});Her er min tsconfig.json:
{
"compilerOptions": {
"noImplicitAny": false,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"target": "es5",
"esModuleInterop": true
},
"exclude": [
"node_modules"
]
}Jeg får følgende feil i nettleserkonsollvinduet:
'Uopptatt ReferenceError: require er ikke definert ved script.ts:1:1' :
Jeg bruker Visual Studio Pro 2022. Jeg har også prøvd det i VSCode med lignende resultater.
Kan noen identifisere hva jeg gjør feil?
Finnes det et eksempel på nettet som viser hvordan man gjør det? Jeg har ikke klart å finne ett.
Svar #1
Problemet er relatert til de forskjellige modulsystemene som brukes i JavaScript
Min begrensede erfaring med ts betyr at tsconfig.json kan være utilstrekkelig. Hvis du bruker ESM, er det to ekstra uttalelser som trengs.
{
"compilerOptions": {
"moduleResolution": "Node",
"module": "ESNext",
// to build it successfully
"target": "es2015",
}
}
Jeg prøvde å bygge TS-filen med mål ES5, men det fungerte ikke med den nyeste maplibre-gl.js. Jeg endret målet til ES2015.
Feilen som er nevnt skyldes at TSC bygger JS-filen i CommonJS-standarden som standard. Nettleseren kan ikke håndtere det. Bruk ESM i stedet, som støttes av moderne nettlesere.
Det finnes 3 måter å løse dette på. Metode 3 er den beste.
Bruk referansen til
maplibre-glFjern
import MapLibreGL from 'maplibre-gl';iscript.tsog endre det til:/// <reference types="maplibre-gl" />Dette vil kun referere til typen av
maplibre-glfra modulen som er installert inode_modules, i stedet for å importere koden.Siden koden allerede er lastet av skript-tagger i HTML, er det ikke nødvendig å importere eller kreve koden til
maplibre-glpå nytt.
- Konverter
CommonJS-standarden til et format som nettleseren kan akseptere. Bruk Browserify:
- Konverter
Installer Browserify med
npm:npm install -g browserify
Kjør Browserify for å fjerne
require-setningen:browserify script.js -o script.jsBrowserify vil legge til de nødvendige bibliotekene i filen.
Fjern skriptimport-taggen.
<script src='https://unpkg.com/[email /dist/maplibre-gl.js'></script>
Bruk en modulbundler, som for eksempel Vite eller Webpack.
Dette bruker ESM-standarden, så sørg for at skript-tagen som importerer
script.jsbør endres og at en attributt type bør legges til og settes til "module".<script defer src="script.js" type="module"></script>Og fjern:
<script src='https://unpkg.com/[email /dist/maplibre-gl.js'></script>Merk: For Vite støttes det å importere en TypeScript.
<script defer src="script.ts" type="module"></script>For mer informasjon, vennligst se på nettsiden til det valgte verktøyet.
