【问题标题】:how can i solve ESLint error that 'no-unused-var' with google map我如何使用谷歌地图解决“no-unused-var”的 ESLint 错误
【发布时间】:2019-06-01 07:53:45
【问题描述】:

我认为这是一个简单的问题,但我无法解决它
我在脚本顶部输入了/* export myMap *//* global myMap */,但错误仍在继续

代码

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);
}

当我编写如上所示的代码时,我看到了以下错误

错误 ESLint 'myMap' 已定义但从未使用过。 (没有未使用的变量)
错误 ESLint 'google' 未定义。 (无非定义)
错误 ESLint 'map' 被赋值但从未使用过。 (没有未使用的变量)
错误 ESLint 'google' 未定义。 (无非定义)

但是 google API 使用 'google', 'map' 而我使用 'myMap' 。毫无疑问
请帮助初学者。谢谢

附言我不想用/* eslint-disable no-unused-vars */解决

【问题讨论】:

  • 可以去掉new前面的var map = 解决map is assigned a value but never used.问题
  • 或者只是 return map 或者如果你想要更多可测试的函数 return !!map 所以它只返回布尔值
  • 但是,您也可以将忽略评论 /* eslint-disable-next-line */ 和 no-undef 例如。 /*global describe, it, expect*/
  • 如何解析“google”和“myMap”?
  • 如果myMap 用于单独的文件或脚本标签中,那么您必须导出myMap 以便linter 知道它将在其他地方使用。如果你不使用任何捆绑器/模块系统,那么你需要写window.myMap = myMap

标签: javascript html


【解决方案1】:

要消除错误消息,您必须告诉 linter google 是一个外部变量,并且您需要告诉 linter 您计划在外部使用 myMap。由于您以后不使用map,您可以删除var map =

linter 真的很笨,只能验证它当前 lints 的文件内的一致性,它无法验证在另一个文件/脚本中使用的函数,也无法验证变量是否来自其他地方。

最简单的方法是使用global 选项告诉linter google 是在其他地方定义的,然后写入window.myMap = myMap,这样您就可以将myMap 显式分配给全局对象window(对于给定的代码,它并没有真正改变任何东西,因为 myMap 已经在全局范围内定义),并告诉 linter 预计它会在该脚本之外的其他地方使用。

linter 无法验证 myMap 它确实在其他地方使用并且必须在那里信任你。

/* 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;

但是,如果您不使用 webpack 或 rollup 之类的模块捆绑器,而没有使用 commonjs、amd 或原生 es6 模块之类的模块,那么您应该始终将您的代码包装到 IIFE 中,以确保减少对全局范围的污染尽可能:

(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;
}())

这里window.myMap = myMap 确实具有使该功能可用于其他脚本的目的。

而不是写/* global google */,你可以做window.myMap = myMap的逆操作,但这只有在脚本以正确的顺序加载时才有效,以便谷歌地图脚本在你的脚本执行之前设置goolge

(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;
}())

现在您的语法非常接近 AMD 模块(如在 nodejs 或 webpack 中使用)的外观,如果您计划将来切换到捆绑器,它会更容易:

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;

【讨论】:

  • (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; }()) 当我使用此代码时,我看不到我的谷歌地图。为什么?
  • 最后一个代码块正在工作,但第三个代码块不工作。
  • @JaeseungLee 更新了文本,第三个代码块只有在脚本以正确的顺序加载并且 google 的脚本足够早地初始化全局变量 google 时才能工作。
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 2019-12-22
  • 2019-07-06
  • 2017-06-26
  • 2015-08-27
  • 2021-03-21
  • 2021-05-16
  • 2020-11-26
相关资源
最近更新 更多