如何修复错误“无法编译:./node_modules/@react-leaflet/core/esm/path.js 10:41 模块解析失败:意外的令牌(10:41)”

87

我正在尝试创建一个使用React-TypeScriptLeaflet的应用程序。我使用了以下命令安装依赖项:

npm install leaflet react-leaflet @types/react @types/leaflet --save

但是当我启动应用程序时,它显示:

    ./node_modules/@react-leaflet/core/esm/path.js 10:41
Module parse failed: Unexpected token (10:41)
File was processed with these loaders:
 * ./node_modules/babel-loader/lib/index.js
You may need an additional loader to handle the result of these loaders.
|   useEffect(function updatePathOptions() {
|     if (props.pathOptions !== optionsRef.current) {
>       const options = props.pathOptions ?? {};
|       element.instance.setStyle(options);
|       optionsRef.current = options;

这是我的package.json文件

{
  "name": "aq-monitor",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^5.12.0",
    "@testing-library/react": "^11.2.7",
    "@testing-library/user-event": "^12.8.3",
    "@types/jest": "^26.0.23",
    "@types/leaflet": "^1.7.0",
    "@types/node": "^12.20.13",
    "@types/react": "^17.0.5",
    "@types/react-dom": "^17.0.5",
    "antd": "^4.15.5",
    "leaflet": "^1.7.1",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-leaflet": "^3.2.0",
    "react-router-dom": "^5.2.0",
    "react-scripts": "4.0.3",
    "typescript": "^4.2.4",
    "web-vitals": "^1.1.2"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  },
  "devDependencies": {
    "@types/react-router-dom": "^5.1.7"
  }
}

这里是map/index.tsx

import React from 'react';
import './styles.css';
import L, { LatLngExpression } from "leaflet";
import "leaflet/dist/leaflet.css";
import {MapContainer, TileLayer, Marker, Popup} from 'react-leaflet';

const position : LatLngExpression = [59.91174337077401, 10.750425582038146];

export default function MapJar() {
    return (
        <MapContainer center={position} zoom={13} scrollWheelZoom={false}>
            <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>
        </MapContainer>
    );
};

我尝试了多次重新安装依赖项,但仍然无法正常工作。

我知道这是一个简单的问题和我所犯的错误,但是,我一直没有能够解决这个错误。


1
这似乎是CRA的一个未解决问题。另一方面,@react-leaflet/core模块具有ES2019的tsconfig目标,这意味着当构建包时,??运算符应该已被转译为其他内容。我认为应该在react-leaflet存储库上开启一个问题,指出该行似乎没有按照tsconfig规定正确编译为ES2019。 - Seth Lutske
2
谢谢@SethLutske!我在几个小时前发现了完全相同的问题,链接如下:https://github.com/PaulLeCam/react-leaflet/issues/877 - Gimhan Wijayawardana
18个回答

1

对于那些正在运行Next.js的人。

你可以通过在next.config.js文件中启用Webpack 5来解决这个问题。

const nextConfig = {
  future: {
    webpack5: true,
  },
};

module.exports = nextConfig;

感谢marcin-piechaczek的评论: Nullish coalescing operator makes package incompatible with webpack 4 #883

我在将react-leaflet升级到版本3.2.0以修复从地图中删除带有永久工具提示的标记时出现的错误后,遇到了这个错误。


1
快速修复,对于一个Next.js项目来说做得很好。谢谢! - Seth Lutske

0

我在使用react-leaflet 3.2.0版本时遇到了同样的问题。之前的回答解决了我的问题,但为了澄清,我想添加一些细节:

"browserslist":
[
  ">0.2%",
  "not dead",
  "not op_mini all"
],

请注意:上述的 package.json 代码需要精确,这意味着在您删除后,上述代码中没有任何 { }。
"development": [
  "last 1 chrome version",
  "last 1 firefox version",
  "last 1 safari version"
]

来自:

"browserslist": {
"production": [
  ">0.2%",
  "not dead",
  "not op_mini all"
],
"development": [
  "last 1 chrome version",
  "last 1 firefox version",
  "last 1 safari version"
]},

另外,在终端中键入 cd,后跟 ls,以查看是否有任何 package.json 文件和 node_modules。如果有,请使用 rm -rf filename 命令将它们删除(因为您可能会在未正确导航到项目并错误地使用 npm i或yarn 命令时,不小心添加它们)。

最后,重新安装 react-leaflet 库,然后应该可以正常工作。(注意:在重新安装到最新版本之后,请检查您的 package.json 是否已更新到3.2.0(或最新版本)。如果没有,请手动将其更改为最新安装的react-leaflet版本。)


0

您需要更新react-scripts以解决package.json文件中的问题:

"react-scripts": "^5.0.0",

0

在文件package.json中安装这些模块:

    "leaflet": "^1.6.0",
    "react-leaflet": "^3.2.0",

然后在任何文件夹中使用cmd删除您系统中node_modules文件夹中的@react-leaflet文件夹。

git clone https://github.com/hqdung99/maps-leaflet-youtube.git

完成后,进入文件夹 node_modules,将此文件夹 @react-leaflet 复制并粘贴到之前的 node_modules 文件夹中。

0

针对使用Next.js的用户

在组件中创建一个地图,并使用ssr:false;进行导入。

例如:

组件:Map.js

const OpenMap = () => {
  return (
    <div className="container">
      <MapContainer MapContainer style={{ height: '300px' }} center={[60.198334, 24.934541]} zoom={10}>
        <TileLayer
          attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
          url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png"
        />
      </MapContainer>
    </div>
  );
};

将地图导入到页面或需要的位置,可以像这样:

文件 Somewhere.js

import dynamic from 'next/dynamic'; // for dynamic importing
const OpenMap = dynamic(() => import('@/features/client/location/components/OpenMap'), {
  ssr: false,
});

然后你就可以使用它了...

另外,如果需要的话,你也可以添加一个加载组件。

有关动态导入的更多详细信息,请点击这里查看链接。


0
将"@types/leaflet": "1.7.0"添加到package.json的依赖项中。

-1
降级到"react-leaflet":"2.7.0"。

3
这是其他人在此处提供的完全相同的答案。这根本不是解决此问题的方法。引用@kboul的原话:“降级到以前的版本并不是解决特定问题的方法,特别是对于那些在大型项目中使用库且在两个版本(2.x和3.x)之间存在重大更改的人来说。那么你该怎么办?重新从头编写所有代码吗?”问题既与react-leaflet在其构建过程中编译的方式有关,也与CRA处理“??”运算符的方式有关。 - Seth Lutske
2
它还会引起更深层次的问题,react-leaflet 3与react-leaflet 2完全不同。 - Guven Degirmenci

-3

我在使用最新版本的leaflet("^3.2.0")时遇到了同样的问题,但是我通过降级到2.7.0版本来解决了这个问题。以下是你需要做的:

  • 删除node_modules文件夹
  • 删除'package-lock.json'
  • 在"package.json"中更改leaflet和react-leaflet的版本为:"react-leaflet": "^2.7.0" 和 "leaflet": "^1.6.0"
  • 运行"npm install"
  • 在2.7.0版本中,MapContainer组件未定义,因此应该使用Map。
  • 为组件添加一些样式(长度),以便查看地图。

2
降级到以前的版本并不是解决特定问题的方法,尤其是对于那些在大型项目中使用库且两个版本(2.x和3.x)之间存在重大变化的人。那么你会怎么做呢?重新从头编写所有代码吗? - kboul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接