我有一个使用Next.js的项目.我需要使用openjphjs解码HTJ2K像素数据.

我将openjphjs.js和openjphjs.wasm添加到项目的一个文件夹中.

我还将以下内容添加到next.js中.

    webpack: (config) => {
        config.resolve.fallback = { fs: false };
        return config;
    },

这样做是为了解决以下错误.

Module not found: Can't resolve 'fs'

我按照example年的例子,try 了下面的方法.

import openjphjs from './openjphjs/openjphjs.js';

const = decode = () => {
   const decoder = new openjphjs.HTJ2KDecoder();
}

引发了多个错误.

GET http://localhost:3000/_next/static/chunks/openjphjs.wasm 404 (Not Found)
Uncaught (in promise) RuntimeError: Aborted(RuntimeError: Aborted(both async and sync fetching of the wasm failed).
Uncaught TypeError: _openjphjs_openjphjs_js__WEBPACK_IMPORTED_MODULE_8___default(...).HTJ2KDecoder is not a constructor

我try 手动将openjphjs.wasm放置在所示路径中. 我还try 将文件放在/public文件夹中.

推荐答案

我在一个应用程序路由项目中使用Next.js 14.1.1try 了一下,并通过以下步骤在客户端上实例化了它,看看它是否可以提供帮助:

  1. /public目录中同时放置openjphjs.jsopenjphjs.wasm

  2. 创建一个服务器页面路由(我 Select 了app/openjph/page.tsx):

import Openjph from "@/components/openjph/open";
import Script from "next/script";

export default async function Page(props) {
  return <>
    <Script
      strategy="beforeInteractive"
      src="/openjphjs.js"
    />
    <Openjph />
  </>
}
  1. 创建一个客户端组件(我 Select 了app/components/openjph/open.tsx):
"use client";

import { useEffect } from 'react';

const Openjph = (props) => {
  useEffect(() => {
      try {
        const decoder = new Module.HTJ2KDecoder();
        console.log(decoder);
      } catch (error) {
        console.log(error)
      }
  }, [])
  
  return (
    <>[...more stuff...]</>
  );
};

export default Openjph;

This oughta print the instanced decoder: OpenJPHjs decoder

并根据需要继续进行.我的tsconfig.json美元大致是这样写的:

    "paths": {
      "@/components/*": ["app/components/*"],
    },

或者,您可以简单地使用相对路径或您喜欢的任何方式导入Openjph组件.

编辑: 如果上面的内容在生产版本中不起作用,这里有一个useEffect钩子的变通方法:

[...]
// @ts-nocheck
[...]
 useEffect(() => {
    try {
      const decoder = new Module.HTJ2KDecoder();
      console.log("has a constructor: ", decoder);
    } catch (error) {
      try {
        console.log("doesn't have a a constructor yet");
        Module.onRuntimeInitialized = async () => {
          const decoder = new Module.HTJ2KDecoder();
          console.log("now it does", decoder);
          const encoder = new Module.HTJ2KEncoder();
          console.log(encoder);
        };
      } catch (error) {
        console.log(error);
      }
    }
  }, []);

Javascript相关问答推荐

如何保持子画布元素的1:1宽高比?

如何通过在提交时工作的函数显示dom元素?

Klaro与Angular的集成

每次子路由重定向都会调用父加载器函数

如何修复(或忽略)HTML模板中的TypeScript错误?'

我们如何从一个行动中分派行动

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

Angular 订阅部分相互依赖并返回数组多个异步Http调用

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

使用类型:assets资源 /资源&时,webpack的配置对象&无效

FireBase云函数-函数外部的ENV变量

OnClick更改Json数组JSX中的图像源

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

如何使用[ModelJSON,ArrayBuffer]调用tf.loadGraphModelSync

TypeORM QueryBuilder限制联接到一条记录

TabNavigator和StackNavigator之间的Reaction Native中的导航问题

如何将对象推送到firestore数组?

在每次重新加载页面时更改指针光标

验证Java脚本函数中的两个变量

如果我将高度设置为其内容的100%,则在Java脚本中拖动以调整面板大小时会冻结