React-Leaflet 与 Gatsby
React-Leaflet with Gatsby
我在尝试修复 React-Leaflet
/ Leaflet
期望 window 被定义并导致 Gatsby 构建 npm run build
失败时遇到问题。
错误信息:
WebpackError: window is not defined
- leaflet-src.js:230
~/leaflet/dist/leaflet-src.js:230:1
- leaflet-src.js:7 version
~/leaflet/dist/leaflet-src.js:7:1
- leaflet-src.js:10 Object.exports.__esModule
~/leaflet/dist/leaflet-src.js:10:2
- AttributionControl.js:5 Object.<anonymous>
~/react-leaflet/lib/AttributionControl.js:5:1
- index.js:26 Object.exports.__esModule
~/react-leaflet/lib/index.js:26:1
- map.js:2 Object.exports.__esModule
src/pages/map.js:2:1
Gatsby 文档列出了一些可能的场景或解决方案。 https://www.gatsbyjs.org/docs/debugging-html-builds/#fixing-third-party-modules
因此,通过尝试按照列出的示例,我尝试添加 gatsby-node.js
盖茨比-node.js
exports.modifyWebpackConfig = ({ config, stage }) => {
if (stage === 'build-html') {
config.loader('null', {
test: /react-leaflet/,
loader: 'null-loader',
})
}
}
test: /leaflet/
和 test: /react-leaflet/
But that spits out a WebpackError: Minified React error #130
如果能帮助我消除这些构建错误,我将不胜感激。
非常感谢。
步骤和代码
$ gatsby new leaflet
$ cd leaflet && npm install
- 安装包和依赖项
$ npm install react-leaflet leaflet react react-dom
- 已创建
src/pages/map.js
- 复制/粘贴 https://github.com/PaulLeCam/react-leaflet/blob/master/example/components/simple.js
中的简单示例
map.js
import React, { Component } from 'react'
import { Map, TileLayer, Marker, Popup } from 'react-leaflet'
export default class SimpleExample extends Component {
state = {
lat: 51.505,
lng: -0.09,
zoom: 13,
}
render() {
const position = [this.state.lat, this.state.lng]
return (
<Map center={position} zoom={this.state.zoom}>
<TileLayer
attribution="&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors"
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={position}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</Map>
)
}
}
我会使用您拥有的 modifyWebpackConfig 代码。缩小错误是因为现在 react-leaflet
是一个空模块,当它尝试使用 react-leaflet 组件构建任何页面时,它会导致错误。您必须将您的地图包裹在支票中以查看 window 是否可用。这样它将在服务器端渲染中被跳过。
在 React 中它看起来像这样。
render() {
if (typeof window !== 'undefined') {
return (
<Map {...options}>
</Map>
)
}
return null
}
根据 2019 年 10 月的 Gatsby 版本提醒未来的读者; API 与 OP 版本相比有一些变化。
盖茨比-node.js
exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => {
if (stage === 'build-html') {
actions.setWebpackConfig({
module: {
rules: [
{
test: /react-leaflet|leaflet/,
use: loaders.null(),
},
],
},
})
}
}
我在尝试修复 React-Leaflet
/ Leaflet
期望 window 被定义并导致 Gatsby 构建 npm run build
失败时遇到问题。
错误信息:
WebpackError: window is not defined
- leaflet-src.js:230
~/leaflet/dist/leaflet-src.js:230:1
- leaflet-src.js:7 version
~/leaflet/dist/leaflet-src.js:7:1
- leaflet-src.js:10 Object.exports.__esModule
~/leaflet/dist/leaflet-src.js:10:2
- AttributionControl.js:5 Object.<anonymous>
~/react-leaflet/lib/AttributionControl.js:5:1
- index.js:26 Object.exports.__esModule
~/react-leaflet/lib/index.js:26:1
- map.js:2 Object.exports.__esModule
src/pages/map.js:2:1
Gatsby 文档列出了一些可能的场景或解决方案。 https://www.gatsbyjs.org/docs/debugging-html-builds/#fixing-third-party-modules
因此,通过尝试按照列出的示例,我尝试添加 gatsby-node.js
盖茨比-node.js
exports.modifyWebpackConfig = ({ config, stage }) => {
if (stage === 'build-html') {
config.loader('null', {
test: /react-leaflet/,
loader: 'null-loader',
})
}
}
test: /leaflet/
和 test: /react-leaflet/
But that spits out a WebpackError: Minified React error #130
如果能帮助我消除这些构建错误,我将不胜感激。
非常感谢。
步骤和代码
$ gatsby new leaflet
$ cd leaflet && npm install
- 安装包和依赖项
$ npm install react-leaflet leaflet react react-dom
- 已创建
src/pages/map.js
- 复制/粘贴 https://github.com/PaulLeCam/react-leaflet/blob/master/example/components/simple.js 中的简单示例
map.js
import React, { Component } from 'react'
import { Map, TileLayer, Marker, Popup } from 'react-leaflet'
export default class SimpleExample extends Component {
state = {
lat: 51.505,
lng: -0.09,
zoom: 13,
}
render() {
const position = [this.state.lat, this.state.lng]
return (
<Map center={position} zoom={this.state.zoom}>
<TileLayer
attribution="&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors"
url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
/>
<Marker position={position}>
<Popup>
A pretty CSS3 popup. <br /> Easily customizable.
</Popup>
</Marker>
</Map>
)
}
}
我会使用您拥有的 modifyWebpackConfig 代码。缩小错误是因为现在 react-leaflet
是一个空模块,当它尝试使用 react-leaflet 组件构建任何页面时,它会导致错误。您必须将您的地图包裹在支票中以查看 window 是否可用。这样它将在服务器端渲染中被跳过。
在 React 中它看起来像这样。
render() {
if (typeof window !== 'undefined') {
return (
<Map {...options}>
</Map>
)
}
return null
}
根据 2019 年 10 月的 Gatsby 版本提醒未来的读者; API 与 OP 版本相比有一些变化。
盖茨比-node.js
exports.onCreateWebpackConfig = ({ stage, loaders, actions }) => {
if (stage === 'build-html') {
actions.setWebpackConfig({
module: {
rules: [
{
test: /react-leaflet|leaflet/,
use: loaders.null(),
},
],
},
})
}
}