Nuxt3 初次使用记录作为Nuxt 的初学者,在首次使用 Nuxt 框架进行项目开发时,遇到了很多问题,记录一下: N
作为Nuxt 的初学者,在首次使用 Nuxt 框架进行项目开发时,遇到了很多问题,记录一下:
Nuxt.js 是什么
Nuxt.js 是一个基于 Vue.js 的通用应用框架,旨在简化Vue.js 应用的开发,特别是在服务端渲染(SSR)、静态站点生成等方面提供了便捷的配置和工具。
在学习 Nuxt 之前需要掌握以下前置知识:
- Vue.js
- HTML、CSS、JavaScript
- 前端构建工具(Webpack、babel 等)
- 服务端知识(如 Node.js、Express 等)
- Git 版本控制工具
如何搭建一个 Nuxt.js 项目
- 创建一个新的入门项目
npx nuxi@latest init <project-name>
- 使用 Visual Atudio Code 打开项目,并安装依赖:
code <project-name> yarn
- 启动项目
yarn dev --open
Nuxt3 常用组件使用
NuxtPage
使用 <NuxtPage>
组件才能显示位于 pages/
目录中的页面。
NuxtImg
<img />
标签改用 <NuxtImg />
。
- 使用内置提供程序优化本地和远程映像
- 将
src
转换为提供程序优化的 URL - 根据
width
和height
自动调整图片大小 - 提供
sizes
选项时生成响应式尺寸 - 支持本机延迟加载以及其他
<img>
属性
NuxtLink
自定义配置
nuxt3 自定义路由
在 nuxt3 中,路由是由页面文件中的目录结构定义的。因为底层使用的 Vue-router,所以可以自定义路由。
app 目录下新建 router.option.ts
文件,自定义正则表达式来匹配动态路径
const reRouter = [
{
path: '/product/:modelTypeNo([a-z0-9]+)/:id(\\d+)/:param(canshu|tupian|zixun|dealer)?/',
component: () => import('../pages/productDetail/[id].vue'),
},
];
export default {
routes: () => [...reRouter],
};
环境配置
.env
,默认;
.env.development
,本地开发环境;
.env.test
,测试环境;
.env.production
,生产环境
BASE_URL = xxx # 接口域名
URL = xxx #前端域名
ENV = 'development' ## 环境名称
nuxt.config.ts
文件中进行配置:
export default defineNuxtConfig({
runtimeConfig: {
public: {
env: process.env.ENV,
},
},
});
通过 useRuntimeConfig()
,获取 nuxt.config.ts
中配置的 runtimeConfig
const config = useRuntimeConfig();
console.log(config.public.env);
package.json
文件中配置,不同环境执行不同的命令:
"scripts": {
"dev": "nuxt dev",
"dev:test": "nuxt dev --dotenv .env.test",
"dev:prod": "nuxt dev --dotenv .env.production",
"build": "nuxt build",
"build:test": "nuxt build --dotenv .env.test",
"build:prod": "nuxt build --dotenv .env.production",
},
assetsInlineLimit
图片转 base64 编码的阈值(默认是 4096字节)。为防止过多的 http 请求,nuxt 会将小于此阈值的图片转为 base64 格式,可根据实际需求进行调整。
// nuxt.confug.ts
export default defineNuxtConfig({
vite: {
build: {
assetsInlineLimit: 5,
},
},
})
Nuxt3 使用 Unocss
unocss 默认 1rem = 4px,也就是说如果你设置了 m-20(20的单位是像素),那么实际的效果就是5rem,这样的效果是不对的,所以,我们需要改一下 Unocss 的配置
// 1. 安装
yarn add @unocss/preset-rem-to-px -D
yarn add @unocss/preset-uno -D
// 2. 配置
// uno.config.ts
import { defineConfig } from 'unocss';
import presetRemToPx from '@unocss/preset-rem-to-px';
import presetUno from '@unocss/preset-uno';
export default defineConfig({
// ...UnoCSS options
presets: [
presetUno(),
presetRemToPx({
baseFontSize: 4, // 设置为4,实现 w-1=1px
}),
],
});
// 3. 结合 px-to-vw,实现页面自适应
yarn add postcss-px-to-viewport-8-plugin -D
// nuxt.config.ts
export default defineNuxtConfig({
postcss: {
plugins: {
'postcss-px-to-viewport-8-plugin': {
unitToConvert: 'px', // 需要转换的单位,默认为"px"
viewportWidth: 375, // 设计稿的视口宽度
unitPrecision: 5, // 单位转换后保留的精度
propList: ['*', '!font-size'], // 能转化为vw的属性列表,!font-size表示font-size后面的单位不会被转换
viewportUnit: 'vw', // 希望使用的视口单位
fontViewportUnit: 'vw', // 字体使用的视口单位
// 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
// 下面配置表示类名中含有'keep-px'都不会被转换
selectorBlackList: ['keep-px'],
minPixelValue: 1, // 设置最小的转换数值,如果为1的话,只有大于1的值会被转换
mediaQuery: false, // 媒体查询里的单位是否需要转换单位
replace: true, // 是否直接更换属性值,而不添加备用属性
exclude: [/node_modules/], // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件
include: [/src/], // 如果设置了include,那将只有匹配到的文件才会被转换
landscape: false, // 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
landscapeUnit: 'vw', // 横屏时使用的单位
landscapeWidth: 1338, // 横屏时使用的视口宽度
},
},
},
});
自定义 unocss class
// nuxt.config.js
export default defineNuxtConfig({
unocss: {
nuxtLayers: true,
rules: [
[
'text-ellipsis',
{ 'text-overflow': 'ellipsis', overflow: 'hidden', 'white-space': 'nowrap' },
],
[
'text-2-ellipsis',
{
overflow: 'hidden',
' word-break': 'break-all',
'text-overflow': 'ellipsis',
display: '-webkit-box',
'-webkit-line-clamp': '2',
'-webkit-box-orient': 'vertical',
},
],
],
},
});
ssr
获取接口数据时,定义的接口方法不需要放在生命周期中执行,直接放在 <script>
里执行
如果页面渲染有问题,可以先去看是不是html标签使用不当。
设置 TDK
Nuxt 提供了三种方式来设置 TDK:
nuxt.config.ts
文件中全局设置
export default defineNuxtConfig({
app: {
head: {
title: '页面标题',
meta: [
{
name: 'description',
content: '页面描述',
},
{
name: 'keywords',
content: '关键字1, 关键字2',
},
{
property: 'og:title',
content: '分享出去的页面标题',
},
],
}
}
})
- 使用
useHead
useHead({
title: '页面标题',
meta: [
{
name: 'description',
content: '页面描述',
},
{
name: 'keywords',
content: '关键字1, 关键字2',
},
{
name: 'og:title',
content: '分享出去的页面标题',
},
],
});
- 使用
useSeoMeta
:这种方式可以帮助开发者避免name
和property
的使用错误。
useSeoMeta({
title: '页面标题',
description: '页面描述',
keywords: '关键字1, 关键字2',
ogTitle: '分享出去的页面标题',
});
性能优化
KeppAlive
KeppAlive 用来缓存动态切换的路由组件
// app.vue
<NuxtPage :keepalive="{ max: 2, exclude: 'pageA', include: 'pageB' }" />
安装百度统计
通过百度统计工具来收集和分析网站的访问数据,从而更好的了解用户行为、优化网站内容和提高用户体验.
// nuxt.config.ts
export default defineNuxtConfig({
app: {
head: {
script: [
{
type: 'text/javascript',
innerHTML: `var _hmt = _hmt || [];
(function () {
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?your_baidu_analytics_id';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
})();
`,
},
]
}
}
})
页面切换时触发百度统计:
// app.vue
const route = useRoute();
onMounted(() => {
// 触发百度统计的页面追踪
const trackPageview = () => {
if (window._hmt) {
window._hmt.push(['_trackPageview', route.fullPath]);
}
};
// 初次加载时调用一次
trackPageview();
// 监听路由变化
watch(
() => route.fullPath,
() => {
trackPageview();
},
);
});
接入阿里云监控服务
- 安装
@arms/rum-browser
- 在
plugins
文件夹下创建文件,注意该文件只在客户端运行,所以以.client
格式命名。
// plugins/rum-browser.client.js
import ArmsRum from '@arms/rum-browser';
export default defineNuxtPlugin((nuxtApp) => {
if (useRuntimeConfig().public.env === 'development') {
return;
}
ArmsRum.init({
pid: xxx,
endpoint: 'https://f0mbzrjjy9-default-cn.rum.aliyuncs.com',
});
nuxtApp.hook('app:mounted', () => {
console.log('App has been mounted!');
});
});
持续更新⏳
转载自:https://juejin.cn/post/7423706686173216802