You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Next.js中使用html2canvas报错“不是函数”,如何正确调用?

解决Next.js中html2canvas导入后报错"html2canvas is not a function"的问题

我之前在Next.js里用html2canvas的时候也踩过这个坑!问题出在dynamic导入默认导出模块的方式上:html2canvas本身是默认导出的函数,但直接用dynamic(() => import('html2canvas'))拿到的是模块的命名空间对象,不是直接可调用的函数,所以才会抛出"不是函数"的错误。

正确的导入方式

你需要在dynamic的导入回调里明确获取模块的default导出,这样拿到的才是可以直接调用的html2canvas核心函数:

import dynamic from 'next/dynamic';

// 重点:通过.then(mod => mod.default)提取默认导出
const html2canvas = dynamic(() => import('html2canvas').then(mod => mod.default), {
  ssr: false,
});

完整使用示例

另外要注意,html2canvas是纯客户端操作,必须等DOM渲染完成后再调用,比如通过点击事件或者useEffect触发:

import dynamic from 'next/dynamic';
import { useEffect } from 'react';

const html2canvas = dynamic(() => import('html2canvas').then(mod => mod.default), {
  ssr: false,
});

export default function ScreenshotComponent() {
  const takeScreenshot = async () => {
    try {
      // 调用html2canvas生成截图
      const canvas = await html2canvas(document.body);
      // 将生成的canvas添加到页面中
      document.body.appendChild(canvas);
    } catch (err) {
      console.error('截图出错啦:', err);
    }
  };

  // 可选:组件挂载完成后自动触发截图
  useEffect(() => {
    takeScreenshot();
  }, []);

  return (
    <div>
      <h1>测试截图页面</h1>
      <button onClick={takeScreenshot}>点击生成截图</button>
    </div>
  );
}

补充:如果坚持原导入方式的替代写法

如果你不想修改导入逻辑,也可以在调用时通过default属性拿到函数:

// 原导入代码
const html2canvas = dynamic(() => import('html2canvas'),{ssr:false})

// 调用时需加.default
html2canvas.default(document.body).then(function(canvas) {
  document.body.appendChild(canvas);
});

不过显然第一种直接提取默认导出的写法更简洁直观。

内容的提问来源于stack exchange,提问作者Gilbish Kosma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:01:04