@here/maps-api-for-javascript在Next.js中报错Unexpected token 'export'如何解决
问题原因
该报错的核心是
@here/maps-api-for-javascript发布的是纯ES模块格式代码,而Next.js默认不会对node_modules下的第三方包做ES语法转译,服务端渲染阶段Node.js直接加载未转译的ES模块时,就会识别不了export语法抛出错误。
解决方案
方案1:配置Next.js转译指定第三方包
Next.js 13+ 提供了transpilePackages配置项,可以指定需要转译的node_modules包:
- 打开项目根目录的
next.config.js文件,添加配置:
/** @type {import('next').NextConfig} */ const nextConfig = { transpilePackages: ['@here/maps-api-for-javascript'], // 其他原有配置保留 } module.exports = nextConfig
- 重启开发服务即可生效。
方案2:仅在客户端侧加载该包
HERE Maps API是纯浏览器端运行的库,不需要参与服务端渲染,你可以选择两种客户端加载方式避开服务端解析报错:
方式A:动态导入组件禁用SSR
import dynamic from 'next/dynamic' // 单独把地图逻辑封装为组件,动态引入时关闭SSR const MapComponent = dynamic(() => import('./components/Map'), { ssr: false, loading: () => <p>地图加载中</p> }) // 页面中直接使用<MapComponent />即可
方式B:useEffect中异步导入
import { useEffect } from 'react' export default function MapPage() { useEffect(() => { const loadMap = async () => { const H = (await import('@here/maps-api-for-javascript')).default // 此处写初始化地图的逻辑,仅在客户端执行 } loadMap() }, []) return <div id="map-container" style={{ width: '100%', height: '600px' }}></div> }
方案3:降级使用UMD格式引入(可选)
如果前两种方案都不生效,可以直接把HERE Maps的UMD格式SDK通过script标签引入到pages/_document.js或者app/layout.js中,直接通过全局变量H调用即可,不用安装npm包,也不会有模块解析问题。
内容的提问来源于stack exchange,提问作者Prashanth shane
相关产品推荐
相关产品推荐

