82 lines
2.1 KiB
JavaScript
82 lines
2.1 KiB
JavaScript
|
|
const http = require('http');
|
|||
|
|
const fs = require('fs');
|
|||
|
|
const path = require('path');
|
|||
|
|
|
|||
|
|
const PORT = 3000;
|
|||
|
|
|
|||
|
|
const server = http.createServer((req, res) => {
|
|||
|
|
console.log(`${req.method} ${req.url}`);
|
|||
|
|
|
|||
|
|
// 设置CORS头
|
|||
|
|
res.setHeader('Access-Control-Allow-Origin', '*');
|
|||
|
|
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
|
|||
|
|
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|||
|
|
|
|||
|
|
if (req.method === 'OPTIONS') {
|
|||
|
|
res.writeHead(200);
|
|||
|
|
res.end();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
let filePath = req.url === '/' ? '/index.html' : req.url;
|
|||
|
|
|
|||
|
|
// 如果是API请求,代理到后端
|
|||
|
|
if (req.url.startsWith('/api')) {
|
|||
|
|
const http = require('http');
|
|||
|
|
const options = {
|
|||
|
|
hostname: 'localhost',
|
|||
|
|
port: 8080,
|
|||
|
|
path: req.url,
|
|||
|
|
method: req.method,
|
|||
|
|
headers: req.headers
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
const proxyReq = http.request(options, (proxyRes) => {
|
|||
|
|
res.writeHead(proxyRes.statusCode, proxyRes.headers);
|
|||
|
|
proxyRes.pipe(res);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
req.pipe(proxyReq);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 静态文件服务
|
|||
|
|
const fullPath = path.join(__dirname, 'dist', filePath);
|
|||
|
|
|
|||
|
|
fs.readFile(fullPath, (err, data) => {
|
|||
|
|
if (err) {
|
|||
|
|
res.writeHead(404, { 'Content-Type': 'text/html' });
|
|||
|
|
res.end(`
|
|||
|
|
<!DOCTYPE html>
|
|||
|
|
<html>
|
|||
|
|
<head>
|
|||
|
|
<title>开发服务器</title>
|
|||
|
|
</head>
|
|||
|
|
<body>
|
|||
|
|
<h1>开发服务器正在运行</h1>
|
|||
|
|
<p>端口: ${PORT}</p>
|
|||
|
|
<p>请先运行 <code>npm run build</code> 构建项目</p>
|
|||
|
|
</body>
|
|||
|
|
</html>
|
|||
|
|
`);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const ext = path.extname(fullPath);
|
|||
|
|
const contentType = {
|
|||
|
|
'.html': 'text/html',
|
|||
|
|
'.js': 'text/javascript',
|
|||
|
|
'.css': 'text/css',
|
|||
|
|
'.json': 'application/json'
|
|||
|
|
}[ext] || 'text/plain';
|
|||
|
|
|
|||
|
|
res.writeHead(200, { 'Content-Type': contentType });
|
|||
|
|
res.end(data);
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
server.listen(PORT, '0.0.0.0', () => {
|
|||
|
|
console.log(`🚀 开发服务器运行在 http://localhost:${PORT}`);
|
|||
|
|
console.log(`🌐 网络访问: http://0.0.0.0:${PORT}`);
|
|||
|
|
});
|