如果你正在考虑将项目从Nuxt 2升级到Nuxt 3,这篇文章会为你提供详细的指导。我们将讨论升级的好处、可能遇到的问题,以及具体的迁移步骤。
升级后的好处很明显。首先,打包后的文件体积更小。这意味着用户加载页面的速度更快。其次,本地开发服务器的启动速度明显提升,节省了开发时间。另外,你可以使用vue 3的语法,让代码更加清晰易读。
Nuxt 3还拆分了服务器层和客户端层,这让项目结构更加清晰。它不再集成Vuex,而是推荐使用Pinia。Pinia比Vuex更简单,使用起来也更方便。同时,Nuxt 3支持Vue 3和TypeScript,让你能跟上最新的技术趋势。
Nuxt 3正式版发布的时间还不长,有些文档还不够完善。你在升级过程中可能会遇到一些问题,需要查阅相关包的文档来找到解决方案。但总的来说,升级的利大于弊。
升级并不是简单运行一条命令就能完成的。正确的方法是新建一个Nuxt 3项目,然后逐步迁移代码。这是因为Nuxt 3几乎完全重写了Nuxt 2,两者在结构和配置上有很大不同。
升级的主要工作包括以下几部分:
将Vue 2的代码改写成Vue 3的语法
修改项目配置
调整数据请求相关的代码
将Vuex迁移到Pinia
官方提供了迁移指南,你可以参考:https://nuxt.com/docs/migration/configuration
下面我们详细看看迁移的具体步骤。
配置方面的变化比较多。首先,建议在项目根目录下新建一个src文件夹,然后在nuxt.config.ts中设置srcDir: 'src/',将源码目录指向这个文件夹。
原来的module.exports写法要改成export default。同样,在配置中引入其他文件时,要使用import语句。
公共的head配置现在要放在app: {head: {}}里。publicRuntimeConfig和privateRuntimeConfig合并成了runtimeConfig。
代理配置也有变化。Nuxt 2中我们常用@nuxtjs/proxy来做代理,Nuxt 3中可以直接使用nitro配置:
nitro: {
devProxy: {
'/api/': {
target: 'http://your-api-url.com',
changeOrigin: true
}
}
}需要注意的是,devProxy只在开发模式下有效,构建后的版本不会有代理功能。
布局的使用方式有所变化。要指定页面使用的布局,可以在页面组件中这样写:
<script setup>
definePageMeta({
layout: "customLayout",
});
</script>页面和组件的命名规则基本没变,主要是将语法改为Vue 3的格式。
assets目录用于存放样式、图片、字体等资源。public目录中的文件会直接放在服务器根目录下,不会经过构建处理,适合放置favicon.ico、robots.txt等文件。
迁移时直接把原来的目录结构搬过来就行。需要注意的是图片引用的方式:原来使用require('assets/img/x.png')的地方,要改成import x from 'assets/img/x.png'。
Nuxt 3区分了客户端和服务器端,这里的中间件指的是客户端中间件。它的主要作用是处理路由,比如参数过滤、重定向等。
例如,要实现根据设备类型重定向,可以先安装@nuxtjs/device包,然后在配置中启用:
modules: [
'@nuxtjs/device'
]在中间件中使用:
const { isMobile, isWindows, isMacOs } = useDevice();
export default defineNuxtRouteMiddleware((to, from) => {
if(isWindows){
return navigateTo('/win')
}
if(isMacOs){
return navigateTo('/mac')
}
})在页面中使用中间件:
<script setup>
definePageMeta({
middleware: ["device"]
})
</script>这是Nuxt 3新增的目录,里面的方法会自动导入到项目中,无需手动引入。你可以在页面、布局、插件和中间件中直接使用这些方法。
例如,在composables/timeTrans.ts中:
type TimeT = (time: number, format: string) => string;
export const timeTrans: TimeT = (time, format) => {
// 时间转换逻辑
return "xx:xx"
}在组件中直接使用:
<script setup>
const t = timeTrans(10202, "xx:xx")
</script>Nuxt 2中需要在配置中指定插件是否在SSR中执行,Nuxt 3中可以通过文件命名来实现。例如,要让插件只在客户端执行,只需将文件命名为*.client.ts。
使用Element UI的例子:
import DragArc from 'drag-arc';
export default defineNuxtPlugin((NuxtApp) => {
return {
provide: {
DragArc: DragArc
}
}
})在组件中使用:
<script setup>
const { $DragArc } = useNuxtApp();
const dragArc = new $DragArc({
el: dom,
value: 10,
change: (v) => {
console.log(v)
}
})
</script>Nuxt 3不再集成Vuex,推荐使用Pinia。首先安装:yarn add pinia @pinia/nuxt
创建store:
import { defineStore } from "pinia";
export const useMainStore = defineStore('main', {
state: () => ({
count: 1
}),
// 其他配置...
})Pinia比Vuex更简单直观,可以直接按文件拆分模块,actions支持同步和异步操作。
这是Nuxt 3变化最大的部分,它将路由、插件、中间件等功能分离到了server目录。
创建API接口:
// server/api/hello.ts
export default defineEventHandler((event) => {
return {
api: 'world'
}
})访问/api/hello会返回{api: 'world'}。
路由处理:
// server/routes/[...].ts
import { sendProxy } from 'h3'
export default defineEventHandler(async (event) => {
const target = new URL(event.req.url, 'http://pyss.top');
return await sendProxy(event, target.toString());
});环境配置:
// env.js
const env = {
test: "https://test",
rc: "https://rc",
prod: "https://prod",
}在配置中使用:
import env from "./env"
export default defineNuxtConfig({
runtimeConfig: {
public: {
...env[process.env.MODE]
}
}
})中间件可以对所有请求进行处理:
// server/middleware/auth.ts
export default defineEventHandler((event) => {
event.node.req.headers['token'] = "12..."
})从Nuxt 2升级到Nuxt 3确实需要一些工作量,但带来的好处是值得的。更好的性能、更清晰的代码结构、更现代化的开发体验,这些都让升级变得有意义。
升级过程需要耐心,建议先在一个小项目上尝试,熟悉了整个流程后再迁移重要项目。遇到问题时,可以查阅官方文档和相关包的文档。随着Nuxt 3生态的完善,升级过程会变得越来越简单。
希望这篇文章能帮助你顺利完成从Nuxt 2到Nuxt 3的升级。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
一款基于Vue.js的SSR框架——Nuxt.js。是vue进行SSR的一个优选开源项目,可免去繁琐的Webpack、nodejs后台服务配置等操作,方便的搭建一个支持SSR的vue项目。
在 Nuxt.js应用中使用Google统计分析服务,或者百度统计分析服务,推荐在 plugins 目录下创建 plugins/ga.js 文件。
在组件和布局中需要使用到相同的数据,改数据需要在nuxt初始化时候获取,而且仅从服务器端获取一次即可。那么该如何实现nux全局初始化功能呢?可以通过vuex来管理全局的一个状态的数据,Nuxt.js 的渲染流程,最先调用的即是 nuxtServerInit 方法。
Nuxt.js基于名为Next的热门React库的SSR实现。 为Vue设计了一个名为Nuxt的类似实现。 熟悉React + Next组合的人会在应用程序的设计和布局中发现一些相似之处。 但是,Nuxt提供Vue特有的功能来为Vue创建强大且灵活的SSR解决方案。
最近在学用nuxt集成koa2做vue后台,发现官方自带脚手架搭建的koa2使用的仍是es5语法,如果想用es6怎么办呢?这是由于自带脚手架在构建koa2时默认的nodemon是没有使用babel编译的,所以我们首先需要在启动命令后加上 --exec babel-node
Nuxt.js 提供了两种发布部署应用的方式:服务端渲染应用部署 和 静态应用部署。静态应用部署就不说了,主要说说服务端渲染应用部署。每次在服务器上执行nuxt build,总是有如下报错,并且jenkins会随之挂掉。
uxt打包的静态文件可以直接放在GitHub上面,然后 TravisCI跟GitHub又很亲切,就选择了TravisCI部署。Travis CI 部署到GitHub项目gh-pages分支上,打开页面发现引用资源404?
现在前端开发一般都是前后端分离,mvvm和mvc的开发框架,如Angular、React和Vue等,虽然写框架能够使我们快速的完成开发,但是由于前后台分离,给项目SEO带来很大的不便,搜索引擎在检索的时候是在网页中爬取数据
Nuxt.js 内置引用了 vuex 模块,所以不需要额外安装。Nuxt.js 会尝试找到应用根目录下的 store 目录,如果该目录存在,它将做以下的事情:Nuxt.js 支持两种使用 store 的方式:普通方式: store/index.js 返回一个 Vuex.Store 实例
最近另一个网站的谷歌联盟申请下来了,记录一下Nuxt.js如何引用谷歌广告的JS代码,当初找了好久。只配置nuxt.config.js文件就可以,下面贴出来。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!