javascript - kako mogu riješiti ESLint grešku 'no-unused-var' s Google kartom


MISLIM DA JE TO JEDNOSTAVAN PROBLEM, ALI GA NE MOGU RIJEŠITI
Unio sam /* export myMap */ ili /* global myMap */ na vrh skripte, ali se pogreške nastavljaju

Kod

HTML

<h1>My First Google Map</h1>
<div id="googleMap" style="width:60%;height:600px;margin: auto;"></div>
<script src="https://maps.googleapis.com/maps/api/js? key=YOUR_KEY&callback=myMap"></script>

JavaScript

function myMap() {
    var mapProp= {
        center:new google.maps.LatLng(37.540881, 127.079689),
        zoom:17,
    };
    var map = new google.maps.Map(document.getElementById("googleMap"),mapProp);
}

Kada sam napisao kod kao što je prikazano gore, vidio sam sljedeću grešku

Greška ESLint 'myMap' je definirana, ali nikada nije korištena. (no-unused-vars)
Greška ESLint 'google' nije definiran. (no-undef)
Greška ESLint 'map' je dodijeljena vrijednost, ali nikada nije korištena. (no-unused-vars)
Greška ESLint 'google' nije definiran. (no-undef)

ali Google API koristi 'google', 'map', a ja koristim 'myMap'. nema sumnje
molim pomoć za početnika. hvala

p.s. Ne želim rješavati s /* eslint-disable no-unused-vars */

Odgovor #1

Da biste se riješili poruka o pogreškama, morate reći svom linteru da je google vanjska varijabla, i morate reći linteru da planirate koristiti myMap izvana. A budući da kasnije ne koristite map, jednostavno možete ukloniti var map =.

Linter je stvarno glup i može provjeriti samo konzistentnost unutar datoteke koju trenutno analizira, ne može provjeriti upotrebu funkcije u drugoj datoteci/skripti i ne može provjeriti da li varijabla potječe od negdje drugdje.

Najjednostavniji pristup bio bi koristiti opciju global kako biste linteru rekli da je google definiran negdje drugdje, te napisati window.myMap=myMap, na taj način eksplicitno dodjeljujete myMap globalnom objektu window (što za dati kod zapravo ne mijenja ništa jer je myMap već definiran globalno) i linteru govori da se očekuje da se koristi negdje drugdje izvan tog skripta.

Linter ne može provjeriti da li se myMap zaista koristi negdje drugdje i mora vam vjerovati u tome.

/* global google */

function myMap() {
  var mapProp = {
    center: new google.maps.LatLng(37.540881, 127.079689),
    zoom: 17,
  };
  new google.maps.Map(document.getElementById("googleMap"), mapProp);
}

window.myMap = myMap;

Ali ako ne koristite modul bundler poput webpacka ili rollupa i ništa poput commonjs, amd ili nativenih es6 modula, tada biste uvijek trebali omotati svoj kod u IIFE kako biste osigurali da što je moguće manje onečišćavate globalni opseg:

(function() {
  /* global google */

  function myMap() {
    var mapProp = {
      center: new google.maps.LatLng(37.540881, 127.079689),
      zoom: 17,
    };
    new google.maps.Map(document.getElementById("googleMap"), mapProp);
  }

  window.myMap = myMap;
}())

I ovdje window.myMap=myMap zapravo ima svrhu učiniti funkciju dostupnom za druge skripte.

Umjesto pisanja /* global google */ možete napraviti suprotno od window.myMap=myMap, ali ovo će raditi samo ako su skripte učitane u ispravnom redoslijedu tako da skripte Google Maps postave google prije nego što se vaša skripta izvrši:

(function() {
  var google = window.google;

  function myMap() {
    var mapProp = {
      center: new google.maps.LatLng(37.540881, 127.079689),
      zoom: 17,
    };
    new google.maps.Map(document.getElementById("googleMap"), mapProp);
  }

  window.myMap = myMap;
}())

Sada imate sintaksu koja je stvarno bliska izgledu AMD modula (kao što se koristi u nodejs-u ili webpack-u), i to bi olakšalo ako planirate preći na bundler u budućnosti:

var google = require('google');

function myMap() {
  var mapProp = {
    center: new google.maps.LatLng(37.540881, 127.079689),
    zoom: 17,
  };
  new google.maps.Map(document.getElementById("googleMap"), mapProp);
}

exports.myMap = myMap;