前言
在前端开发中,当我们使用 Vite、Webpack 或其他构建工具启动本地开发服务器时,经常会看到类似这样的输出:
➜ Local: http://localhost:5173/
➜ Network: http://192.168.1.100:5173/
很多开发者可能会疑惑:这两个地址有什么区别?什么时候该用哪个?本文将深入探讨这个问题。
一、基本概念
1.1 localhost 是什么?
localhost 是一个特殊的主机名,它始终指向本机的回环地址(loopback address)。
- IPv4:
127.0.0.1 - IPv6:
::1
# 验证 localhost 指向
ping localhost
# 输出:PING localhost (127.0.0.1): 56 data bytes
1.2 IP 地址(局域网地址)是什么?
IP 地址(如 192.168.1.100)是你的设备在局域网中的地址,由路由器分配。
- 私有 IP 段:
10.0.0.0~10.255.255.255172.16.0.0~172.31.255.255192.168.0.0~192.168.255.255
二、核心区别对比
| 特性 | localhost (127.0.0.1) | IP 地址 (如 192.168.1.100) |
|---|---|---|
| 访问范围 | 仅限本机访问 | 局域网内所有设备可访问 |
| 网络接口 | 虚拟回环接口 | 物理/无线网卡接口 |
| DNS 解析 | 系统直接解析 | 需要网络连接 |
| 安全性 | 更安全(外部无法访问) | 局域网内可访问(需注意安全) |
| 典型使用场景 | 个人开发调试 | 多设备联调、移动端测试 |
##三、实际应用场景
3.1 使用 localhost 的场景
✅ 适合场景
-
个人开发调试
// vite.config.js export default { server: { host: 'localhost', // 或者不配置,默认 localhost port: 5173 } } -
安全性要求高的项目
- 后端 API 开发
- 涉及敏感数据的调试
-
不需要跨设备访问
- 纯 PC 端开发
- 桌面应用开发
🎯 实际案例
// Vue 项目在本机开发
npm run dev
// 访问:http://localhost:5173
3.2 使用 IP 地址的场景
✅ 适合场景
-
移动端页面调试
// vite.config.js export default { server: { host: '0.0.0.0', // 监听所有网络接口 port: 5173 } }在手机浏览器访问:
http://192.168.1.100:5173 -
多设备联调
- 前端 + 后端同事协作
- 产品/设计同事预览页面
- 真机测试响应式布局
-
微信公众号/小程序开发
// 微信开发者工具需要局域网地址 // 配置业务域名:http://192.168.1.100:5173 -
跨设备调试(如平板、智能电视)
🎯 实际案例
// React Native 联调
// metro.config.js
module.exports = {
server: {
host: '192.168.1.100' // 使用局域网 IP
}
}
四、常见构建工具配置
4.1 Vite
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
server: {
host: '0.0.0.0', // 监听所有地址(会同时启用 localhost 和 IP)
port: 5173,
open: true, // 自动打开浏览器
// 开发时可以同时使用两个地址访问
}
})
启动后会显示:
➜ Local: http://localhost:5173/
➜ Network: http://192.168.1.100:5173/
4.2 Vue CLI (Webpack)
// vue.config.js
module.exports = {
devServer: {
host: '0.0.0.0',
port: 8080,
// 允许外部访问
disableHostCheck: true, // webpack 4
allowedHosts: 'all' // webpack 5
}
}
4.3 Create React App
# package.json
{
"scripts": {
"start": "HOST=0.0.0.0 react-scripts start"
}
}
# 或者创建 .env 文件
# HOST=0.0.0.0
# PORT=3000
4.4 Next.js
// next.config.js
module.exports = {
// Next.js 默认监听 0.0.0.0
}
// package.json
{
"scripts": {
"dev": "next dev -H 0.0.0.0 -p 3000"
}
}
五、安全性考虑
5.1 localhost 的安全性
✅ 优点:
- 外部网络无法访问
- 不受防火墙限制
- Cookie/Storage 隔离更好
⚠️ 注意事项:
- 本机恶意软件仍可访问
- 某些浏览器扩展可以访问
5.2 IP 地址的安全性
⚠️ 风险:
- 局域网内所有设备可访问
- 可能被抓包工具监听
- 存在 CSRF 攻击风险
🛡️ 防护措施:
-
使用 HTTPS
// vite.config.js import fs from 'fs' export default { server: { https: { key: fs.readFileSync('./certs/localhost-key.pem'), cert: fs.readFileSync('./certs/localhost.pem') }, host: '0.0.0.0' } } -
限制访问 IP
// 仅允许特定 IP 访问 devServer: { allowedHosts: [ '192.168.1.100', '192.168.1.101' ] } -
防火墙规则
# macOS sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /path/to/node # Linux (iptables) sudo iptables -A INPUT -p tcp --dport 5173 -s 192.168.1.0/24 -j ACCEPT
六、常见问题与解决方案
6.1 无法通过 IP 访问?
问题现象:
# 启动成功,但手机无法访问 http://192.168.1.100:5173
解决方案:
-
检查防火墙
# macOS - 关闭防火墙或添加例外 系统偏好设置 -> 安全性与隐私 -> 防火墙 # Windows 控制面板 -> Windows Defender 防火墙 -> 允许应用通过防火墙 -
确认 host 配置
// 必须设置为 0.0.0.0 而不是 localhost server: { host: '0.0.0.0' // ✅ 正确 // host: 'localhost' // ❌ 错误 } -
确认设备在同一局域网
# 查看本机 IP # macOS/Linux ifconfig | grep inet # Windows ipconfig
6.2 如何获取本机局域网 IP?
方法一:命令行
# macOS/Linux
ifconfig en0 | grep inet | grep -v inet6 | awk '{print $2}'
# Windows
ipconfig | findstr IPv4
方法二:Node.js 自动获取
// get-local-ip.js
const os = require('os')
function getLocalIP() {
const interfaces = os.networkInterfaces()
for (const name of Object.keys(interfaces)) {
for (const iface of interfaces[name]) {
// 跳过内部和非 IPv4 地址
if (iface.family === 'IPv4' && !iface.internal) {
return iface.address
}
}
}
return '127.0.0.1'
}
console.log('本机 IP:', getLocalIP())
方法三:Vite 插件
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
{
name: 'show-ip',
configureServer(server) {
server.httpServer.once('listening', () => {
const address = server.httpServer.address()
const localIP = getLocalIP()
console.log(`\n 🎉 本地访问:http://localhost:${address.port}`)
console.log(` 📱 手机访问:http://${localIP}:${address.port}\n`)
})
}
}
]
})
6.3 localhost 和 127.0.0.1 有区别吗?
通常情况:没有区别,localhost 会解析为 127.0.0.1
特殊情况:
-
hosts 文件被修改
# /etc/hosts (macOS/Linux) # C:\Windows\System32\drivers\etc\hosts (Windows) 127.0.0.1 localhost # 如果修改了这一行,localhost 可能指向其他地址 -
IPv6 环境
# localhost 可能解析为 ::1 (IPv6) ping localhost # 可能返回 IPv6 地址 ping 127.0.0.1 # 强制使用 IPv4 -
DNS 查询开销
// 127.0.0.1 略快(跳过 DNS 解析) fetch('http://127.0.0.1:5173/api') // 稍快 fetch('http://localhost:5173/api') // 需要解析
七、最佳实践建议
7.1 开发环境配置建议
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
server: {
host: '0.0.0.0', // 👈 推荐:同时支持 localhost 和 IP
port: 5173,
strictPort: false, // 端口被占用时自动尝试下一个
open: true, // 自动打开浏览器
cors: true, // 允许跨域
// 代理配置
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}
})
7.2 环境变量管理
# .env.development
VITE_HOST=0.0.0.0
VITE_PORT=5173
VITE_API_URL=http://localhost:8080
# .env.production
VITE_API_URL=https://api.example.com
// vite.config.js
export default defineConfig({
server: {
host: process.env.VITE_HOST || '0.0.0.0',
port: Number(process.env.VITE_PORT) || 5173
}
})
7.3 快速切换脚本
// package.json
{
"scripts": {
"dev": "vite --host 0.0.0.0",
"dev:local": "vite --host localhost",
"dev:mobile": "vite --host 0.0.0.0 --open false"
}
}
八、移动端调试技巧
8.1 使用二维码访问
安装 qrcode-terminal 插件:
npm install -D qrcode-terminal
// vite.config.js
import qrcode from 'qrcode-terminal'
import { defineConfig } from 'vite'
export default defineConfig({
plugins: [
{
name: 'qrcode',
configureServer(server) {
server.httpServer.once('listening', () => {
const address = server.httpServer.address()
const localIP = getLocalIP()
const url = `http://${localIP}:${address.port}`
console.log('\n 📱 手机扫码访问:\n')
qrcode.generate(url, { small: true })
console.log(`\n ${url}\n`)
})
}
}
]
})
8.2 Chrome DevTools 远程调试
-
Android:
# 电脑访问 chrome://inspect # 手机开启 USB 调试 设置 -> 开发者选项 -> USB 调试 -
iOS (Safari):
# Mac Safari Safari -> 偏好设置 -> 高级 -> 显示开发菜单 # iPhone 设置 -> Safari -> 高级 -> Web 检查器
8.3 使用内网穿透(远程访问)
当需要外网访问时:
# 使用 ngrok
npm install -g ngrok
ngrok http 5173
# 使用 localtunnel
npm install -g localtunnel
lt --port 5173
九、性能对比
9.1 访问速度对比
// 简单性能测试
async function testSpeed(url) {
const start = performance.now()
await fetch(url)
return performance.now() - start
}
// localhost 平均:1-3ms
await testSpeed('http://localhost:5173/api')
// 127.0.0.1 平均:1-2ms(略快)
await testSpeed('http://127.0.0.1:5173/api')
// 局域网 IP 平均:2-5ms
await testSpeed('http://192.168.1.100:5173/api')
9.2 结论
- 本机开发:使用
localhost或127.0.0.1,几乎无差异 - 跨设备访问:使用局域网 IP,性能损耗可忽略
- 实际影响:网络延迟对开发体验影响微乎其微
十、总结
| 使用场景 | 推荐配置 | 访问方式 |
|---|---|---|
| 个人开发 | host: 'localhost' | http://localhost:5173 |
| 移动端调试 | host: '0.0.0.0' | http://192.168.1.100:5173 |
| 团队协作 | host: '0.0.0.0' | 两种方式都可以 |
| 生产构建 | 不适用 | 使用域名 |
核心要点
- localhost:安全、快速,仅限本机访问
- IP 地址:灵活、方便多设备调试,需注意安全
- 0.0.0.0:最佳实践,同时支持两种访问方式
- 移动端开发必须使用 IP 地址
- 注意防火墙和网络配置
推荐配置
// vite.config.js - 通用配置
export default defineConfig({
server: {
host: '0.0.0.0', // 👈 推荐
port: 5173,
open: true,
cors: true
}
})
这样你既可以用 localhost 快速本地访问,也可以用 IP 地址进行多设备调试,一举两得!
参考资料
如果这篇文章对你有帮助,欢迎点赞收藏!有任何问题欢迎在评论区讨论~ 🎉