Svelte/Sapper构建时如何将Parse云函数文件纳入__sapper__目录?
解决Sapper中Parse Server云函数路径找不到的问题
嘿,我明白你遇到的麻烦了——Sapper构建后会把文件打包到__sapper__目录,但你的cloud/main.js没被纳入构建流程,所以Parse Server找不到它。别担心,咱们一步步解决这个问题:
问题根源
Sapper默认只会打包它识别的核心文件(比如路由、组件、server目录下的入口脚本),自定义的cloud文件夹不在默认打包范围内,所以构建后不会被复制到__sapper__目录里,导致路径报错。
解决方案一:用Rollup插件复制cloud文件夹(推荐)
这个方法适合保留独立云函数文件的场景,步骤如下:
- 调整文件位置
把你的cloud文件夹放到src/server目录下,结构变成:
sapper-project/ └── src/ └── server/ ├── cloud/ │ └── main.js └── server.js
- 安装Rollup复制插件
打开终端,安装rollup-plugin-copy:
npm install rollup-plugin-copy --save-dev
- 配置Rollup复制规则
找到项目根目录的rollup.config.js,引入插件并添加复制目标:
import copy from 'rollup-plugin-copy'; export default { // 保留原有配置,添加下面的插件配置 plugins: [ // ...其他已有的插件(比如sapper(), resolve()等) copy({ targets: [ // 开发环境复制到dev/server { src: 'src/server/cloud', dest: '__sapper__/dev/server' }, // 生产构建复制到build/server { src: 'src/server/cloud', dest: '__sapper__/build/server' } ], // 确保文件更新时自动复制 watch: true }) ] };
- 修正server.js里的路径
用path模块安全拼接路径,避免硬编码错误:
const express = require('express'); const ParseServer = require('parse-server'); const path = require('path'); express().use('/api', new ParseServer({ databaseURI: 'mongodb://localhost:27017/dev', // 用path.join处理路径 cloud: path.join(__dirname, 'cloud/main.js'), appId: 'myAppId', masterKey: 'masterKeyTest', serverURL: 'http://localhost:3000/api' }));
解决方案二:直接导入云函数代码
如果你的云函数代码不多,可以把它直接导入到server.js里,这样Rollup会自动打包进去,不需要复制文件:
- 在
src/server/cloud/main.js里导出云函数:
module.exports = function(Parse) { // 你的云函数逻辑,比如: Parse.Cloud.define('hello', async () => { return 'Hello from Parse Cloud!'; }); };
- 在
server.js里直接导入:
const express = require('express'); const ParseServer = require('parse-server'); const cloudCode = require('./cloud/main.js'); express().use('/api', new ParseServer({ databaseURI: 'mongodb://localhost:27017/dev', // 直接传入导入的云函数 cloud: cloudCode, appId: 'myAppId', masterKey: 'masterKeyTest', serverURL: 'http://localhost:3000/api' }));
这样构建时,云函数代码会被打包到server的bundle里,就不会出现找不到文件的问题了。
验证一下
重启你的Sapper开发服务器,或者重新执行sapper build,然后调用Parse的云函数,应该就不会再出现Cannot find module的错误啦!
内容的提问来源于stack exchange,提问作者BathgateIO
相关产品推荐
相关产品推荐

