第一次接触网站开发时,我被各种技术名词搞得晕头转向。直到真正动手做了几个项目才明白,建站本质上就是解决三个核心问题:前端展示、后端逻辑和数据存储。就像搭积木一样,每个部分都有成熟的技术方案可选。
目前主流的网站开发主要分为两大类方案:传统服务端渲染和现代前后端分离架构。前者适合内容型网站,开发效率高;后者适合交互复杂的应用,灵活性更强。我在电商项目和博客系统中都实践过这两种模式,深刻体会到不同场景下的技术选型差异。
现代前端开发已经告别了jQuery时代,三大框架各有所长:
我建议新手从Vue3开始,配合Vite构建工具,能快速看到效果。这个组合在最近的企业官网项目中表现优异,开发体验流畅。
Node.js是我的首选,特别是配合Express或Koa框架:
javascript复制// Express基础示例
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(3000, () => {
console.log('Server running on port 3000')
})
Python+Django适合内容管理系统,而Java Spring Boot更适合复杂业务系统。曾用Django两周就完成了新闻发布系统,其Admin后台省去了大量开发工作。
关系型数据库MySQL最稳妥,NoSQL中MongoDB文档型最灵活。在用户管理系统项目中,我这样连接MySQL:
javascript复制const mysql = require('mysql')
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '123456',
database: 'my_db'
})
pool.query('SELECT * FROM users', (error, results) => {
if (error) throw error
console.log(results)
})
使用npm初始化项目时,我习惯这样组织目录结构:
code复制project/
├── public/ # 静态资源
├── src/
│ ├── assets/ # 图片字体等
│ ├── components/ # 公共组件
│ ├── router/ # 路由配置
│ └── views/ # 页面组件
└── package.json
通过vue-cli创建项目时,务必注意:
提示:选择Manually select features可以自定义需要的功能模块,避免安装无用依赖
Vue Router的嵌套路由在后台管理系统特别实用:
javascript复制const routes = [
{
path: '/dashboard',
component: DashboardLayout,
children: [
{ path: 'users', component: UserList },
{ path: 'settings', component: Settings }
]
}
]
我在实际项目中总结的经验:
封装Table组件时,我采用这种props设计:
javascript复制props: {
data: {
type: Array,
required: true
},
columns: {
type: Array,
default: () => [
{ prop: 'name', label: '姓名' },
{ prop: 'age', label: '年龄' }
]
}
}
组件通信的几种方式:
用户模块的典型接口设计:
code复制GET /api/users # 获取用户列表
POST /api/users # 创建用户
GET /api/users/:id # 获取用户详情
PUT /api/users/:id # 更新用户
DELETE /api/users/:id # 删除用户
在Express中实现:
javascript复制router.get('/users', async (req, res) => {
try {
const users = await User.find()
res.json(users)
} catch (err) {
res.status(500).json({ message: err.message })
}
})
JWT实现方案要点:
javascript复制const token = jwt.sign({ userId: user.id }, 'secret', { expiresIn: '1h' })
res.json({ token })
javascript复制function authenticateToken(req, res, next) {
const token = req.headers['authorization']
if (!token) return res.sendStatus(401)
jwt.verify(token, 'secret', (err, user) => {
if (err) return res.sendStatus(403)
req.user = user
next()
})
}
使用Sequelize时的事务处理示例:
javascript复制const transaction = await sequelize.transaction()
try {
await User.create({...}, { transaction })
await Profile.create({...}, { transaction })
await transaction.commit()
} catch (error) {
await transaction.rollback()
}
性能优化建议:
Nginx反向代理配置要点:
nginx复制server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
}
location /api {
proxy_pass http://localhost:8080;
}
}
PM2进程管理常用命令:
bash复制pm2 start server.js --name "api-server"
pm2 save
pm2 startup
GitHub Actions配置示例:
yaml复制name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: npm install
- run: npm test
- run: npm run build
Winston日志配置模板:
javascript复制const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
})
if (process.env.NODE_ENV !== 'production') {
logger.add(new winston.transports.Console({
format: winston.format.simple()
}))
}
CORS中间件配置:
javascript复制app.use(cors({
origin: ['https://example.com'],
methods: ['GET', 'POST'],
allowedHeaders: ['Content-Type']
}))
开发环境可临时放宽限制:
注意:生产环境必须严格限制origin,避免安全风险
前端优化 checklist:
后端优化手段:
必备安全中间件:
javascript复制app.use(helmet()) // 安全头部
app.use(rateLimit({ // 限流
windowMs: 15 * 60 * 1000,
max: 100
}))
SQL注入防护:
javascript复制// 使用参数化查询
pool.query('SELECT * FROM users WHERE id = ?', [userId])
当单体应用遇到性能瓶颈时,可以考虑:
Nuxt.js项目创建:
bash复制npx create-nuxt-app my-ssr-project
配置注意事项:
VuePress文档站点示例:
javascript复制module.exports = {
title: '项目文档',
themeConfig: {
nav: [
{ text: '指南', link: '/guide/' }
],
sidebar: {
'/guide/': [
'',
'installation',
'usage'
]
}
}
}