前端 SSR:别让你的网站变成 SEO 黑洞

前端 SSR:别让你的网站变成 SEO 黑洞

毒舌时刻

这网站做得跟黑洞似的,搜索引擎根本爬不进去。

各位前端同行,咱们今天聊聊前端 SSR(服务端渲染)。别告诉我你还在使用纯客户端渲染,那感觉就像在没有窗户的房间里生活——能住,但看不见外面的世界。

为什么你需要 SSR

最近看到一个项目,纯客户端渲染,SEO 排名倒数,用户体验差。我就想问:你是在做网站还是在做内部工具?

反面教材

// 反面教材:纯客户端渲染 // App.jsx import React, { useState, useEffect } from 'react'; function App() { const [data, setData] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { async function fetchData() { setLoading(true); try { const response = await fetch('/api/data'); const result = await response.json(); setData(result); } catch (error) { console.error('Error fetching data:', error); } finally { setLoading(false); } } fetchData(); }, []); return ( <div> <h1>我的网站</h1> {loading ? <div>加载中...</div> : ( <div> {data.map(item => ( <div key={item.id}> <h2>{item.title}</h2> <p>{item.content}</p> </div> ))} </div> )} </div> ); } export default App; 

毒舌点评:这代码,就像在黑暗中摸索,搜索引擎根本找不到你的内容。

正确姿势

1. Next.js SSR

// 正确姿势:Next.js SSR // 1. 安装依赖 // npx create-next-app@latest // 2. 页面组件 // pages/index.js import React from 'react'; export async function getServerSideProps() { // 服务端获取数据 const res = await fetch('https://api.example.com/data'); const data = await res.json(); return { props: { data } }; } export default function Home({ data }) { return ( <div> <h1>我的网站</h1> <div> {data.map(item => ( <div key={item.id}> <h2>{item.title}</h2> <p>{item.content}</p> </div> ))} </div> </div> ); } 

2. Nuxt.js SSR

// 正确姿势:Nuxt.js SSR // 1. 安装依赖 // npx create-nuxt-app@latest // 2. 页面组件 // pages/index.vue <template> <div> <h1>我的网站</h1> <div> <div v-for="item in data" :key="item.id"> <h2>{{ item.title }}</h2> <p>{{ item.content }}</p> </div> </div> </div> </template> <script> export default { async asyncData({ $axios }) { // 服务端获取数据 const { data } = await $axios.get('https://api.example.com/data'); return { data }; } }; </script> 

3. Remix SSR

// 正确姿势:Remix SSR // 1. 安装依赖 // npx create-remix@latest // 2. 路由组件 // app/routes/index.jsx import { json } from '@remix-run/node'; export async function loader() { // 服务端获取数据 const response = await fetch('https://api.example.com/data'); const data = await response.json(); return json({ data }); } export default function Home() { const { data } = useLoaderData(); return ( <div> <h1>我的网站</h1> <div> {data.map(item => ( <div key={item.id}> <h2>{item.title}</h2> <p>{item.content}</p> </div> ))} </div> </div> ); } 

4. React 18 SSR

// 正确姿势:React 18 SSR // 1. 安装依赖 // npm install react react-dom express // 2. 服务端代码 // server.js import express from 'express'; import React from 'react'; import { renderToString } from 'react-dom/server'; import App from './App'; const app = express(); app.get('*', async (req, res) => { // 服务端获取数据 const response = await fetch('https://api.example.com/data'); const data = await response.json(); const html = renderToString(<App data={data} />); res.send(` <!DOCTYPE html> <html> <head> <title>我的网站</title> </head> <body> <div>${html}</div> <script> window.__INITIAL_DATA__ = ${JSON.stringify(data)}; </script> <script src="/bundle.js"></script> </body> </html> `); }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); // 3. 客户端代码 // App.jsx import React from 'react'; function App({ data }) { return ( <div> <h1>我的网站</h1> <div> {data.map(item => ( <div key={item.id}> <h2>{item.title}</h2> <p>{item.content}</p> </div> ))} </div> </div> ); } export default App; // 4. 客户端入口 // client.js import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <React.StrictMode> <App data={window.__INITIAL_DATA__} /> </React.StrictMode> ); 

毒舌点评:这才叫前端 SSR,服务端渲染内容,搜索引擎友好,用户体验好,再也不用担心 SEO 问题了。

Read more

GLM-4-9B-Chat-1M部署教程:vLLM多模型路由+Chainlit前端动态切换演示

GLM-4-9B-Chat-1M部署教程:vLLM多模型路由+Chainlit前端动态切换演示 1. 为什么需要部署GLM-4-9B-Chat-1M这样的大模型 你有没有遇到过这样的场景:要翻译一份长达50页的技术文档,中间还夹杂着大量专业术语和图表说明;或者需要从一份百页合同里精准定位某一条款的法律效力描述;又或者想让AI帮你分析整本产品需求文档,找出所有潜在的逻辑矛盾点?传统大模型在处理这类任务时往往力不从心——要么直接报错“上下文超限”,要么关键信息在长文本中“消失”得无影无踪。 GLM-4-9B-Chat-1M就是为解决这个问题而生的。它不是普通的大语言模型,而是真正能“吞下整本书”的长文本专家。支持100万token上下文长度(约200万中文字符),相当于一次性读完三本《三体》全集还能准确回答细节问题。更难得的是,它不只是“能装”,还“装得明白”——在LongBench-Chat等权威长文本评测中表现优异,证明它不仅能记住海量信息,更能理解、推理和精准提取。 但光有强大能力还不够。实际使用中,我们常面临两个现实难题:一是单个模型服务难以兼顾不同任务需求(比如有时要快

【FastapiAdmin V2.0.0】一套现代、开源、全栈融合的中后台快速开发平台,后端采用Fastapi + SQLAlchemy,前端采用基于 Vue3 + Typescript

【FastapiAdmin V2.0.0】一套现代、开源、全栈融合的中后台快速开发平台,后端采用Fastapi + SQLAlchemy,前端采用基于 Vue3 + Typescript

FastapiAdmin v2.0.0 一套现代、开源、全栈融合的中后台快速开发平台,给个⭐️支持一下 📘 项目介绍(作者:@1014TaoTao) FastapiAdmin 是一套 完全开源、高度模块化、技术先进的现代化快速开发平台,旨在帮助开发者高效搭建高质量的企业级中后台系统。该项目采用 前后端分离架构,融合 Python 后端框架 FastAPI 和前端主流框架 Vue3 实现多端统一开发,提供了一站式开箱即用的开发体验。 代码地址: github:https://github.com/1014TaoTao/FastapiAdmin giee:https://gitee.com/tao__tao/FastapiAdmin gitcode: https://gitcode.com/qq_36002987/fastapi_vue3_

Qwen3-VL-WEBUI建筑图纸生成:从草图到CAD转换实战

Qwen3-VL-WEBUI建筑图纸生成:从草图到CAD转换实战 1. 引言:AI驱动建筑设计的范式变革 1.1 业务场景描述 在建筑设计领域,设计师常常需要将手绘草图快速转化为标准CAD图纸。传统流程依赖人工识图与AutoCAD手动重绘,耗时长、成本高、易出错。尤其在方案初期频繁迭代阶段,这一瓶颈尤为突出。 随着多模态大模型的发展,视觉-语言模型(VLM) 正在成为打通“人→图→机”闭环的关键技术。阿里云最新发布的 Qwen3-VL-WEBUI 提供了一套开箱即用的解决方案,能够实现从手绘草图到结构化图纸代码的端到端生成,极大提升设计自动化水平。 1.2 痛点分析 当前主流做法存在三大痛点: - 识别精度低:传统OCR和图像识别难以理解建筑符号语义 - 结构化输出缺失:无法直接生成可编辑的CAD或Draw.io格式 - 交互效率差:缺乏自然语言指令控制能力,修改困难 而 Qwen3-VL-WEBUI 凭借其强大的视觉编码能力和空间感知机制,为解决上述问题提供了全新路径。 1.3

前端如何实现 [记住密码] 功能

前端如何实现 [记住密码] 功能

文章目录 * 一、核心实现原理:不是记住,而是“提示填充” * 二、技术实现方案详解 * 方案一:依赖浏览器原生行为(最常用) * 方案二:前端持久化存储(需谨慎考虑) * 三、安全考量与实践准则 * 四、最佳实践总结 我们在访问网站的时候,发现很多的登录页面都是有记住密码的功能的。 如gitee码云的登录页面: 一、核心实现原理:不是记住,而是“提示填充” 首先要澄清一个常见的误解:前端的“记住密码”功能通常并不直接存储你的密码明文。它的核心原理是:请求浏览器将账号密码保存到其密码管理器中,并在下次检测到对应登录表单时,自动或提示用户填充。 下图清晰地展示了这一核心流程: 服务器浏览器密码管理器登录表单用户服务器浏览器密码管理器登录表单用户首次登录与保存后续自动填充1. 输入账号密码,勾选“记住我”2. 提交表单,发送登录请求3. 返回登录成功响应4. 触发浏览器提示:“是否保存密码?”5. 用户点击“保存”6. 将账号、