Vue3/Vite: 将模块外部化
<p>我正在尝试在Vue 3应用程序中使用<code>crypto</code>对字符串进行哈希处理。</p>
<pre class="brush:js;toolbar:false;">async function hash (token) {
const data = new TextEncoder().encode(token)
const byteHash = await crypto.subtle.digest("SHA-256", data)
// ^ the below error is thrown here
const arrayHash = Array.from(new Uint8Array(byteHash))
const hexHash = arrayHash.map(b => b.toString(16).padStart(2, '0')).join('').toLocaleUpperCase()
return hexHash
}
</pre>
<p>据我了解,现在浏览器中可以使用<code>crypto</code>,所以不需要使用<code>browserify</code>替代。</p>
<p>然而,我在浏览器控制台中遇到了以下错误:</p>
<pre class="brush:js;toolbar:false;">Error: Module "crypto" has been externalized for browser compatibility. Cannot access "crypto.subtle" in client code.
</pre>
<p>我理解这个错误为“Vite在构建过程中配置了将<code>crypto</code>模块外部化”。但是我在我的<code>vite.config.js</code>中没有找到这样的设置:</p>
<pre class="brush:js;toolbar:false;">// Plugins:
import vue from '@vitejs/plugin-vue'
import vuetify from 'vite-plugin-vuetify'
// Utilies:
import { defineConfig } from 'vite'
import { fileURLToPath, URL } from 'node:url'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
// https://github.com/vuetifyjs/vuetify-loader/tree/next/packages/vite-plugin
vuetify({
autoImport: true
})
],
define: { 'process.env': {} },
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
},
extensions: ['.js', '.json', '.jsx', '.mjs', '.ts', '.tsx', '.vue']
},
server: {
port: 3000
},
test: {
setupFiles: ['../vuetify.config.js'],
deps: {
inline: ['vuetify']
},
globals: true
}
})
</pre>
<p>是否有任何“内置”的Vite默认设置会导致这个问题?这个问题是否在其他地方进行了配置?我该如何解决这个问题并在我的应用程序中使用<code>crypto</code>模块?</p>