Vue3/Vite: モジュールの外部化
P粉107991030
P粉107991030 2023-08-26 13:45:43
0
1
718
<p>Vue 3 アプリケーションで <code>crypto</code> を使用して文字列をハッシュしようとしています。 </p> <pre class="brush:js;toolbar:false;">非同期関数ハッシュ (トークン) { const データ = new TextEncoder().encode(トークン) const byteHash = await crypto.subtle.digest("SHA-256", データ) // ^ ここで以下のエラーがスローされます const arrayHash = Array.from(new Uint8Array(byteHash)) const hexHash = arrayHash.map(b => b.toString(16).padStart(2, '0')).join('').toLocaleUpperCase() ヘキサハッシュを返す } </pre> <p>私の知る限り、<code>crypto</code> は現在ブラウザで利用できるため、代わりに <code>browserify</code> を使用する必要はありません。 </p> <p>しかし、ブラウザのコンソールで次のエラーが発生しました: </p> <pre class="brush:js;toolbar:false;">エラー: モジュール「crypto」はブラウザ互換性のために外部化されています。クライアント コードの「crypto.subtle」にアクセスできません。 </pre> <p>このエラーは、「Vite はビルド プロセス中に <code>crypto</code> モジュールを外部化するように構成されています。」と理解しています。しかし、私の <code>vite.config.js</code> にはそのような設定が見つかりません:</p> <pre class="brush:js;toolbar:false;">// プラグイン: 「@vitejs/plugin-vue」から vue をインポートします 「vite-plugin-vuetify」から vuetify をインポートします // ユーティリティ: 「vite」から {defineConfig} をインポートします import { fileURLToPath, URL } from 'node:url' // https://vitejs.dev/config/ デフォルトのdefineConfigをエクスポート({ プラグイン: [ vue()、 // https://github.com/vuetifyjs/vuetify-loader/tree/next/packages/vite-plugin vuetify({ 自動インポート: true }) ]、 定義: { 'process.env': {} }, 解決する: { エイリアス: { '@': fileURLToPath(新しい URL('./src', import.meta.url)) }、 拡張子: ['.js'、'.json'、'.jsx'、'.mjs'、'.ts'、'.tsx'、'.vue'] }、 サーバー: { ポート: 3000 }、 テスト: { setupFiles: ['../vuetify.config.js'], デプス: { インライン: ['vuetify'] }、 グローバル: true } }) </pre> <p>この問題を引き起こす可能性のある「組み込みの」Vite デフォルト設定はありますか?この問題は別の場所で設定されていますか?この問題を解決し、アプリケーションで <code>crypto</code> モジュールを使用するにはどうすればよいですか? </p>
P粉107991030
P粉107991030

全員に返信(1)
P粉019353247

問題は、NodeJS とブラウザ の両方に crypto (webcrypto 標準を実装する) というモジュールがあり、互換性がありますが、ブラウザでは NodeJS に存在しない window コンテキストによって提供されるため、アクセス方法が異なります。

ブラウザで直接作業する場合は、window がデフォルトのコンテキストであるため、違いはわかりません。

しかし、Vite は NodeJS のコンテキストで動作しており、このモジュールがブラウザでは crypto として利用できないと (正しく) 認識しているため、エラーがスローされます。このモジュールがブラウザーにも存在するかどうかは知りませんが、window.crypto として存在します。

おそらく vite.config.js で設定できるかもしれませんが、私はよく知りません。

私は、両方の環境で機能する次の解決策を思いつきました:

リーリー リーリー

現在、この関数は両方の環境で動作します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート