Как использовать Webpack с Google Maps API?

я использую Webpack + html-webpack-плагин для создания всех моих статических файлов. Дело в том, что когда я использую его с Google Maps API, он не работает.

у меня есть этот код:

var map;
function initMap() {
  map = new google.maps.Map(document.getElementById('map'), {
    center: {lat: -34.397, lng: 150.644},
    zoom: 6
  });
  // the other code, irrelevant
}

и HTML-файл:

<!doctype html>
<html>
<head>
</head>
<body>
  <div id="map"></div>
  <script async="async" defer="defer"
      src="https://maps.googleapis.com/maps/api/js?key=<token here>&callback=initMap">
    </script>
   <script src="script.js"></script>
</body>
</html>

если я запускаю только этот файл, все работает нормально. Но если я запускаю это, webpack жалуется на "initMap не является функцией". Я заглянул внутрь вывода, и кажется, что initMap объявлен не как глобальная функция, а как функция внутри модуля или что-то в этом роде, так что, возможно, это проблема.

как использовать Google Maps API с webpack? Я знаю, что могу связать некоторые libs с моим сценарием, например react, должен ли я сделать то же самое? Каким должен быть подход?

UPD: вот мой веб-пакет.конфиг.js:

/* eslint-disable */
const path = require('path')
const fs = require('fs')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')

const nodeModules = {}
fs.readdirSync('node_modules')
  .filter(function(x) {
    return ['.bin'].indexOf(x) === -1
  })
  .forEach(function(mod) {
    nodeModules[mod] = 'commonjs ' + mod
  })

const htmlMinifierObj = {
  collapseWhitespace: true,
  removeComments: true
}

module.exports = [
// the first object compiles backend, I didn't post it since it's unrelated
{
 name: 'clientside, output to ./public',
 entry: {
   script: [path.join(__dirname, 'clientside', 'script.js')]
 },
 output: {
   path: path.join(__dirname, 'public'),
   filename: '[name].js'
 },
 module: {
   loaders: [
     {
       test: /.js$/,
       loader: 'babel',
       query: { presets:['es2015', 'stage-0'] }
     }
   ],
 },
 plugins: [
   //new webpack.optimize.UglifyJsPlugin({minimize: true}),
   new HtmlWebpackPlugin({
     template: 'clientside/index.html',
     inject: 'body',
     chunks: ['script'],
     minify: htmlMinifierObj
   })
 ],
}]

и выходной HTML (я удалил импорт script.js из моего исходного файла, потому что он добавлен webpack и отключил минимизацию, только для читаемость):

<!doctype html>
<html>
<head>
</head>
<body>
  <a href="/login/facebook">Login</a>
  <div id="map"></div>
  <script async defer
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCGSgj5Ts10UdapzUnWlr34NS5cuoBj7Wg&callback=initMap">
    </script>
<script type="text/javascript" src="script.js"></script></body>
</html>

1 ответов


в скрипте.js

после объявления функции добавьте функцию в глобальную область, например:

function initMap() {
    // Some stuff
}
window.initMap = initMap;