Next.js动态导入节点模块

Sel*_*one 4 javascript next.js

使用react-leaflet节点模块时出现窗口未定义的错误,因为它依赖于窗口,并且SSR当然不支持窗口。我发现了next / dynamic,但是,我发现的所有示例都显示了如何导入组件而不是节点模块。是否可以包含节点模块?举个例子,这就是我要导入的内容,它给出了窗口未定义的错误import { Map, TileLayer, Marker } from 'react-leaflet';

Wil*_* P. 13

通过动态导入获取命名导出的更好方法是执行以下操作:

const NamedExport = dynamic(() => import('package-name').then((module) => module.NamedExport));
Run Code Online (Sandbox Code Playgroud)

注意:这会将完整的包分块'package-name',然后简单地提取命名的导出。如果您能够像接受的示例一样进入模块包,那可能会更好,因为它可能会为您提供更小的块。

  • 如果上帝允许我早点找到你的评论而不是我为为什么这段代码不起作用而伤透脑筋就好了 (4认同)
  • 好像不是包的?https://github.com/vercel/next.js/discussions/13417#discussioncomment-18924 (3认同)

iur*_*rii 5

问题是next.js动态导入在命名导出上失败

查看react-leaflet源代码,我可以看到可以从特定文件访问每个命名的导出,例如import Map from 'react-leaflet/lib/Map'

结合使用动态导入而不使用SSR

const Map = dynamic(() => import('react-leaflet/lib/Map'), {
  ssr: false
});
Run Code Online (Sandbox Code Playgroud)

这应该对您有用。

  • 这不是适用于每个模块的解决方案。next 不以任何方式支持它吗?这是一个关键特征。 (2认同)
  • 获取命名导出的更好方法是“dynamic(() => import('package-name').then((module) => module.NamedExport))” (2认同)