用于浏览器的捆绑传单

Bundle Leaflet for use in Browser

我想使用 leaflet 在简单的本地网站上加载自定义地图。

目前我正在使用 Node Js、Express、EJS(作为模板引擎),但我似乎无法使用传单。我也尝试过使用 browserify 并导入 bundle.js 脚本,但仍然没有成功。

知道我该怎么做吗?

//map.js

var map = L.map("map-panel");

var osmUrl = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var osmAttrib = 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors';
var mapLayer = new L.TileLayer(osmUrl, {minZoom: 8, maxZoom: 20, attribution: osmAttrib });

map.addLayer(mapLayer).fitWorld();
//map.setView([location.lat, location.lon], 13);
<!DOCTYPE>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title>Map</title>
    <link rel="stylesheet" type="text/css" href="css/style.css"/>
    <link rel="stylesheet" href="./../node_modules/leaflet/dist/leaflet.css" />
</head> 

<body>
<div id="map-panel">
</div>
   <!--    <script src="bundle.js"></script> -->
    <script src="/js/map_panel.js"></script>
</body>
</html>

根据导入,我在 app.js 或 map.js 中都尝试过 var L = require('leaflet');

或者在控制器中 var L = require('leaflet');

我曾经遇到过这个 ReferenceError: L is not defined。该行是指第一个js行。

现在我尝试使用 browserify,但出现 "window is not defined" 错误。 我试图按照本教程进行操作 http://mappingandco.com/blog/leaflet-with-browserify-basic-tutorial/

感谢您的帮助或建议!

您不能 require() 浏览器中的任何本机内容,但 Browserify 或 Webpack 可以让您将模块捆绑到您的代码中,因此它可以 运行 在浏览器中。

您应该使用 require 语句编写 JavaScript 代码,然后 构建 它以生成 JavaScript 您使用 HTML 传送到浏览器。每次更改代码时,都需要重新构建,或者在项目中添加 watcher 并让观察者 运行 重新构建。重要的是要了解 HTML 调用的是 bundle.js 而不是 app.js。您在上面发布的代码尚未捆绑,因此无法使用。

此外,您在上面发布的代码似乎并没有真正向地图添加任何可见的东西,除了缩放控件。

使用教程代码,我在下面发布了一个工作示例:

目录结构

project
  node_modules/
  app.js
  package.json
  index.html
  dist/
    bundle.js
    style.css

package.json

{
  "name": "leaf",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "browserify app.js -o dist/bundle.js"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "browserify": "^16.2.0"
  },
  "dependencies": {
    "jquery": "^3.3.1",
    "leaflet": "^1.3.1"
  }
}

app.js

// require modules
var L = require('leaflet');
var $ = require('jquery');
// Create the map
var map = L.map('map').setView([41.3921, 2.1705], 13);

// Indicate leaflet the specific location of the images folder that it needs to render the page
L.Icon.Default.imagePath = 'node_modules/leaflet/dist/images/'

// Use OpenStreetMap tiles and attribution
var osmTiles = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var attribution = '© OpenStreetMap contributors';

// Create the basemap and add it to the map
L.tileLayer(osmTiles, {
  maxZoom: 18,
  attribution: attribution
}).addTo(map);

// Add some geojson from this URL
var geojsonURL = 'http://mappingandco.github.io/geojsonDB/barcelona/neighbourhoods.geojson'

$.getJSON(geojsonURL, function(neighbourhoods) {
  L.geoJson(neighbourhoods, {
    onEachFeature: function (feature, layer) {
      layer.bindPopup(feature.properties.NBarri);
    }
  }).addTo(map);
});

index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Leaflet with browserify template</title>
    <link rel="stylesheet" href="node_modules/leaflet/dist/leaflet.css" />
    <link rel="stylesheet" href="dist/style.css">
</head>
<body>
<div id="map"></div>
    <script src="dist/bundle.js" charset="utf-8"></script>
</body>
</html>

安装和构建

npm install
npm run build

然后在浏览器中打开 index.html 文件,您应该会看到一张地图。