質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1046閲覧

Next.jsで**(べき乗)を使用した際にエラーが出る

退会済みユーザー

退会済みユーザー

総合スコア0

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/04/26 05:58

編集2022/04/26 08:02

Next.jsでべき乗の演算子を使用した際にエラーが発生します。

エラーが発生する場合。
bigint ** bigint
Number(bigint ** bigint)

エラーが発生しない場合
number ** number

具体的には以下のようなエラーが出ます。しかしながら、Next.jsを通さずに実行した場合には正常に実行できることを確認しています。

Unhandled Runtime Error TypeError: can't convert BigInt to number 26 | if (Number.isNaN(number)) return { is: false, value: formattedString, radix, msg: ERR_MSG.character }; 27 | > 28 | sum += bigIntRadix ** count * BigInt(number); | ^ 29 | } 30 | 31 | const signedHalf = 2n ** BigInt(bit - 1);

この28行目のエラーを解決しても、同じく31行目がエラーになります。ちなみにbigIntRadix, count, sumはどれもbigintの値が代入されています。

どなたか原因が分かる方はいらっしゃらないでしょうか。

追記:
create-next-app コマンドでnextアプリケーションを作成し、その状態からtsconfig.jsonのtargetをesnextに変更しただけのものでも同じようにべき乗の演算子でエラーが発生する現象がおこります。一方で、create-react-appで実行した際には発生しない問題のため、next側に解決策があるのではないかと考えています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arcxor

2022/04/26 06:10

sum も bigint なのでしょうか。
退会済みユーザー

退会済みユーザー

2022/04/26 06:20

記入忘れていました。sumもbigint型で間違いありません。その前の部分で0nで初期化し、そこに足しているという感じです。
guest

回答1

0

ベストアンサー

元ソース

jsx

1const bigIntRadix = BigInt(9007199254740991); 2const count = BigInt(2); 3const number = BigInt(2); 4let sum = 0n; 5 6export default function IndexPage() { 7 sum = bigIntRadix ** count * number; 8 return <div>{sum}</div>; 9}

ビルドした場合

next buildreact-scripts buildにてビルドを行うと、どちらもエラーが発生します。
これは、 (webpack自体かreact-scriptsかはわかりませんが) バンドル時にコードが変換されるためです。

js

1 var u = i(5893), 2 r = BigInt(9007199254740991), 3 _ = BigInt(2), 4 c = BigInt(2), 5 e = 0n; 6 function f() { 7 return ( 8 (e = Math.pow(r, _) * c), 9 (0, u.jsx)("div", { children: e }) 10 );

Math.pownumberを引数に取りますので、BigIntが与えられるとcan't convert BigInt to numberエラーが発生します。これはjsの通常の動作です。

DevServerで動かした場合

DevServerで動かした場合、reactではべき乗演算子**が保たれ、nextではビルド時と同様Math.powに変換されています。

react

jsx

1const bigIntRadix = BigInt(9007199254740991); 2const count = BigInt(2); 3const number = BigInt(2); 4let sum = 0n; 5 6function App() { 7 sum = bigIntRadix ** count * number; 8 return /*#__PURE__*/(0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_1__.jsxDEV)("div", { 9 // 省略

next

jsx

1var bigIntRadix = BigInt(9007199254740991); 2var count = BigInt(2); 3var number = BigInt(2); 4var sum = 0n; 5function IndexPage() { 6 sum = Math.pow(bigIntRadix, count) * number; 7 return /*#__PURE__*/ (0, react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)( 8 // 省略

この違いによってreactのdevサーバではエラーが出ず、nextでは出る事になっています。
どちらにせよビルドをするとエラーになりますので、べき乗演算子は使用せず、独自の関数を実装することをおすすめします。

追記

変換はbabelによって行われています。べき乗演算子**はes2016で実装されたので(普通に使うブラウザではもう大丈夫ですが)古いブラウザサポートのためにbabelは昔の記法にトランスパイルします。これは正しい仕様です。
es2016以上のブラウザに対応させるにはbabel.config.js.babelrcなどで@babel/preset-env/targetsを指定する必要があります。

babel.config.js

1module.exports = { 2 presets: [ 3 [ 4 "next/babel", 5 { 6 "preset-env": { 7 targets: { 8 chrome: 52, 9 edge: 14, 10 firefox: 52, 11 }, 12 }, 13 }, 14 ], 15 ], 16};

https://caniuse.com/?search=**

正確なサポートを指定しないのであれば、last 1 versionでも良いと思います。

targets:[ "last 1 chrome version", "last 1 firefox version", "last 1 safari version", ],

追記2

※ここからの内容は今調べました。

babelがBitIntの変換をサポートしていないからです。変換パフォーマンスの低下を避けることが理由のようです。
前の追記ではサポートブラウザバージョンの指定を提案しましたが、BigIntの計算を行う場合はネイティブのBitIntと同様の動作をするライブラリJSBIを使用したほうが良いかもしれません。

投稿2022/04/26 17:06

編集2022/04/27 03:09
k4a

総合スコア983

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/04/27 01:07

ありがとうございます!これはバグという認識で良いのでしょうか?いつかは修正されるものなのでしょうか?
退会済みユーザー

退会済みユーザー

2022/04/27 02:29

追記ありがとうございます。試してみたところ同じコードでも実行されるようになりました。ちなみに、BigInt自体はES2020で導入されており、べき乗演算子よりも新しい概念だと思うのですが、なぜbigintの使用はエラーにならずにべき乗演算子のみ自動でトランスパイルされていたのでしょうか?時間があれば、教えていただけるとありがたいです!
退会済みユーザー

退会済みユーザー

2022/04/27 03:21

よく理解できました。わざわざお付き合いいただきありがとうございました。本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問