You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置SvelteKit使用兼容Edge的npm包进行构建?

解决SvelteKit构建Edge兼容npm包(如Jose)的问题

问题

如何让SvelteKit在构建时使用兼容Edge运行时的npm包版本?比如使用Jose做JWT认证时,在Vercel Edge环境下出现buffer、crypto、util、zlib等Node内置模块找不到的构建错误。

报错信息

Run npm run preview to preview your production build locally.

> Using @sveltejs/adapter-vercel
✘ [ERROR] Could not resolve "buffer"

    .svelte-kit/output/server/chunks/auth.js:3:23:
      3 │ import { Buffer } from "buffer";
        ╵                        ~~~~~~~~

  The package "buffer" wasn't found on the file system but is built into node. Are you
  trying to bundle for node? You can use "platform: 'node'" to do that, which will remove
  this error.

解决方案

1. 强制指定npm包的Edge兼容入口

修改svelte.config.js,通过Vite配置强制使用Jose的浏览器/Edge兼容版本,避免拉取Node环境的代码:

import adapter from '@sveltejs/adapter-vercel'
import { vitePreprocess } from '@sveltejs/kit/vite'

/** @type {import('@sveltejs/kit').Config} */
const config = {
    preprocess: vitePreprocess(),

    kit: {
        adapter: adapter({
            runtime: 'edge',
        }),
    },
    vite: {
        resolve: {
            alias: {
                // 指定Jose的Edge兼容入口文件
                'jose': 'jose/dist/browser/index.js'
            }
        },
        optimizeDeps: {
            include: ['jose']
        }
    }
}

export default config

2. 补充Edge缺失的全局模块(可选)

如果仍有buffer、crypto等模块报错,安装并配置polyfill插件:
首先安装依赖:

npm install @esbuild-plugins/node-globals-polyfill --save-dev

然后更新Vite配置:

import adapter from '@sveltejs/adapter-vercel'
import { vitePreprocess } from '@sveltejs/kit/vite'
import { NodeGlobalsPolyfillPlugin } from '@esbuild-plugins/node-globals-polyfill'

/** @type {import('@sveltejs/kit').Config} */
const config = {
    preprocess: vitePreprocess(),

    kit: {
        adapter: adapter({
            runtime: 'edge',
        }),
    },
    vite: {
        resolve: {
            alias: {
                'jose': 'jose/dist/browser/index.js'
            }
        },
        optimizeDeps: {
            include: ['jose'],
            esbuildOptions: {
                define: {
                    global: 'globalThis'
                },
                plugins: [
                    NodeGlobalsPolyfillPlugin({
                        buffer: true,
                        crypto: true,
                        util: true,
                        zlib: true
                    })
                ]
            }
        }
    }
}

export default config

3. 确认代码使用Edge兼容API

确保代码中只使用Jose的浏览器/Edge兼容方法,避免调用Node特有的API(如直接引入buffer模块),优先使用Jose内置的工具函数。

原因说明

SvelteKit默认打包时会优先读取npm包的Node环境入口,但Edge运行时不支持Node的内置模块。通过指定包的Edge兼容入口+补充必要polyfill,可以让构建产物适配Edge环境。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:22:05