Vue3/Vite : externaliser les modules
P粉107991030
2023-08-26 13:45:43
<p>J'essaie de hacher une chaîne en utilisant <code>crypto</code> </p>
<pre class="brush:js;toolbar:false;">hachage de fonction async (jeton) {
const data = nouveau TextEncoder().encode(jeton)
const byteHash = wait crypto.subtle.digest("SHA-256", données)
// ^ l'erreur ci-dessous est renvoyée ici
const arrayHash = Array.from (nouveau Uint8Array (byteHash))
const hexHash = arrayHash.map(b => b.toString(16).padStart(2, '0')).join('').toLocaleUpperCase()
retourner hexHash
}
≪/pré>
<p>Pour autant que je sache, <code>crypto</code> est désormais disponible dans les navigateurs, il n'est donc pas nécessaire d'utiliser <code>browserify</code> </p>
<p>Cependant, j'ai rencontré l'erreur suivante dans la console du navigateur : </p>
<pre class="brush:js;toolbar:false;">Erreur : le module "crypto" a été externalisé pour des raisons de compatibilité avec le navigateur. Impossible d'accéder à "crypto.subtle" dans le code client.
≪/pré>
<p>Je comprends cette erreur comme suit : "Vite est configuré pour externaliser le module <code>crypto</code> pendant le processus de construction." Mais je ne trouve pas un tel paramètre dans mon <code>vite.config.js</code> : </p>
<pre class="brush:js;toolbar:false;">// Plugins :
importer la vue depuis '@vitejs/plugin-vue'
importer vuetify depuis 'vite-plugin-vuetify'
// Utilitaires :
importer {defineConfig} depuis 'vite'
importer { fileURLToPath, URL } depuis 'node:url'
// https://vitejs.dev/config/
exporter la définition par défaut ({
plugins : [
vue(),
// https://github.com/vuetifyjs/vuetify-loader/tree/next/packages/vite-plugin
vuetify({
autoImport : vrai
})
],
définir : { 'process.env' : {} },
résoudre: {
pseudo : {
'@' : fileURLToPath(nouvelle URL('./src', import.meta.url))
},
extensions : ['.js', '.json', '.jsx', '.mjs', '.ts', '.tsx', '.vue']
},
serveur : {
port : 3000
},
test: {
setupFiles : ['../vuetify.config.js'],
dépôts : {
en ligne : ['vuetify']
},
globales : vrai
}
})
≪/pré>
<p>Existe-t-il des paramètres par défaut Vite « intégrés » qui pourraient provoquer ce problème ? Ce problème est-il configuré ailleurs ? Comment puis-je résoudre ce problème et utiliser le module <code>crypto</code> </p>
Le problème est que NodeJS et les navigateurs tous deux ont un module appelé
) et ils sont compatibles mais doivent être accessibles de différentes manières car dans le navigateur C'est fourni par un contextecrypto
(qui implémente le standardcrypto
的模块(实现了webcrypto标准),它们是兼容的,但需要以不同的方式访问,因为在浏览器中它是由不存在于NodeJS中的window
webcryptoqui n'existe pas dans NodeJS.
Si vous travaillez directement dans le navigateur, vous ne verrez pas la différence carwindow
est le contexte par défaut.
Mais Vite fonctionne dans le contexte de NodeJS et il pense (à juste titre) que ce module n'est pas disponiblecrypto
,因此会抛出错误。它不知道/不关心这个模块在浏览器中也存在,但是作为window.crypto
dans le navigateur.
Peut-être qu'il peut être configuré dansvite.config.js
, mais je ne le connais pas très bien.
J'ai trouvé la solution suivante, qui fonctionne dans les deux environnements :
🎜Maintenant, cette fonction fonctionne dans les deux environnements. 🎜