diff --git a/packages/backend/jest-resolver.cjs b/packages/backend/jest-resolver.cjs
deleted file mode 100644
index 4424b800dc..0000000000
--- a/packages/backend/jest-resolver.cjs
+++ /dev/null
@@ -1,14 +0,0 @@
-// https://github.com/facebook/jest/issues/12270#issuecomment-1194746382
-
-const nativeModule = require('node:module');
-
-function resolver(module, options) {
-  const { basedir, defaultResolver } = options;
-  try {
-    return defaultResolver(module, options);
-  } catch (error) {
-    return nativeModule.createRequire(basedir).resolve(module);
-  }
-}
-
-module.exports = resolver;
diff --git a/packages/backend/jest.config.cjs b/packages/backend/jest.config.cjs
index f0a3dc16c2..2f11f6a3e9 100644
--- a/packages/backend/jest.config.cjs
+++ b/packages/backend/jest.config.cjs
@@ -83,7 +83,14 @@ module.exports = {
 
 	// A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
 	moduleNameMapper: {
-		"^@/(.*?).js": "<rootDir>/src/$1.ts",
+		// Do not resolve .wasm.js to .wasm by the rule below
+		'^(.+)\\.wasm\\.js$': '$1.wasm.js',
+		// SWC converts @/foo/bar.js to `../../src/foo/bar.js`, and then this rule
+		// converts it again to `../../src/foo/bar` which then can be resolved to
+		// `.ts` files.
+		// See https://github.com/swc-project/jest/issues/64#issuecomment-1029753225
+		// TODO: Use `--allowImportingTsExtensions` on TypeScript 5.0 so that we can
+		// directly import `.ts` files without this hack.
 		'^(\\.{1,2}/.*)\\.js$': '$1',
 	},
 
@@ -112,7 +119,7 @@ module.exports = {
 	// resetModules: false,
 
 	// A path to a custom resolver
-	resolver: './jest-resolver.cjs',
+	// resolver: './jest-resolver.cjs',
 
 	// Automatically restore mock state between every test
 	restoreMocks: true,
diff --git a/packages/backend/src/core/activitypub/LdSignatureService.ts b/packages/backend/src/core/activitypub/LdSignatureService.ts
index a29e1be564..618ae48b1b 100644
--- a/packages/backend/src/core/activitypub/LdSignatureService.ts
+++ b/packages/backend/src/core/activitypub/LdSignatureService.ts
@@ -1,6 +1,5 @@
 import * as crypto from 'node:crypto';
 import { Inject, Injectable } from '@nestjs/common';
-import jsonld from 'jsonld';
 import { HttpRequestService } from '@/core/HttpRequestService.js';
 import { bindThis } from '@/decorators.js';
 import { CONTEXTS } from './misc/contexts.js';
@@ -85,7 +84,9 @@ class LdSignature {
 	@bindThis
 	public async normalize(data: any) {
 		const customLoader = this.getLoader();
-		return await jsonld.normalize(data, {
+		// XXX: Importing jsonld dynamically since Jest frequently fails to import it statically
+		// https://github.com/misskey-dev/misskey/pull/9894#discussion_r1103753595
+		return (await import('jsonld')).default.normalize(data, {
 			documentLoader: customLoader,
 		});
 	}
diff --git a/packages/frontend/src/components/MkReactedUsersDialog.vue b/packages/frontend/src/components/MkReactedUsersDialog.vue
index 2a8dffc014..1506e24ce8 100644
--- a/packages/frontend/src/components/MkReactedUsersDialog.vue
+++ b/packages/frontend/src/components/MkReactedUsersDialog.vue
@@ -10,15 +10,21 @@
 
 	<MkSpacer :margin-min="20" :margin-max="28">
 		<div v-if="note" class="_gaps">
-			<div :class="$style.tabs">
-				<button v-for="reaction in reactions" :key="reaction" :class="[$style.tab, { [$style.tabActive]: tab === reaction }]" class="_button" @click="tab = reaction">
-					<MkReactionIcon :reaction="reaction"/>
-					<span style="margin-left: 4px;">{{ note.reactions[reaction] }}</span>
-				</button>
+			<div v-if="reactions.length === 0" class="_fullinfo">
+				<img src="https://xn--931a.moe/assets/info.jpg" class="_ghost"/>
+				<div>{{ i18n.ts.nothing }}</div>
 			</div>
-			<MkA v-for="user in users" :key="user.id" :to="userPage(user)">
-				<MkUserCardMini :user="user" :with-chart="false"/>
-			</MkA>
+			<template v-else>
+				<div :class="$style.tabs">
+					<button v-for="reaction in reactions" :key="reaction" :class="[$style.tab, { [$style.tabActive]: tab === reaction }]" class="_button" @click="tab = reaction">
+						<MkReactionIcon :reaction="reaction"/>
+						<span style="margin-left: 4px;">{{ note.reactions[reaction] }}</span>
+					</button>
+				</div>
+				<MkA v-for="user in users" :key="user.id" :to="userPage(user)">
+					<MkUserCardMini :user="user" :with-chart="false"/>
+				</MkA>
+			</template>
 		</div>
 		<div v-else>
 			<MkLoading/>