Saya cuba mencincang rentetan menggunakan
async function hash (token) { data const = TextEncoder().encode(token) baharu const byteHash = menunggu crypto.subtle.digest("SHA-256", data) // ^ ralat di bawah dibuang di sini const arrayHash = Array.from(Uint8Array(byteHash)) const hexHash = arrayHash.map(b => b.toString(16).padStart(2, '0')).join('').toLocaleUpperCase() kembalikan hexHash }Setahu saya,
crypto
kini tersedia dalam penyemak imbas, jadi tidak perlu menggunakanbrowserify
Walau bagaimanapun, saya mengalami ralat berikut dalam konsol penyemak imbas saya:
Ralat: Modul "crypto" tidak dapat mengakses "crypto.subtle"Saya memahami ralat ini sebagai "Vite dikonfigurasikan untuk menyahaktifkan
crypto modul semasa proses binaan." Tetapi saya tidak menemui tetapan sedemikian dalam vite.config.js
:// Pemalam: import vue daripada '@vitejs/plugin-vue' import vuetify daripada 'vite-plugin-vuetify' // Utiliti: import { defineConfig } daripada 'vite' import { fileURLToPath, URL } daripada 'node:url' // https://vitejs.dev/config/ eksport defineConfig lalai ({ pemalam: [ vue(), // https://github.com/vuetifyjs/vuetify-loader/tree/next/packages/vite-plugin vuetify({ autoImport: benar }) ], takrifkan: { 'process.env': {} }, selesaikan: { alias: { '@': fileURLToPath(URL baharu('./src', import.meta.url)) }, sambungan: ['.js', '.json', '.jsx', '.mjs', '.ts', '.tsx', '.vue'] }, pelayan: { pelabuhan: 3000 }, ujian: { setupFiles: ['../vuetify.config.js'], deps: { sebaris: ['vuetify'] }, globals: benar } })Adakah terdapat sebarang tetapan lalai Vite "terbina dalam" yang boleh menyebabkan isu ini? Adakah isu ini dikonfigurasikan di tempat lain? Bagaimanakah saya boleh menyelesaikan masalah ini dan menggunakan modul
crypto
Masalahnya ialah NodeJS dan pelayarkedua-duanyamempunyai modul yang dipanggil
) dan ia serasi tetapi perlu diakses dengan cara yang berbeza kerana dalam penyemak imbas Ia adalah disediakan oleh kontekscrypto
(yang melaksanakan standardcrypto
的模块(实现了webcrypto标准),它们是兼容的,但需要以不同的方式访问,因为在浏览器中它是由不存在于NodeJS中的window
webcryptoyang tidak wujud dalam NodeJS.
Jika anda bekerja secara langsung dalam penyemak imbas, anda tidak akan melihat perbezaannya keranawindow
ialah konteks lalai.
Tetapi Vite berfungsi dalam konteks NodeJS dan ia (dengan betul) percaya bahawa modul ini tidak tersediacrypto
,因此会抛出错误。它不知道/不关心这个模块在浏览器中也存在,但是作为window.crypto
dalam penyemak imbas.
Mungkin ia boleh dikonfigurasikan dalamvite.config.js
, tetapi saya tidak begitu biasa dengannya.
Saya menghasilkan penyelesaian berikut, yang berfungsi dalam kedua-dua persekitaran:
Kini fungsi ini berfungsi dalam kedua-dua persekitaran.