【问题标题】:ReactJS Library being used in NextJS project says is not a constructorNextJS 项目中使用的 ReactJS 库说不是构造函数
【发布时间】:2022-01-25 20:35:25
【问题描述】:

我已经构建了一个 ReactJS 库并将其发布到 NPM 并且在标准 ReactJS 项目中运行良好,但是我现在有一个 NextJS 并且我正在尝试将它添加到那里,我希望它可以正常工作,因为 NextJS 是一个带有一些附加功能的 ReactJS 顶部。

在 app.js 我有以下内容:

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

function MyApp({ Component, pageProps }) {

    const {CrashCatch, CrashCatchProvider} = dynamic(import('crashcatchlib-reactjs'), { ssr: false })

    let crash_catch = new CrashCatch();

    crash_catch.initialiseCrashCatch("12978650", "d7kqcewvshoyxbp564f8tm0zl", "1.0.1");

    return (
       ....
    ) 
}

运行时我得到TypeError: CrashCatch is not a constructor

我尝试不使用动态导入并以import {CrashCatch, CrashCatchProvider} from "crashcatchlib-reactjs"; 进行标准导入,但随后出现错误SyntaxError: Cannot use import statement outside a module]

reactjs 库的源代码是开源的,因此可以在 GitHub 上的 https://github.com/Crash-Catch/CrashCatchLib-ReactJS 上找到它。 index.js 有 CrashCatch 类,它有构造函数,所以不知道为什么 NextJS 会以不同的方式对待它。

【问题讨论】:

  • 您的构建过程可能无法解释动态import 语法,因此它不包含在可运行包中
  • 我没有构建我的 reactjs 库,因为它只是一个简单的 JS 文件,所以我认为它不需要构建 - 我很可能被误认为是我创建的第一个库。是否有标准 JS/ReactJS 库的构建过程(我知道 Typescript 项目需要一个运行 tsc 的构建过程)
  • 尝试在 HOC 内部初始化它?
  • 这是否回答了您的问题:Import ES module in Next.js ERR_REQUIRE_ESM?尝试在您图书馆的package.json 中添加"type": "module"。或者,使用 next-transpile-modules 在 Next.js 应用程序中转译库。
  • 谢谢,最近几天有点忙,希望几天后能收到。什么是 HOC?

标签: javascript reactjs next.js server-side-rendering


【解决方案1】:

NextJS 在服务器端执行代码,因此您的库也应该与 Node.js 兼容。 CommonJS 似乎不支持导入,这是 Node 使用的默认模块格式。但是,您可以指定应将您的库视为 ES 模块以支持 import 语句,如文档https://nodejs.org/api/esm.html#enabling中所述

Node.js 默认将 JavaScript 代码视为 CommonJS 模块。作者可以通过 .mjs 文件扩展名、package.json“type”字段或 --input-type 标志告诉 Node.js 将 JavaScript 代码视为 ECMAScript 模块。有关详细信息,请参阅模块:包。

您可以尝试在 package.json 中将 type 属性设置为 module

【讨论】:

  • 谢谢,最近几天有点忙,希望过几天能收到。
  • 谢谢你成功了。
【解决方案2】:
  • 我从未使用过crashcatchlib-reactjs 库。我检查了文档无法理解他们如何导入它。但是要解决这个错误:

    SyntaxError: Cannot use import statement outside a module]
    

安装https://www.npmjs.com/package/next-transpile-modules。如果您查看文档,请在next.config.js

// next.config.js
const withTM = require('next-transpile-modules')(['crashcatchlib-reactjs']); 
module.exports = withTM({});
  • 如果不能解决问题,试试动态导入的方式,不过,你应该知道dynamic import返回可加载组件。我检查了动态导入仅适用于组件。为了在该包中使用import 语句,您仍应添加next-transpile-modules 的配置。然后创建一个组件:

从“crashcatchlib-reactjs”导入 {CrashCatch };

export default function ClientSideComponent(props){
    // Write here the logic.
 
    return <>yourJsxLogicComponent</>;
}

然后动态导入这个组件:

const ClientSideComponent = dynamic(()=> import("./ClientSideComponent.js"), { ssr: false });
  • 在这种情况下,使用 vanilla js 动态导入。我不确定是否必须添加next-transpile-modules的配置。

    let CrashCatchImport, CrashCatchProviderImport;
    
    import("crashcatchlib-reactjs").then((CrashCatch, CrashCatchProvider) => 
    {
      CrashCatchImport = CrashCatch.default;
      CrashCatchProviderImport=CrashCatchProvider.default;
    });
    

【讨论】:

  • 谢谢,抱歉耽搁了一点,希望过几天再接这个。出于好奇,您在哪个页面上查看了您发现令人困惑的文档 - 是否是 docs.crashcatch.com/integrations/reactjs 是否有任何机会。这是我正在做的副项目,所以我可以避免混淆,这很好:)
猜你喜欢
  • 2021-05-30
  • 2019-12-29
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2019-05-10
相关资源
最近更新 更多