Code前端首页关于Code前端联系我们

Vue2和Node在项目里分别干啥活儿?

terry 8小时前 阅读数 9 #Vue
文章标签 Vue2;Node

p标签开头:现在不少团队做中小型项目时,喜欢把Vue2当前端主力、Node做后端支撑,俩技术凑一块能快速迭代还灵活,但刚接触这种组合开发,从项目搭建到数据互通再到上线部署,每个环节都藏着不少“小陷阱”,今天就把开发里常见的关键问题拆开来,聊聊Vue2和Node结合时咋把流程理顺、少踩坑~
很多刚入门的同学会疑惑:“Vue2和Node都是JavaScript体系的,咋分工?”其实很好理解——Vue2负责前端界面层,管用户看到的页面长啥样、点按钮后咋响应,比如做个博客,文章列表的渲染、点赞按钮的交互动画、评论输入框的双向绑定,这些都是Vue2的活儿,它靠组件化(把页面拆成Header、ArticleList这些组件)、响应式数据(data变了页面自动更)来让界面灵活起来。

Node则是后端服务层,负责处理业务逻辑、和数据库打交道、给前端返回数据,还是拿博客举例:用户点“发布文章”,前端把标题、内容传给Node;Node得先验证内容是否合规(比如有没有敏感词),再把文章存到MongoDB/MySQL里,最后给前端返回“发布成功”的结果,要是用户想删文章,Node还得检查权限、操作数据库删除,再响应前端,简单说,Node就像“中间人”,一边接前端请求,一边操作数据库,再把处理结果丢回给前端。

从0开始搭项目,步骤咋走顺?

想把Vue2和Node的项目跑起来,得前后端分别初始化,再解决“跨域”这个绕不开的问题。

先搞前端:用vue-cli创建Vue2项目(命令行敲vue create my-vue-app,选Vue2模板),建好后,根据需求装依赖——比如用axios发HTTP请求,用vue-router做页面跳转,用vuex管理用户登录状态这些全局数据,举个栗子:做电商项目时,商品列表页、购物车页得用vue-router配置路由;用户的收货地址、购物车数据得存在vuex里。

再搞后端:选个Node框架(比如Express,轻量易上手),新建文件夹my-node-servernpm init -y初始化包管理,然后npm i express装框架,接着建核心文件app.js,写基础服务:

const express = require('express')
const app = express()
app.get('/', (req, res) => {
  res.send('Node服务跑起来啦~')
})
app.listen(3000, () => {
  console.log('服务在3000端口启动')
})

之后得连数据库(比如MongoDB用Mongoose,MySQL用Sequelize),再建路由文件(比如routes/api.js)处理 /api/users/api/products 这类请求。

最关键的跨域问题咋解决?开发阶段,前端可以用vue.config.js里的devServer.proxy配置代理,把 /api 开头的请求转发到Node服务(比如target设为http://localhost:3000),这样浏览器就不会因为同源策略拦请求,生产阶段,Node端装cors中间件(npm i cors),然后app.use(cors())开启跨域,允许前端域名的请求进来。

前后端传数据,咋设计更稳?

数据交互是项目的“生命线”,设计不好容易出现“前端发了请求,后端没收到;后端返回了数据,前端解析错”的情况,这里得从API设计、请求响应处理、特殊场景(比如实时通信)入手。

首先API设计得规范:推荐用RESTful风格,比如查文章列表用GET /posts,发新文章用POST /posts,改文章用PUT /posts/:id,删文章用DELETE /posts/:id,状态码也得统一:200代表成功,400是参数错误,500是服务器内部故障,这样前后端看状态码就知道哪步出问题了。

然后参数验证不能少,前端传的用户名、密码有没有格式问题?Node端可以用express-validator这类库,在路由里检查参数,比如注册接口要求用户名长度≥3,密码包含大小写,就可以这么写:

const { check, validationResult } = require('express-validator')
app.post('/api/register', [
  check('username').isLength({ min: 3 }),
  check('password').matches(/[A-Z]/).matches(/[a-z]/)
], (req, res) => {
  const errors = validationResult(req)
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() })
  }
  // 验证通过,处理注册逻辑
})

前端这边,得封装axios让请求更省心,新建request.js,加请求拦截器(比如带用户token)、响应拦截器(比如401状态码时跳登录页):

import axios from 'axios'
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 开发/生产环境的基础地址
  timeout: 5000
})
// 请求拦截器:带token
service.interceptors.request.use(config => {
  const token = localStorage.getItem('token')
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
})
// 响应拦截器:处理错误
service.interceptors.response.use(
  response => response,
  error => {
    if (error.response.status === 401) {
      // 跳转到登录页
      window.location.href = '/login'
    }
    return Promise.reject(error)
  }
)
export default service

要是做实时通信(比如聊天、订单状态实时更新),Node可以用Socket.io,前端装socket.io-client,举个聊天的例子:前端建立连接后发消息事件,后端接收并广播给所有人:

// Node端(Socket.io)
const io = require('socket.io')(server)
io.on('connection', socket => {
  socket.on('chatMessage', msg => {
    io.emit('chatMessage', msg) // 广播给所有客户端
  })
})
// Vue2前端
import io from 'socket.io-client'
const socket = io('http://localhost:3000')
socket.emit('chatMessage', '你好~')
socket.on('chatMessage', msg => {
  // 把消息渲染到页面
})

项目部署上线,俩技术咋配合?

开发完得把项目丢到服务器上,Vue2和Node的部署得“默契配合”。

首先前端打包:在Vue2项目里跑npm run build,生成dist文件夹,里面是压缩好的HTML、CSS、JS,把这个dist文件夹放到Node项目的根目录下,然后在Node的app.js里加一行:

app.use(express.static(path.join(__dirname, 'dist')))

这样Node服务就能托管前端静态文件了,用户访问域名时,Node先返回dist/index.html,然后前端再加载JS、CSS。

然后Node服务管理:用pm2(进程管理器)来启动Node服务,避免终端关了服务就挂了,装pm2npm i pm2 -g),然后执行pm2 start app.js --name my-server,它会帮你守护进程,自动重启。

还得用Nginx做反向代理:一方面把xxx.com/api这类请求转发到Node服务(比如http://localhost:3000),另一方面直接返回dist里的静态文件,配置示例:

server {
  listen 80;
  server_name yourdomain.com;
  location / {
    root /path/to/your/node/project/dist;
    try_files $uri $uri/ /index.html; # 解决前端路由404问题
  }
  location /api {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

要是需要HTTPS,就在Nginx里配SSL证书(从阿里云、腾讯云申请免费证书),把listen 80改成listen 443 ssl,再指定证书文件路径,给静态资源加缓存(比如Nginx里配expires 7d;),让用户下次访问更快;Node接口这边,用Redis做缓存,减少数据库查询压力(比如热门文章列表存Redis,5分钟更新一次)。

开发中常见问题咋解决?

就算流程理顺了,开发时还是会碰到一堆“意外状况”,这里列几个高频问题和解法:

  • 跨域又报错了?
    开发阶段检查vue.config.jsdevServer.proxy是不是配错了(比如target地址不对,或者没重启服务);生产阶段确认Node端cors中间件是不是漏装了,或者origin配置太严格(比如该放行前端域名却设成了以外的,但又没匹配上)。

  • Vue2做的页面SEO差咋办?
    单页应用(SPA)的HTML是前端JS渲染的,爬虫抓不到内容,可以用Node做服务端渲染(SSR),比如基于Vue2的Nuxt.js框架,把页面在Node端渲染成HTML再返回给爬虫;或者生成静态HTML文件(比如用vue-cli-plugin-prerender插件),让爬虫能抓到内容。

  • 项目跑起来很慢咋优化?
    前端侧:用路由懒加载(component: () => import('./views/About.vue')),减少首屏加载体积;用webpack-bundle-analyzer分析打包体积,把大依赖拆出来。
    Node侧:数据库查询加索引(比如MongoDB里给常用查询字段建索引),用lean()(Mongoose查询时加lean()能减少数据处理开销);接口加Redis缓存,热门数据不每次查数据库。

最后唠叨一句:Vue2和Node搭伙开发,核心是把“前后端分工、数据交互、部署配合”这些环节理清楚,每个细节(比如跨域配置、API设计)都得盯紧,新手可以先从做个小Demo(比如待办清单、简易博客)入手,把流程跑通了,再往复杂场景(比如用户权限、实时通信)扩展~这样一步步来,就能把这对“JS组合”玩得溜起来啦~

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门