如何缩小使用node-adapter部署的SvelteKit应用的打包体积
SvelteKit部署体积过大问题解决方案
体积异常原因
- Bundlephobia标注的是包的客户端压缩后最小体积,本地安装的node_modules包含大量冗余内容:未拆分的开发依赖、嵌套重复依赖、包自带的文档、测试文件、类型定义等都会计入总容量
- @prisma/client默认会下载全平台的Query Engine二进制文件,单份二进制大小就超过30MB,多平台版本累计可占上百MB空间,是体积异常的核心原因之一
- 未拆分开发依赖与生产依赖,node_modules中包含SvelteKit构建工具、TypeScript、Lint工具等仅开发阶段需要的包,这部分占比极高
问题1:打包依赖仅保留必要代码方案
SvelteKit原生支持将生产依赖打包进最终产物,操作步骤如下:
- 拆分依赖:将所有仅开发阶段用到的包(包括@svletejs/kit、vite、prisma CLI、typescript、eslint等)全部移入package.json的
devDependencies字段,dependencies仅保留你列出的5个生产依赖 - 修改svelte.config.js配置,开启服务端依赖打包:
import adapter from '@sveltejs/adapter-node'; /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { // 使用对应node环境的适配器 adapter: adapter(), vite: { ssr: { // 配置需要打包进服务端bundle的生产依赖,打包后无需再读取node_modules noExternal: ['@prisma/client', '@supercharge/request-ip', 'axios', 'ramda', 'sprintf-js'] } } } }; export default config;
- 优化Prisma体积:在prisma.schema中配置仅生成部署平台对应的二进制文件:
generator client { provider = "prisma-client-js" // 根据AlwaysData的系统环境选择对应二进制目标,常见为debian-openssl-1.1.x或debian-openssl-3.0.x binaryTargets = ["debian-openssl-1.1.x"] }
- 构建完成后可直接删除根目录的node_modules文件夹,所有运行需要的代码都已经打进build产物内,仅保留build文件夹和Prisma生成的引擎文件即可,最终总体积不会超过10MB。如果确实需要保留部分node_modules内容,可执行
npm prune --production删除所有开发依赖,再清理冗余文件进一步压缩容量。
问题2:生产环境自动导入dist目录压缩版本
SvelteKit的生产构建流程本身已经实现该能力:
- 客户端侧代码会自动完成Tree Shaking、压缩、混淆,输出到dist目录的对应路径,内部导入路径已经自动映射到压缩后的产物,无需额外配置
- 服务端侧代码按照前述配置完成依赖打包后,会直接使用打包压缩后的代码,不会访问node_modules内的源文件
内容的提问来源于stack exchange,提问作者martinjerome
相关产品推荐
相关产品推荐

