SvelteKit无法导入$app/$env模块,外部文件调用报错求解决方案
SvelteKit外部文件无法导入$app/$env等模块的解决办法?
无法在SvelteKit外部创建的文件里使用带$app、$env或路径相关变量的导入语句,具体场景如下:
场景示例
- 文件
socketio/server.ts:
import * as FriendsService from '../src/lib/services/friends';
- 文件
/src/lib/services/friends.ts:
import { JWT_ACCESS_TOKEN_SECRET } from "$env/static/private";
报错信息
TSError: ⨯ Unable to compile TypeScript: ../src/lib/services/friends.ts:2:41 - error TS2307: Cannot find module '$env/static/private' or its corresponding type declarations.
请问有没有人找到这个问题的解决办法?
补充说明:我现在用ts-node启动服务器,是不是应该让Vite来处理这个文件?
可行解决办法
1. 让Vite接管外部服务(推荐)
把socketio这类外部服务集成到SvelteKit的Vite构建流程里,这样Vite会自动处理SvelteKit的环境变量和路径别名:
- 把socketio的代码移到SvelteKit项目内,比如创建
src/server/socketio.ts - 在
vite.config.ts中添加插件启动服务,示例:
import { sveltekit } from '@sveltejs/kit/vite'; import type { UserConfig } from 'vite'; import { Server } from 'socket.io'; const config: UserConfig = { plugins: [ sveltekit(), { name: 'socketio-server', configureServer(server) { const io = new Server(server.httpServer); // 这里可以直接导入FriendsService io.on('connection', (socket) => { // 处理socket连接逻辑 }); } } ] }; export default config;
2. 手动适配环境变量与路径(适合必须用ts-node的场景)
如果一定要单独用ts-node启动服务,可以这样处理:
- 安装
dotenv包,在socketio/server.ts顶部加载环境变量:
import dotenv from 'dotenv'; dotenv.config({ path: '.env' }); // 指向项目根目录的.env文件
- 抽离依赖SvelteKit环境变量的代码,比如创建
src/lib/services/friends-env.ts:
export const JWT_ACCESS_TOKEN_SECRET = process.env.JWT_ACCESS_TOKEN_SECRET;
- 在
tsconfig.json中配置路径别名,让ts-node识别SvelteKit的路径:
{ "compilerOptions": { "baseUrl": ".", "paths": { "$lib/*": ["src/lib/*"] } } }
- 启动ts-node时加上
--project tsconfig.json参数,比如:ts-node --project tsconfig.json socketio/server.ts
3. 用SvelteKit的Server Hooks托管服务
把socket服务逻辑放到src/hooks.server.ts里,这样可以直接访问所有SvelteKit的内部模块和环境变量,不需要单独启动外部服务。
内容的提问来源于stack exchange,提问作者urth
相关产品推荐
相关产品推荐

