Nuxt重构的填坑之路

我的个人网站是用vuecli写的,SEO不忍直视。于是用Nuxt重构了代码,过程中踩了无数坑,记录如下

 

一:body样式不生效

正常的body样式设置不能生效,需要在nuxt.config.js中配置

1、设置bodyAttrs的class属性,该属性值对应一个类名

2、该类名所在的css文件,需要在nuxt.config.js中设置一下路径

二:store的用法差异

声明时差异:export出一个函数

 调用时差异:import的是个函数,所以要先执行函数

三:Nuxt打包

Nuxt打包分为两种,一种是打成静态页面,一种是以SSR的形式打包。

1、打成静态页面

如果需要打包成静态资源,需要执行npm run generate

且nuxt.config.js需要做如下配置

2、SSR打包

npm run build

四:Nuxt的Vuex使用

在plugins文件夹下,放一个vuex.js文件,并在nuxt.config.js中引入。

然后在store文件夹下管理状态才能正常使用

五:引入iconfont

只需要将iconfont的资源文件放在assets文件夹下,然后在nuxt.config.js的css属性写上地址即可

六:引入axios报错

报错信息如下

require() of ES Module /Users/sunquan/WebstormProjects/SunqBlog-UserSide-Nuxt/node_modules/axios/index.js from /Users/sunquan/WebstormProjects/SunqBlog-UserSide-Nuxt/node_modules/vue-server-renderer/build.dev.js not supported. Instead change the require of index.js in /Users/sunquan/WebstormProjects/SunqBlog-UserSide-Nuxt/node_modules/vue-server-renderer/build.dev.js to a dynamic import() which is available in all CommonJS modules.

大概意思是vue-server-renderer需要commonJS规范的组件,但是axios是ES6规范的组件,不能用。后来降低了axios版本后不再报错,版本号为axios@0.18.0。可能是因为老版本用的commonJS规范

七:Nuxt配置本地代理

使用 Nuxt.js 的服务器中间件

1、在 Nuxt.js 项目的根目录下创建一个名为 middleware 的文件夹(如果已存在则跳过此步骤)。

2、在 middleware 文件夹中创建一个名为 proxy.js 的文件,并添加以下代码:

const { createProxyMiddleware } = require('http-proxy-middleware')
module.exports = function (req, res, next) {if (req.url.startsWith('/api')) {// 将请求代理到目标地址createProxyMiddleware('/api', { target: 'http://39.104.22.73:8888/', changeOrigin: true,pathRewrite: {'^/api': '' //路径重写},pathRequiresRewrite: {'^/api': ''}})(req, res, next)} else {next()}
}

打开 nuxt.config.js 文件,将以下代码添加到 serverMiddleware 配置项中:

serverMiddleware: ['~/middleware/proxy'
],

重启项目后,以 /api 开头的请求将被代理到 http://api.example.com

注意:proxy.js中的pathRewrite和pathRequiresRewrite的属性配置,网上的资料都没有写,导致代理不生效

八:Nuxt2使用echarts5

Nuxt引入echarts有两种方式,

  1. 使用Nuxt的echarts然后配置
  2. 直接安装,正常引入即可

我直接使用的第二种,但是引入echarts5时报错。报错Unexpected token export

通常是由于Nuxt.js默认使用的是CommonJS模块系统,而ECharts 5使用ES模块语法所致。需要对ECharts 5的ES模块语法进行转译。

为了解决这个问题,你可以尝试以下方法:

在nuxt.config.js中设置

  build: {transpile: [/echarts/, /zrender/]},

其中zrender为echarts依赖的底层组件,注意填写,否则可能无法生效。

配置之后,Nuxt会自动对ES模块进行转义,无需对转义进行额外配置,这个还是很方便的

九:Nuxt到底能做多少SEO优化?

通过Nuxt配置,即使使用了SSR模式,打包后的静态网站在浏览器的Sources面板中仍然无法看到完整的网页内容。这是因为Nuxt.js默认情况下在生成静态文件时只包含首页的DOM结构,其他页面的DOM结构在浏览器中通过客户端渲染动态生成。

Nuxt.js通过服务器端渲染(SSR)模式来解决一些SEO问题,但并不能完全解决所有SEO问题。

如下为使用Nuxt打包成静态页面前后,网站sources面板看到的html

未使用Nuxt
未使用Nuxt generate前的Source

使用Nuxt generate后的source

Nuxt 打包成静态页面后,对SEO优化没实质性改善。以SSR打包后,效果会好一些

如下为chatGPT对SSR打包模式的讲解:

虽然在浏览器的"Sources"面板中无法直接看到完整的HTML代码,但搜索引擎爬虫通常可以爬取到Nuxt.js打包的静态网站的完整HTML内容。
当使用Nuxt.js进行服务器端渲染(SSR)并生成静态网站时,每个路由都会被预先生成为一个HTML文件。这些HTML文件包含了相应路由页面的完整静态内容,包括初始化数据、组件内容以及其他相关资源。
搜索引擎的爬虫会模拟浏览器的行为,发送HTTP请求并获取网页内容,爬取到的内容也包括完整的HTML。它们可以处理JavaScript渲染,并从静态HTML中获取页面内容来进行索引。
因此,尽管在浏览器的"Sources"面板中我们无法直接查看到完整的HTML代码,但搜索引擎爬虫通常可以正确抓取和索引由Nuxt.js生成的静态网站的完整HTML内容。

 暂且相信它一次,我把Nuxt重构后的代码部署到Nginx上,看看年底百度能不能收录到我的网站。到时候再把结果公布到这里

十:部署到Nginx

1、部署SSR模式包

SSR模式,在本地npm run build后。将如下文件上传到nginx的html目录下

注意Nuxt跟vue-cli是不同的,Nuxt除了.nuxt目录还要上传另外几个文件。然后在nuxt.config.js同级路径下执行,npm install,npm run start。这时服务器的3000端口就跑起了咱的应用

然后,我们需要配置代理,将你需要的端口号(比如80)代理到3000端口上即可 

具体就是在nginx.conf里面location中这样配置即可

server {listen       80 default_server;listen       [::]:80 default_server;server_name  _;#root         /usr/share/nginx/html/sqblog/.nuxt/dist/client;index index.html;# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;location / {proxy_pass http://localhost:3000;               proxy_set_header Host $host;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header X-Real-IP $remote_addr;}
}

2、部署静态页面模式网页

相对来说以这种模式打包,部署起来相对简单些。直接单独将dist文件夹上传到Nginx的html路径下即可,无序而外文件。

主要问题一般出在文件读取权限上,即访问时报404。

具体解决办法可以问chatgpt,先创建用户与用户组,然后将文件归属该用户组,最后给文件赋权限即可。

静态网页上传到Nginx的html目录下,依旧需要配置nginx.conf

 如果你想将静态网页放在nginx的html的dist文件夹下,并希望在URL的某个端口号后不需要写dist就可以打开页面,你可以尝试使用rewrite规则来实现。如果你希望在不同的端口号上对应不同的文件夹,可以在nginx的配置文件中添加多个server块,每个块指定不同的端口号和对应的文件夹路径。以下是一个示例配置:

server {listen 8080;root /path/to/nginx/html/dist1;index index.html;location / {try_files $uri $uri/ /index.html;}
}server {listen 8081;root /path/to/nginx/html/dist2;index index.html;location / {try_files $uri $uri/ /index.html;}
}

如下为设置post请求代理:

要在Nginx中配置静态网页的POST请求代理,你可以使用proxy_pass指令来将POST请求反向代理到另一个服务器或应用程序。其实就是在上面配置的server模块中,再加一个location。

以下是一个示例配置:

server {listen 80;server_name example.com;location / {root /path/to/your/static/files;try_files $uri $uri/ =404;}location /api {rewrite ^/api(.*)$ $1 break;proxy_pass http://backend_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

上面示例中,在location /api块中添加了一个rewrite指令。这个指令会把请求URL中的/api前缀去掉,并把剩余部分作为反向代理的路径。

这样,如果你的静态网站中的POST请求以/api开头,Nginx将会代理这些请求至后端服务器,并将响应返回给客户端。URL中的/api前缀将被移除,后端服务器收到的请求将是不带前缀的形式。

代理转发后的效果如下:

// 浏览器看到的请求
http://39.104.22.73/api/getarticlenum/foreend// 代理后实际的请求;
http://39.104.22.73:8888/getarticlenum/foreend

十:部署后的启动

关于启动服务

直接npm run start,坚持没几分钟服务就挂了。可以使用forever获得持久的服务

forever start -c "npm run start" ./

关于代码更新后,重启服务。首先干掉之前的进程

sudo lsof -i :3000

上述命令将显示占用端口 3000 的进程的详细信息,包括 PID(进程ID)。你需要记下该 PID,然后使用以下命令终止该进程:

kill <PID>

如果杀不掉进程,需要先关掉forever进程

forever list  // 找到该forever的名称
forever stop 名称  // 关掉forever进程

然后重新执行,forever start -c "npm run start" ./

十一:Nuxt不支持svg

Nuxt原生不支持svg格式,需要额外自己安装转换器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/17849.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统;实现NoC的RTL设计

【ProNoC】Chap.1 ProNoC生成2x2的mesh型的4核片上网络系统&#xff1b;实现NoC的RTL设计 0. NoC多核片上网络生成器ProNoCProNoC的功能实现 1. 生成一个叫做Mor1kx SoC的单个Tile&#xff08;包含NI网络接口&#xff09;1.1 打开ProNoC用于生成Tile的GUI界面1.2 为Tile添加时钟…

【AI绘图学习笔记】transformer

台大李宏毅21年机器学习课程 self-attention和transformer 文章目录 Seq2seq实现原理EncoderDecoderAutoregressive自回归解码器Non-Autoregressive非自回归解码器Corss-attention 总结TrainingtrickCopy MechanismGuided AttentionBeam Search强化学习&#xff08;Reinforceme…

MATLAB转C

1、先写好一个 函数调用。点击应用程序----MATLAB coder 打开一个对话框&#xff0c;确定C语言代码的工程名。 2、添加函数文件 3、添加文件后&#xff0c;单击变量&#xff0c;选择变量类型和矩阵大小。注意&#xff0c;如果选择的不是double型的数据类型&#xff0c;MATLAB…

Qt功能优化:Qt语音助手

Qt功能优化:Qt语音助手 文章目录 Qt功能优化:Qt语音助手一、效果图二、使用步骤1. .pro部分2. .h部分3. .cpp部分总结一、效果图 点击界面右上方类似于耳机的按钮,即可召唤出语音助手,来为您讲解我们的项目。如下图所示: 二、使用步骤 1. .pro部分 代码如下: QT …

【Chisel学习】设计n位超前进位加法器生成器(Carry-Lookahead Adder Generator)

Chisel学习——设计n位超前进位加法器生成器&#xff08;Carry-Lookahead Adder Generator) 文章目录 Chisel学习——设计n位超前进位加法器生成器&#xff08;Carry-Lookahead Adder Generator)一&#xff0c;项目简介二&#xff0c;理论基础2.1 Chisel2.1 硬件生成器&#xf…

OpenAI GPT-3模型详解

OpenAI GPT-3模型详解 针对文本生成和代码生成这两大类场景&#xff0c;OpenAPI分别提供了GPT-3和Codex模型&#xff0c; 模型描述GPT-3一组能够理解和生成自然语言的模型Codex一组可以理解和生成代码的模型&#xff0c;包括将自然语言转换为代码 本文将为大家详细介绍这两个…

Vue3通透教程【十七】Vite构建TS版本Vue项目

文章目录 &#x1f31f; 写在前面&#x1f31f; 创建TS版本的Vue3项目&#x1f31f; 插件安装&#x1f31f; 写在最后 &#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue3 的相关技术文章&#…

用 ChatGPT 重构工作流程

如果你第一次听说 ChatGPT&#xff0c;那你要反思一下自己的信息获取渠道是不是出了问题&#xff0c;作为 AI 时代最强代表&#xff0c;你一定要亲自去体验一下&#xff0c;而不是道听途说。 公司需要降本增效&#xff0c;个体也一样&#xff0c;在工作中畅快应用 AI 来帮助自己…

Qt:可视化UI设计

1、创建项目&修改组件的对象名字和显示文本内容 创建一个 Widget Application 项目类 QDialog&#xff0c;在创建窗体时选择基类 QDialog&#xff0c;生成的类命名为 QWDialog&#xff0c;并选择生成窗体。 在界面设计时&#xff0c;对需要访问的组件修改其objectName&am…

【Qt设计开发】GUI界面设计开发

文章目录 一、Qt简介和下载安装二、Qt入门2.1 创建第一个项目2.2 快捷键和命名规范2.3 Qt项目和VS2022项目相互转换 三、Qt基础3.1 Qt对象树和窗口坐标系概念3.2 QPushButton3.3 信号和槽(signals and slots)3.3.1 pushbutton关闭窗口3.3.2 自定义信号和槽 3.4 Lambda表达式3.5…

【饭谈】ChatGpt如果让软件ui都消失的话,那ui自动化测试该何去何从?

“未来的软件长什么样&#xff1f;” 一位妹子产品经理问我&#xff1a;“你说说未来的软件ui是什么样的&#xff1f;听到这个问题我先是诧异了一下&#xff0c;随即陷入了沉思。” 我看着眼前的产品经理&#xff0c;她是一位比较年轻干练的女强人类型&#xff0c;1.65的身材…

chatgpt赋能python:Python如何设计UI:最佳实践和关键洞察

Python如何设计UI&#xff1a;最佳实践和关键洞察 作为一种支持多种编程范式和用途的高级语言&#xff0c;Python已经成为了许多技术创造者和创业者的首选工具之一。但是&#xff0c;Python最初并不是为了动态用户界面&#xff08;Dynamic User Interface&#xff0c;简称UI&a…

基于Qt的ui图形化界面进行的界面设计

qt初学者往往会发现这样的一个问题——无论是我买的相关的书&#xff0c;还是网上博客的内容&#xff0c;基本全都是利用纯代码的形式来进行界面设计的。而初学者对各种控件的代码实现并不熟悉&#xff0c;往往在这里耗费大量时间。故本篇文章介绍了通过ui图形化界面进行设计的…

职场神器:只需三分钟,AI工具让我变成插画师

绘画技能 一般来说&#xff0c;搞技术的&#xff0c;写文章的&#xff0c;在绘画的这棵技能树上的加点往往都是零。 而且绘画和音乐这些技能往往是需要一定天赋的&#xff0c;它不像写代码和开挖机&#xff0c;后两者往往经过培训以后人人都能学会&#xff0c;而前两者没有一…

设计师与 ChatGPT 应该如何共处?

ChatGPT 的火爆&#xff0c;导致众多设计师开始忧心忡忡&#xff01; ChatGPT那么厉害&#xff0c;是不是设计师要被取代了&#xff1f;&#xff1f;? ChatGPT以及很多 AI 生成插画和图片的工具和软件&#xff0c;不仅为我们带来了惊喜&#xff0c;也让我们感受到了不少担忧!…

美国人真的开始害怕AI了

ChatGPT 发布半年后&#xff0c;人类终于意识到&#xff0c;世界已经彻底改变了。 这变化&#xff0c;比以往任何时候都更迅猛&#xff0c;更让人措手不及。 劳动者&#xff0c;学者&#xff0c;技术专家&#xff0c;NGO&#xff0c;政府&#xff0c;人们不得不作出应对。 这是…

三星引入ChatGPT半个月泄密3次;MidJourney V5相机镜头完整参数列表;万字长文,拆解投身大模型3个本质问题 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『三星引入 ChatGPT 半个月泄密三次』数据安全是个大问题啊&#xff01; 据韩国媒体报道&#xff0c;三星电子 (Samsung Electronics)…

2021高考成绩查询理综各科得分,2021河南高考总分及各科分数 满分分数是多少

河南高考试卷总分为750分&#xff0c;其中语文科目满分150分&#xff1b;数学科目满分150分&#xff1b;英语科目满分150分&#xff1b;文综和理综各自均为300分。 2021河南高考各科及满分分数设置考试科目顺序满分分数高考总分 语文150分750分 文数/理数150分 文综/理综300分 …

ChatGPT写的2023全国高考作文,什么水平?

2023年全国统一高考&#xff0c;1291万考生赶赴考场&#xff0c;高考语文科目考试结束后&#xff0c;备受关注的各地高考作文题目也已经新鲜出炉&#xff01; 随后&#xff0c;网上也掀起了用Chat-GPT写高考作文的热风&#xff0c;小编用全国甲卷做了尝试&#xff0c;以下是自…

恩平高考成绩查询2021,高考成绩放榜,恩平文理科这两名高分考生厉害了!

(来源&#xff1a;江门日报恩平记者站) 原标题&#xff1a;高考成绩放榜&#xff0c;恩平文理科这两名高分考生厉害了&#xff01; 2020广东高考放榜 今天下午 广东省高考成绩正式公布 文科本科线&#xff1a;430分理科本科线&#xff1a;410分 下面一起来看看 今年高考恩平文科…