Frameworks Integration
rpx can be integrated with various frontend and backend frameworks to provide custom domains, HTTPS, and other features for your local development environment.
Bun Projects
For Bun projects, use the dedicated Bun plugin:
ts
// bunfig.toml or server setup
import rpxPlugin from 'bun-plugin-rpx'
export default {
plugins: [
rpxPlugin({
domain: 'myapp.test',
https: true,
verbose: false
})
]
}
Vite
To use rpx with Vite, you need to configure both:
Vite Configuration for HMR
ts
import react from '@vitejs/plugin-react' // or your framework plugin
// vite.config.ts
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [react()],
server: {
hmr: {
// Point to your custom domain
host: 'myapp.test',
// If using HTTPS
port: 443,
protocol: 'wss'
}
}
})
Starting rpx
bash
# Start Vite on its default port (5173)
npm run dev
# In another terminal, start rpx
rpx --from localhost:5173 --to myapp.test
Or programmatically:
ts
// scripts/dev.js
import { spawn } from 'node:child_process'
import { startProxy } from '@stacksjs/rpx'
// Start Vite
const vite = spawn('npm', ['run', 'dev'], {
stdio: 'inherit',
shell: true
})
// Start rpx once Vite is ready
setTimeout(() => {
startProxy({
from: 'localhost:5173',
to: 'myapp.test',
https: true,
cleanup: { hosts: true }
})
}, 2000)
// Handle cleanup
process.on('SIGINT', () => {
vite.kill()
process.exit(0)
})
Next.js
Configuration
ts
// next.config.js
module.exports = {
async rewrites() {
return [
// If you need to rewrite paths
]
},
// Use a specific port for easier integration with rpx
server: {
port: 3000
}
}
Startup Script
ts
// scripts/dev.js
import { spawn } from 'node:child_process'
import { startProxy } from '@stacksjs/rpx'
// Start Next.js
const next = spawn('npm', ['run', 'dev'], {
stdio: 'inherit',
shell: true,
env: {
...process.env,
// If you need environment variables
HOSTNAME: 'localhost',
PORT: '3000'
}
})
// Start rpx
startProxy({
from: 'localhost:3000',
to: 'myapp.test',
https: true,
cleanup: { hosts: true }
})
// Handle cleanup
process.on('SIGINT', () => {
next.kill()
process.exit(0)
})
Express
Express Server
ts
// server.js
import express from 'express'
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`)
})
rpx Configuration
ts
// rpx.config.ts
export default {
from: 'localhost:3000',
to: 'api.myapp.test',
https: true,
// Optionally start the Express server automatically
start: {
command: 'node server.js',
cwd: process.cwd(),
env: {
NODE_ENV: 'development'
}
}
}
NestJS
Configuration
ts
// main.ts
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
async function bootstrap() {
const app = await NestFactory.create(AppModule)
await app.listen(3000, 'localhost')
}
bootstrap()
rpx Configuration
ts
// rpx.config.ts
export default {
from: 'localhost:3000',
to: 'api.myapp.test',
https: true,
start: {
command: 'npm run start:dev',
cwd: process.cwd()
}
}
Vue CLI
vue.config.js
js
module.exports = {
devServer: {
port: 8080,
host: 'localhost',
https: false // Disable Vue's HTTPS, rpx will handle it
}
}
rpx Configuration
ts
// rpx.config.ts
export default {
from: 'localhost:8080',
to: 'vue-app.test',
https: true,
cleanup: { hosts: true }
}
Angular
angular.json
json
{
"projects": {
"my-app": {
"architect": {
"serve": {
"options": {
"port": 4200,
"host": "localhost",
"ssl": false
}
}
}
}
}
}
rpx Configuration
ts
// rpx.config.ts
export default {
from: 'localhost:4200',
to: 'angular-app.test',
https: true,
cleanup: { hosts: true }
}
Multiple Frameworks
When working with multiple frameworks (e.g., frontend and backend), configure rpx to handle both:
ts
// rpx.config.ts
export default {
https: true,
cleanup: { hosts: true },
proxies: [
{
from: 'localhost:5173', // Vite frontend
to: 'app.myproject.test'
},
{
from: 'localhost:3000', // Express API
to: 'api.myproject.test'
}
]
}
Best Practices
- Disable framework HTTPS: Let rpx handle HTTPS for consistency
- Use fixed ports: Configure your frameworks to use specific ports for easier integration
- Consider domain namespacing: Use subdomains like
app.myproject.test
andapi.myproject.test
- Create startup scripts: For complex setups, create a single script that starts all services
- Enable cleanup: Configure rpx to clean up hosts file entries when stopping
- Configure WebSocket endpoints: For frameworks that use WebSockets, ensure they're properly configured for your custom domain