ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

使用 prerender-spa-plugin 为 Vue Webpack 项目实现 SEO 预渲染

使用 prerender-spa-plugin 为 Vue Webpack 项目实现 SEO 预渲染 使用 prerender-spa-plugin 为 Vue Webpack 项目实现 SEO 预渲染【免费下载链接】webpackA full-featured Webpack vue-loader setup with hot reload, linting, testing css extraction.项目地址: https://gitcode.com/gh_mirrors/we/webpack本文基于 vue-webpack-boilerplate 模板的官方文档docs/prerender.md讲解如何为纯客户端渲染的 Vue SPA 引入预渲染Prerendering能力以解决搜索引擎无法抓取 JS 渲染内容的问题。通过阅读本文你将掌握prerender-spa-plugin的安装、在 template/build/webpack.prod.conf.js 中的插件配置、vue-routerhistory 模式的开启方式以及如何判断一个项目该用构建期预渲染还是服务端定期重渲渲染。为什么需要预渲染SPA 的 SEO 困境使用 Webpack vue-loader构建的 Vue 应用本质上是纯客户端渲染CSR的 SPA浏览器先加载空的index.html再由 JavaScript 动态创建 DOM。搜索引擎爬虫虽然大多能执行 JavaScript但其执行成本高、时效性不稳定对于内容型页面仍然存在抓取不全甚至完全抓不到内容的风险。因此对于 SEO 敏感的页面业界通常有三种缓解思路服务端渲染SSR在服务器上实时渲染出完整 HTML代价是需要引入 Node.js 服务端运行时改造成本最高预渲染Prerendering在构建阶段把每个路由渲染成静态 HTML随产物一起发布完全不需要运行时第三方预渲染服务如 Prerender.io、Netlify由外部服务定期抓取并缓存渲染后的页面。本文的主角prerender-spa-plugin属于第二种方案它是经官方验证可配合 Vue 使用的 Webpack 插件。预渲染的适用边界预渲染的适用场景很明确页面内容在发布后基本不再变化。例如营销页、产品介绍、文章、FAQ、落地页等静态内容页面一次构建、永久生效最划算。反之如果页面内容频繁变化如用户生成内容、实时数据仪表盘、评论区则不适合构建期预渲染——此时文档建议改用 Prerender.io 与 Netlify 提供的定期重渲渲染服务由它们在服务器端按计划重新渲染内容供搜索引擎抓取。方案渲染时机适用内容运行时依赖prerender-spa-plugin每次npm run build基本不变的静态页面无Prerender.io / Netlify 等服务定期重渲频繁变化的内容无外部服务SSR每次请求时实时、个性化内容需要 Node 服务端在 vue-webpack-boilerplate 中接入 prerender-spa-plugin以下四步完整覆盖从安装到生效的全过程所有配置都落在生产构建链路中即npm run build对应的 template/build/webpack.prod.conf.js。第 1 步安装开发依赖npm install --save-dev prerender-spa-plugin该插件只参与构建过程运行时并不需要因此作为devDependencies安装。模板自带的脚手架由 meta.js 定义会生成独立的项目安装前请先按模板说明完成vue init webpack my-project与npm install。第 2 步在生产 Webpack 配置中引入插件打开template/build/webpack.prod.conf.js在文件顶部与其他 import 声明放在一起加入// This line should go at the top of the file where other imports live in const PrerenderSpaPlugin require(prerender-spa-plugin)该文件当前顶部已经通过require引入了webpack、webpack-merge、HtmlWebpackPlugin、UglifyJsPlugin等模块参见 template/build/webpack.prod.conf.js新插件按同样的风格加入即可。第 3 步在 plugins 数组中注册插件找到plugins数组其中已包含HtmlWebpackPlugin、ExtractTextPlugin等生产插件加入如下配置new PrerenderSpaPlugin( // Path to compiled app path.join(__dirname, ../dist), // List of endpoints you wish to prerender [ / ] )参数说明第一个参数编译产物的路径。config.build.assetsRoot的默认值就是path.resolve(__dirname, ../dist)见 template/config/index.js因此path.join(__dirname, ../dist)与产物输出目录一致第二个参数需要预渲染的路由端点数组。若还要预渲染/about和/contact改为[ /, /about, /contact ]即可。第 4 步为 vue-router 开启 history 模式预渲染依赖真实的路由路径因此必须开启vue-router的 history 模式否则默认的 hash 模式会生成带#的地址无法被爬虫按路径抓取。在路由初始化处修改const router new VueRouter({ mode: history, routes: [...] })模板默认的 template/src/router/index.js 创建Router实例并注册/路由指向HelloWorld组件在此基础上加入mode: history即可。注意history 模式依赖服务器把所有路径回退到index.html如 Nginx 的try_files或 Netlify 的 redirects 规则否则用户直接访问/about会得到 404。结合源码理解预渲染的落点预渲染在构建流程中的位置在 template/build/webpack.prod.conf.js 中生产构建依次执行HtmlWebpackPlugin生成带资源哈希的dist/index.html第 65-80 行ExtractTextPlugin抽取并压缩 CSSUglifyJsPlugin压缩 JSCommonsChunkPlugin拆分 vendor/manifest/app 块CopyWebpackPlugin把static/目录原样复制到产物目录第 116-122 行。PrerenderSpaPlugin注册在同一个plugins数组中会在上述构建完成、产物就绪后启动一个无头浏览器加载dist/index.html并访问列表中的每个路由端点把渲染出的最终 HTML 回写为对应路径的静态文件。也就是说它发生在打包完成之后、产物发布之前属于构建期的“最后一公里”。产物路径与静态资源基路径的配合预渲染出的 HTML 仍然引用构建生成的哈希资源因此需要保证 template/config/index.js 中的assetsPublicPath默认/与你的部署域名路径一致。若部署在子路径如https://example.com/app/应同步调整assetsPublicPath与预渲染产物的引用避免静态资源 404。验证与常见问题验证预渲染是否生效执行npm run build完成生产构建查看dist/目录应出现dist/index.html以及按需的dist/about.html等用浏览器打开dist/index.html并查看页面源代码若能直接看到 Vue 组件渲染出的 DOM 结构而非空壳div idapp/div说明预渲染成功。常见问题排查问题排查方向预渲染出的 HTML 为空壳确认路由列表包含目标路径确认组件渲染不依赖浏览器 API如window、localStorage否则需在预渲染阶段做降级处理hash 模式未生效确认vue-router已设置mode: history刷新子路由 404检查服务器回退配置history 模式需要把未知路径重写回index.html构建报错确认插件已作为 devDependency 安装且 Node 版本满足模板要求node 6.0.0见 template/package.json小结预渲染适用于内容基本不变的静态页面构建期即可产出可被搜索引擎直接抓取的 HTML接入只需四步安装插件、require引入、在 template/build/webpack.prod.conf.js 的plugins数组注册并列出端点、开启 vue-router 的 history 模式对于频繁变化的内容文档推荐改用 Prerender.io、Netlify 等定期重渲服务而非构建期预渲染预渲染是构建期方案不引入运行时依赖也不改变 template/config/index.js 中的产物路径配置只需在部署时配合 history 模式的服务端回退规则。【免费下载链接】webpackA full-featured Webpack vue-loader setup with hot reload, linting, testing css extraction.项目地址: https://gitcode.com/gh_mirrors/we/webpack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表