Rustelo/info/static_files.md
Jesús Pérex 2f0f807331 feat: add dark mode functionality and improve navigation system
- Add complete dark mode system with theme context and toggle
- Implement dark mode toggle component in navigation menu
- Add client-side routing with SSR-safe signal handling
- Fix language selector styling for better dark mode compatibility
- Add documentation system with mdBook integration
- Improve navigation menu with proper external/internal link handling
- Add comprehensive project documentation and configuration
- Enhance theme system with localStorage persistence
- Fix arena panic issues during server-side rendering
- Add proper TypeScript configuration and build optimizations

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-11 20:53:20 +01:00

169 lines
5.7 KiB
Markdown

# Static File Serving in Rustelo
Rustelo provides built-in static file serving capabilities that allow you to serve images, PDFs, HTML files, and other static assets directly from the filesystem without any server-side processing.
## Overview
Static files are served from the `content/public` directory and are accessible via the `/public/` URL prefix. This feature is implemented using Axum's `ServeDir` service, which provides efficient static file serving with proper MIME type detection and caching headers.
## Configuration
The static file serving is configured in `server/src/main.rs`:
```rust
.nest_service("/public", ServeDir::new("content/public"))
```
This configuration maps all requests to `/public/*` to files in the `content/public` directory.
## Directory Structure
```
content/public/
├── images/ # Image files (PNG, JPG, SVG, etc.)
├── documents/ # PDF files, Word docs, etc.
├── styles/ # CSS stylesheets
├── scripts/ # JavaScript files
├── fonts/ # Web fonts
├── videos/ # Video files
├── downloads/ # Files for download
├── example.html # Example HTML file
└── README.md # Documentation
```
## URL Mapping
| File Path | Accessible URL |
|-----------|----------------|
| `content/public/example.html` | `/public/example.html` |
| `content/public/images/logo.png` | `/public/images/logo.png` |
| `content/public/documents/manual.pdf` | `/public/documents/manual.pdf` |
| `content/public/styles/custom.css` | `/public/styles/custom.css` |
| `content/public/scripts/app.js` | `/public/scripts/app.js` |
## Supported File Types
The server automatically detects and serves files with appropriate MIME types:
- **HTML files** (`.html`, `.htm`) → `text/html`
- **CSS files** (`.css`) → `text/css`
- **JavaScript files** (`.js`) → `application/javascript`
- **Images** (`.png`, `.jpg`, `.jpeg`, `.gif`, `.svg`, `.webp`) → `image/*`
- **PDF documents** (`.pdf`) → `application/pdf`
- **Text files** (`.txt`, `.md`) → `text/plain`
- **JSON files** (`.json`) → `application/json`
- **XML files** (`.xml`) → `application/xml`
## Usage Examples
### 1. Serving Images
Place images in `content/public/images/` and reference them:
```html
<img src="/public/images/logo.png" alt="Company Logo">
```
### 2. Including CSS Stylesheets
Add CSS files to `content/public/styles/`:
```html
<link rel="stylesheet" href="/public/styles/custom.css">
```
### 3. Loading JavaScript Files
Include JavaScript files from `content/public/scripts/`:
```html
<script src="/public/scripts/app.js"></script>
```
### 4. Downloadable Documents
Provide downloadable files:
```html
<a href="/public/documents/user-manual.pdf" download>Download Manual</a>
```
## Features
- **Direct File Serving**: Files are served exactly as stored, without processing
- **MIME Type Detection**: Automatic content-type headers based on file extension
- **Performance**: Efficient serving with proper caching headers
- **Security**: Files are served read-only with no server-side execution
- **Flexibility**: Supports any file type with proper MIME mapping
## Security Considerations
- **Public Access**: All files in `content/public` are publicly accessible
- **No Authentication**: Files are served without any access control
- **No Processing**: Files are served as-is, no server-side code execution
- **File Permissions**: Ensure proper file system permissions are set
## Performance Notes
- Files are served directly by the Axum server for optimal performance
- Consider using a CDN for better global performance in production
- Large files should be optimized before placing in the public directory
- Browser caching headers are automatically set for static files
## Example Files
The template includes example files to demonstrate the functionality:
- `/public/example.html` - Complete HTML page with CSS and JavaScript
- `/public/styles/custom.css` - CSS stylesheet with utility classes
- `/public/scripts/example.js` - JavaScript file with interactive demos
- `/public/README.md` - Detailed documentation
## Development vs Production
### Development
- Files are served directly from the filesystem
- Changes are immediately visible without restart
- No additional caching beyond browser defaults
### Production
- Consider using a reverse proxy (nginx) for better static file performance
- Implement CDN for global distribution
- Use compression (gzip/brotli) for better transfer speeds
- Set appropriate cache headers for different file types
## Best Practices
1. **Organization**: Group similar files in subdirectories
2. **Naming**: Use descriptive, SEO-friendly filenames
3. **Optimization**: Compress images and minify CSS/JS before deployment
4. **Security**: Never store sensitive files in the public directory
5. **Maintenance**: Remove unused files regularly to keep the directory clean
## Troubleshooting
### File Not Found (404)
- Verify the file exists in `content/public`
- Check the URL path matches the file path exactly
- Ensure proper file permissions (readable by the server)
### Wrong MIME Type
- Check the file extension is recognized
- Verify the file content matches the expected type
- Ensure the file is not corrupted
### Permission Denied
- Check file system permissions
- Verify the server process has read access to the directory
- Ensure the file is not locked by another process
## Testing
You can test the static file serving by:
1. Starting the server: `cargo leptos serve`
2. Accessing the example file: `http://localhost:3000/public/example.html`
3. Using the browser's developer tools to inspect network requests
4. Running the JavaScript test functions in the browser console
The example JavaScript file provides test utilities accessible via `StaticFileDemo.test()` in the browser console.