当前位置:   article > 正文

Nuxt.JS实战指南:从入门到精通的练习之旅_nuxtjs安装

nuxtjs安装

官网:Nuxt.js - Vue.js 通用应用框架 | Nuxt.js 中文网

目录

一、为什么用Nuxt

1.1如何进行搜索引擎优化?

1.2-预渲染

1.3-服务端渲染(通过SSR)

1.4-优势劣势总结

二、Nuxt安装与使用

2.1-安装与创建

2.2-目录结构(VueCli 与 Nuxt 对比)

2.2-服务端生命周期

2.2-服务端与客户端共有的生命周期

2.3-客户端生命周期

2.4-Nuxt路由

2.5-Nuxt导航守卫

三、Nuxt配置项

3.1-Head

3.2-CSS

3.3-Model与数据交互

3.4-配置代理

四、Nuxt使用Vuex状态树

五、项目重构(V-Cli项目重构到Nuxt中)

5.1-路由配置

5.2-代理和扩展$axios解耦

5.3-引入VueX和组件重构

5.4-引入ElementUI(按需引入)

六、项目上线

6.1-项目打包

6.2-Nuxt发布IIS绑定域名

七、其他相关知识点

7.1-nuxt中使用cross-env配置环境变量

7.2-nuxt中使用svg-icon

7.3-nuxt中使用cookie

7.4-nuxt中使用代码高亮highlight.js插件

7.5-nuxt中使用全局水印

7.6-nuxt中实现图片放大预览功能

7.7-nuxt中使用windiCSS


一、为什么用Nuxt

SEO:搜索引擎优化

1.1如何进行搜索引擎优化?
  • 多页面
  • Title、描述、关键字
  • 网站内容

1.2-预渲染

1.2.1-预渲染图解

1.2.2-如何使用?

(1)vue项目中安装prerender-spa-plugin

        npm install prerender-spa-plugin -S

(2)vue.config.js进行配置

(3)修改Title、描述、关键词:vue-mate-info,下载vue-meta-info

        npm install vue-meta-info -S

(4)到页面组件中进行配置

        metaInfo:{

                title:"西瓜程序猿",

                meta:[{

                        name:"关键词,西瓜程序猿",

                        content:"描述"

                }]

        }

1.2.3-预渲染总结

可以解决:

1.打包多页面

2.可以解决每个页面单独生成title、描述、关键词

3.解决数据是在html生成放在页面上的,爬虫可以抓取到内容。

存在的问题:

1.预渲染无法配置动态路由

2.如果title、描述、关键词来与接口的数据,配置到met-info也是不行的。

适合做什么项目:

1.一个项目可以某几个页面要做SEO

1.3-服务端渲染(通过SSR)

1.3.1-预渲染图解

1.3.2-服务端渲染总结

适合做什么项目:

1.一个项目可能所有页面要做SEO(博客、内容网站)

1.4-优势劣势总结

1.前后端不分离

压力在后端

好处:安全

2.前后端分离

2.1-SPA单页面应用[vue-cli本身处理不了SEO]

压力在客户端

2.2预渲染

压力在客户端

问题:

1.在heml页面加载之前数据过来渲染后才有html的DOM结构,这样的话可能会存在一定时间空白页面的情况。

2.一个项目不是所有页面都做SEO。

2.3-服务器渲染

压力在客户端

问题:启2个服务[一个是后端自己的语言服务(C#/Java),一个是Node.JS的服务]

二、Nuxt安装与使用

2.1-安装与创建

2.1.1- 确保安装了 npx(npx 在 NPM 版本 5.2.0 默认安装了):

npm -v

npx -v

2.1.2. 创建一个Nuxt项目

(1)输入命名进行创建。

npx create-nuxt-app <项目名>

(2)选择项:

Project name——项目名称

Programming language——程序设计语言

Package manager——包管理器

UI framework——UI框架

Nuxt.js modules——NuxtJS模块(如果需要安装某个需要按"空格"电亮才行)

Linting tools——代码校验工具

Testing framework——测试框架

Universal——渲染模式(SSR:服务端渲染、SSG:静态页面生成)

Deployment target——部署目标

Development tools——开发工具

What is your GitHub username?——GitHub名称

Version control system——版本控制工具

演示如下:

创建成功如下如:

2.2-目录结构(VueCli 与 Nuxt 对比)

pages——页面(类似于:src/views)

components——组件(类似于:src/components)

static——静态资源(类似于:scr/assets)

store——vuex状态树(类似于:src/store)

muxt.config.js——全局配置文件(类似于:vue.config.js)

如下:

2.2-服务端生命周期

2.1.1-nuxtServerInit(store,context){}

参数1:vuex上下文

参数2:nuxt上下文

2.1.2-middleware()

全局:

全局导航守卫 export default function(){    console.log("middleware 西瓜程序猿")}

局部:

第一种页面级别导航守卫  middleware:"西瓜程序猿", 

第二种页面级别导航守卫  middleware(){  console.log("我是全局导航守卫")  }

2.1.3-validate({params,query}){}
判断URL参数是否符合标准,页面中写。

validate({params,query}){

        校验参数

        ...

        console.log("3.validate...")

        return true;

}

2.1.4-asyncData()——限于页面组件

会在这个里面做发送请求的操作。

2.1.5-fetch

fetch 方法用于在渲染页面前填充应用的状态树(store)数据, 与 asyncData 方法类似,不同的是它不会设置组件的数据。

2.2-服务端与客户端共有的生命周期

beforeCreate(){

        console.log("6.beforeCreate")

},

created(){

        console.log("7.created...")

},

2.3-客户端生命周期

beforeMount(){

        console.log("8.客户端beforeMount...")

},

mounted(){

        console.log("9.客户端monted...")

},

beforeUpdate(){

        console.log("10.beforeUpdate...");

},

updated(){

        console.log("11.updated...");

},

beforeDestroy(){

        console.log("12.beforeDestroy...");

},

destroyed(){

        console.log("13.destroyed...");

}

2.4-Nuxt路由

2.4.1-路由跳转的三种方式

<a href="/list?id=1">a连接的形式跳转</a><br/>

<nuxt-link :to="{name:'list',query:{id:1},params:{id:2}}">Link的方式</nuxt-link><br/>

<button @click="toList">js跳转</button><br/>

toList(){

        this.$router.push({

                path:'/list',

                query:{

                        id:123

                 },

                params:{

                        id:321

                }

        });

}

2.4.2-使用已有的VueCli路由文件

(1)安装插件。

npm install @nuxtjs/router -S

(2)在【nuxt.config.js】文件的【modules】模块中配置。

modules: [

'@nuxtjs/router'

],

(3)在根路径删新建一个【router.js】文件,文件名必须为router。

(4)修改该文件的内容。

  1. importVuefrom"vue"
  2. importVueRouterfrom"vue-router"
  3. importHomefrom"@/pages/haverouter/Home.vue"
  4. importAboutfrom"@/pages/haverouter/About.vue"
  5. importNewsfrom"@/pages/haverouter/News.vue"
  6. Vue.use(VueRouter)
  7. const routes=[
  8. {
  9. path:'/home',
  10. name:"Home",
  11. component:Home
  12. },
  13. {
  14. path:'/about',
  15. name:"About",
  16. component:About
  17. },
  18. {
  19. path:'/news',
  20. name:"News",
  21. component:News
  22. }
  23. ]
  24. letrouter=newVueRouter({
  25. mode:"history",
  26. routes
  27. });
  28. //全局导航守卫
  29. router.beforeEach((to,from,next)=>{
  30. if(to.name=="About"){
  31. next("/news")
  32. }else{
  33. next()
  34. }
  35. })
  36. exportfunctioncreateRouter(){
  37. returnrouter;
  38. }

2.5-Nuxt导航守卫

2.5.1-router.js

vue-cli中怎么用,next中就怎么用,几乎一样。

  1. //全局导航守卫
  2. router.beforeEach((to,from,next)=>{
  3. if(to.name=="About"){
  4. next("/news")
  5. }else{
  6. next()
  7. }
  8. })

2.5.2-NuxtJS

中间件:middleware

  1. 全局:
  2. // 全局导航守卫
  3. export default function(store,route,redirect,parms,query,req,res){
  4. console.log("middleware 西瓜程序猿")
  5. }
  6. 局部:
  7. //第一种页面级别导航守卫
  8. middleware:"西瓜程序猿",
  9. //第二种页面级别导航守卫
  10. middleware(){
  11. console.log("我是全局导航守卫")
  12. }

插件:plugins

(1)在【nuxt.config.js】的plugins进行配置。

plugins: [

'~/plugins/router.js'

],

(2)新建一个【router.js】文件,然后进行配置。

exportdefault ({app})=>{

        全局

        app.router.beforeEach((to,from,next)=>{

                console.log(to)

                next();

        })

}

2.5.3-使用本地存储

服务端不能使用localStorage和Cookie

需要使用以下模块:

(1)安装

npm install cookie-universal-nuxt -s

(2)在【nuxt.config.js】的【modules】引入

modules: [ 'cookie-universal-nuxt' ],

(3)如何使用

设置cookie:this.$cookies.set('token', 123456)

获取cookie:this.$cookies.get("token")

清除cookie:this.$cookies.remove('token')

三、Nuxt配置项

3.1-Head

全局在【nuxt.config.js】的[head]中定义。

局部在每个页面中定义,全局已有的可以不用在局部定义。

3.2-CSS

3.2.1-使用全局css

3.2.2-使用ElementUI

(1)下载。

npm i element-ui -S

(2)在根目录新建一个【plugins】文件夹中新建一个【element.js】文件。

importVuefrom"vue"

importElementUI from"element-ui"

Vue.use(ElementUI);

(3)在【nuxt.config.js】文件中进行配置。

  1. css: [
  2. "element-ui/lib/theme-chalk/index.css"
  3. ],
  4. plugins: [
  5. '~/plugins/element.js'
  6. ],

3.3-Model与数据交互

3.3.1-安装axios

方法一:

(1)安装:npm install @nuxtjs/axios -S

(2)在【nuxt.config.js】中配置:'@nuxtjs/axios'

方法二:

(1)安装:npm install axios -S

3.3.2-asyncData生命周期(方法)

pages目录中的页面组件才可以使用,components内的.vue文件不可以使用的。

asyncData中没有this。

3.3.3-fetch生命周期(方法)

fetch是有this的。

3.4-配置代理

(1)安装

npm install @nuxtjs/axios @nuxtjs/proxy -S

(2)在【nuxt.config.js】文件中配置。

  1. modules: [
  2. '@nuxtjs/axios',
  3. '@nuxtjs/proxy'
  4. ],
  5. axios:{
  6. //是否可以跨域
  7. proxy:true
  8. },
  9. proxy:{
  10. '/api':{
  11. target:"http://xx.xx.xx.xxx:8081",
  12. pathRewrite:{
  13. '^/api':''
  14. }
  15. }
  16. },

四、Nuxt使用Vuex状态树

  1. export const state = () => ({
  2. counter: 0
  3. })
  4. export const mutations = {
  5. increment(state) {
  6. state.counter++
  7. }
  8. }

五、项目重构(V-Cli项目重构到Nuxt中)

5.1-路由配置

(1)安装

npm install @nuxt/router -S

(2)在【nuxt.config.js】文件中进行配置。

  1. modules: [
  2. "@nuxtjs/router"
  3. ],

(3)把vue-cli中router文件拷贝到nuxt项目根目录中,并命名为【router.js】。

(4)然后修改这个文件。

  1. import Vue from 'vue';
  2. import Router from 'vue-router';
  3. import Home from '@/pages/blog/home.vue';//博客首页
  4. Vue.use(Router);
  5. const routes = [
  6. { path: '/',component: Home},
  7. ];
  8. export function createRouter(){
  9. return new Router({
  10. mode: "history",
  11. routes,
  12. });
  13. }

5.2-代理和扩展$axios解耦

(1)安装代理与axios。

npm install @nuxtjs/axios @nuxtjs/proxy -S

(2)在【nuxt.config.js】文件中进行配置。

  1. modules: [
  2. "@nuxtjs/axios",
  3. "@nuxtjs/proxy"
  4. ],

(3)配置代理。

  1. //开启代理
  2. axios:{
  3. proxy:true,
  4. },
  5. proxy:{
  6. "/api":{
  7. target:"http://xx.xx.xx.xxx:8081"
  8. }
  9. },

(4)创建一个【plugins】文件夹,并新建一个名为【axios.js】文件,配置如下:

  1. export default ( {$axios} ) =>{
  2. //请求拦截器
  3. $axios.onRequest((config)=>{
  4. console.log("请求拦截器...");
  5. return config;
  6. });
  7. //异常拦截器
  8. $axios.onRequest((error)=>{
  9. console.log("异常拦截器...");
  10. });
  11. //响应拦截器
  12. $axios.onResponse((response)=>{
  13. console.log("响应拦截器...");
  14. return response.data;
  15. });
  16. }

(5)在【nuxt.config.js】文件中进行配置。

  1. plugins: [
  2. "~/plugins/axios"
  3. ],

5.3-引入VueX和组件重构

(1)创建一个【store】文件夹并在里面新建一个【index.js】文件,内容如下。

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. //使用Vuex
  4. Vue.use(Vuex)
  5. import app from './modules/app'
  6. const store = () => new Vuex.Store({
  7. //导入模块
  8. modules:{
  9. app,
  10. }
  11. });
  12. //导出
  13. export default store;

(2)创建一个【models】文件夹并在里面新建一个【user.js】文件,内容如下。

  1. //【应用程序模块】
  2. export default{
  3. //单一状态树,UI可通过this.$store.state.user.*获得数据
  4. state:{
  5. },
  6. // 唯一拥有更改内存数据的接口,不可进行异步操作
  7. mutations:{
  8. },
  9. // 与mutation通讯,UI层写入内存数据的接口,可异步操作
  10. actions:{
  11. }
  12. }

5.4-引入ElementUI(按需引入)

(1)安装

npm i element-ui -S

npm i -D babel-plugin-component

(2)新建一个【elementui-ui.js】放在【plugins】文件夹下。

  1. import Vue from 'vue';
  2. // 按需引入ElementUI
  3. import {
  4. Pagination,
  5. Dialog,
  6. Autocomplete,
  7. Dropdown,
  8. DropdownMenu,
  9. DropdownItem,
  10. Menu,
  11. Submenu,
  12. MenuItem,
  13. MenuItemGroup,
  14. Input,
  15. InputNumber,
  16. Radio,
  17. RadioGroup,
  18. RadioButton,
  19. Checkbox,
  20. CheckboxButton,
  21. CheckboxGroup,
  22. Switch,
  23. Select,
  24. Option,
  25. OptionGroup,
  26. Button,
  27. ButtonGroup,
  28. Table,
  29. TableColumn,
  30. DatePicker,
  31. TimeSelect,
  32. TimePicker,
  33. Popover,
  34. Tooltip,
  35. Breadcrumb,
  36. BreadcrumbItem,
  37. Form,
  38. FormItem,
  39. Tabs,
  40. TabPane,
  41. Tag,
  42. Tree,
  43. Alert,
  44. Slider,
  45. Icon,
  46. Row,
  47. Col,
  48. Upload,
  49. Progress,
  50. Spinner,
  51. Badge,
  52. Card,
  53. Rate,
  54. Steps,
  55. Step,
  56. Carousel,
  57. CarouselItem,
  58. Collapse,
  59. CollapseItem,
  60. Cascader,
  61. ColorPicker,
  62. Transfer,
  63. Container,
  64. Header,
  65. Aside,
  66. Main,
  67. Footer,
  68. Timeline,
  69. TimelineItem,
  70. Link,
  71. Divider,
  72. Image,
  73. Calendar,
  74. Backtop,
  75. PageHeader,
  76. CascaderPanel,
  77. Loading,
  78. MessageBox,
  79. Message,
  80. Notification,
  81. Avatar,
  82. Scrollbar,
  83. Empty,
  84. Skeleton,
  85. SkeletonItem
  86. } from 'element-ui';
  87. Vue.use(Pagination);
  88. Vue.use(Dialog);
  89. Vue.use(Autocomplete);
  90. Vue.use(Dropdown);
  91. Vue.use(DropdownMenu);
  92. Vue.use(DropdownItem);
  93. Vue.use(Menu);
  94. Vue.use(Submenu);
  95. Vue.use(MenuItem);
  96. Vue.use(MenuItemGroup);
  97. Vue.use(Input);
  98. Vue.use(InputNumber);
  99. Vue.use(Radio);
  100. Vue.use(RadioGroup);
  101. Vue.use(RadioButton);
  102. Vue.use(Checkbox);
  103. Vue.use(CheckboxButton);
  104. Vue.use(CheckboxGroup);
  105. Vue.use(Switch);
  106. Vue.use(Select);
  107. Vue.use(Option);
  108. Vue.use(OptionGroup);
  109. Vue.use(Button);
  110. Vue.use(ButtonGroup);
  111. Vue.use(Table);
  112. Vue.use(TableColumn);
  113. Vue.use(DatePicker);
  114. Vue.use(TimeSelect);
  115. Vue.use(TimePicker);
  116. Vue.use(Popover);
  117. Vue.use(Tooltip);
  118. Vue.use(Breadcrumb);
  119. Vue.use(BreadcrumbItem);
  120. Vue.use(Form);
  121. Vue.use(FormItem);
  122. Vue.use(Tabs);
  123. Vue.use(TabPane);
  124. Vue.use(Tag);
  125. Vue.use(Tree);
  126. Vue.use(Alert);
  127. Vue.use(Slider);
  128. Vue.use(Icon);
  129. Vue.use(Row);
  130. Vue.use(Col);
  131. Vue.use(Upload);
  132. Vue.use(Progress);
  133. Vue.use(Spinner);
  134. Vue.use(Badge);
  135. Vue.use(Card);
  136. Vue.use(Rate);
  137. Vue.use(Steps);
  138. Vue.use(Step);
  139. Vue.use(Carousel);
  140. Vue.use(CarouselItem);
  141. Vue.use(Collapse);
  142. Vue.use(CollapseItem);
  143. Vue.use(Cascader);
  144. Vue.use(ColorPicker);
  145. Vue.use(Transfer);
  146. Vue.use(Container);
  147. Vue.use(Header);
  148. Vue.use(Aside);
  149. Vue.use(Main);
  150. Vue.use(Footer);
  151. Vue.use(Timeline);
  152. Vue.use(TimelineItem);
  153. Vue.use(Link);
  154. Vue.use(Divider);
  155. Vue.use(Image);
  156. Vue.use(Calendar);
  157. Vue.use(Backtop);
  158. Vue.use(PageHeader);
  159. Vue.use(CascaderPanel);
  160. Vue.use(Loading.directive);
  161. Vue.use(Avatar);//头像
  162. Vue.use(Scrollbar);//滚动条
  163. Vue.use(Empty);//空状态
  164. Vue.use(Skeleton);//骨架屏
  165. Vue.use(SkeletonItem);
  166. //挂载Message
  167. Vue.prototype.$loading = Loading.service;
  168. Vue.prototype.$msgbox = MessageBox;
  169. Vue.prototype.$alert = MessageBox.alert;
  170. Vue.prototype.$confirm = MessageBox.confirm;
  171. Vue.prototype.$prompt = MessageBox.prompt;
  172. Vue.prototype.$notify = Notification;
  173. Vue.prototype.$message = Message;

(3)在【nuxt.config.jf】配置。

  1. // 全局CSS: https://go.nuxtjs.dev/config-css
  2. css: [
  3. "element-ui/lib/theme-chalk/index.css"
  4. ],
  5. // 在呈现页面之前要运行的插件: https://go.nuxtjs.dev/config-plugins
  6. plugins: [
  7. "@/plugins/element-ui",
  8. ],
  9. // 生成配置: https://go.nuxtjs.dev/config-build
  10. build: {
  11. //按需引入ElementUI
  12. transpile: [/^element-ui/],
  13. babel: {
  14. plugins: [
  15. ['component',
  16. {
  17. libraryName: 'element-ui',
  18. styleLibraryName: 'theme-chalk'
  19. }
  20. ]
  21. ]
  22. }
  23. }

六、项目上线

6.1-项目打包

(1)运行命令

npm run build

(2)将一下文件拷贝到服务器上 (根据自己项目文件存放情况选择) 。

(3)使用pm2启动

pm2 start

6.2-Nuxt发布IIS绑定域名

 参考文献:
1.安装ARR:在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点 - 爱码网

2.Nuxt.js-IIS发布部署:Nuxt.js IIS部署,Nuxt.js 发布部署_iis上部署nuxt.js_橙-极纪元的博客-CSDN博客

一、在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点

(1)下载并安

(2)将下载好的文件拷贝到服务器上,并双击安装(打开时间比较长,慢慢等就好了)。

(3)安装成功后,重新打开IIS,出现这个图标说明安装成功了。

(4)双击【 Application Request Routing Cache 】图标,然后点击【Server Proxy Settings】。

(5)勾选【Enable Setting】,然后点击【应用】。

二、添加站点

(1)右击【网站】,点击【添加网站】。

(2)填写基本信息。

(3)然后点击刚刚创建的项目,再双击【URL 重写】,点击【添加规则】。

选择【反向代理】

填写你原本用Node发布的Nuxt项目IP+端口即可,然后点击确定。

七、其他相关知识点

7.1-nuxt中使用cross-env配置环境变量

(1)使用命令安装依赖

npm i cross-env

(2)新建一个【env.js】文件,填写相关不同环境的配置信息。

  1. export default {
  2. // 开发环境
  3. dev: {
  4. NODE_ENV : 'development',
  5. // Base URL
  6. BASE_URL: 'http://xx.xx.xx.xxx:8081',
  7. // Base API
  8. VUE_APP_BASE_API: 'http://xx.xx.xx.xxx:8081'
  9. },
  10. // 测试环境
  11. test: {
  12. NODE_ENV : 'test',
  13. // Base URL
  14. BASE_URL: 'http://xx.xx.xx.xxx:8081',
  15. // Base API
  16. VUE_APP_BASE_API: 'http://xx.xx.xx.xxx:8081'
  17. },
  18. // 生产环境
  19. prod: {
  20. NODE_ENV : 'production',
  21. // Base URL
  22. BASE_URL: 'http://xx.xx.xx.xxx:8081',
  23. // Base API
  24. VUE_APP_BASE_API: 'http://xx.xx.xx.xxx:8081'
  25. }
  26. }

(3)在【package.json】中配置。

  1. "dev": "npm run dev:dev",
  2. "build": "npm run build:dev",
  3. "start": "npm run start:dev",
  4. "dev:dev": "cross-env MODE=dev nuxt",
  5. "build:dev": "cross-env MODE=dev nuxt build",
  6. "start:dev": "cross-env MODE=dev nuxt start",
  7. "dev:test": "cross-env MODE=test nuxt",
  8. "build:test": "cross-env MODE=test nuxt build",
  9. "start:test": "cross-env MODE=test nuxt start",
  10. "dev:prop": "cross-env MODE=prod nuxt",
  11. "build:prop": "cross-env MODE=prod nuxt build",
  12. "start:prop": "cross-env MODE=prod nuxt start",

(4)在【nuxt.config.js】中配置。

  1. import env from './config/env';
  2. // 配置环境变量
  3. env: {
  4. MODE: process.env.MODE
  5. },
  6. // 代理
  7. proxy:{
  8. "/api":{
  9. target:"http://47.93.83.192:7990",//配置接口地址
  10. target:env[process.env.MODE].VUE_APP_BASE_API,//配置接口地址
  11. changeOrigin: true
  12. }
  13. },

7.2-nuxt中使用svg-icon

(1)安装相关依赖

npm i svg-sprite-loader -D

npm i nuxt-svg-sprite-loader

(2)新建如下相关文件

【icon】放置svg文件

【index.js】

  1. import Vue from 'vue';
  2. import SvgIcon from '@/components/common/svg-icon'; // 导入SVG组件
  3. // 全局注册
  4. Vue.component('svg-icon', SvgIcon);
  5. // 三个参数:引入资源的目录 是否需要便利子目录 匹配文件的规则
  6. const req = require.context('./svg', false, /\.svg$/);
  7. const requireAll = requireContext => requireContext.keys().map(requireContext);
  8. requireAll(req);

(3)在【nuxt.config.js】中进行配置。

  1. plugins: [
  2. '@/assets/icons'
  3. ],
  4. modules: [
  5. ['nuxt-svg-sprite-loader', {
  6. symbolId: 'icon-[name]'
  7. }]
  8. ],

7.3-nuxt中使用cookie

官方地址:cookie-universal-nuxt - npm

(1)安装依赖

npm i --save cookie-universal-nuxt

(2)在【nuxt.config.js】中进行配置。

  1. modules: [
  2. 'cookie-universal-nuxt'
  3. ],

(3)使用

  1. const cookieValObject = { param1: 'value1', param2: 'value2' }
  2. // nuxt middleware——中间件
  3. export default ({ app }) => {
  4. app.$cookies.set('cookie-name', 'cookie-value', {
  5. path: '/',
  6. maxAge: 60 * 60 * 24 * 7
  7. })
  8. app.$cookies.set('cookie-name', cookieValObject, {
  9. path: '/',
  10. maxAge: 60 * 60 * 24 * 7
  11. })
  12. }
  13. // client——客户端
  14. this.$cookies.set('cookie-name', 'cookie-value', {
  15. path: '/',
  16. maxAge: 60 * 60 * 24 * 7
  17. })
  18. this.$cookies.set('cookie-name', cookieValObject, {
  19. path: '/',
  20. maxAge: 60 * 60 * 24 * 7
  21. })

7.4-nuxt中使用代码高亮highlight.js插件

参考文献:

(1)vue nuxt.js 代码高亮 highlight.js或 prismjs 插件的用法_prismjs vue_下一站丶的博客-CSDN博客

(2)vue3:基于highlight实现代码高亮、显示代码行数、添加复制功能_highlight.js复制按钮_无知的小菜鸡的博客-CSDN博客

(1)安装

npm install highlight.js

(2)在【plugins】文件下添加一个【highlight.js】文件。

  1. import Vue from 'vue';
  2. import hljs from 'highlight.js';
  3. // 样式文件(我选的是atom-one-dark-reasonable样式 可以通过highlight.js/styles 选择其他css)
  4. import 'highlight.js/styles/atom-one-dark-reasonable.css';
  5. // 挂载highlight
  6. Vue.directive('highlight', function (el) {
  7. let element = el.querySelectorAll('pre');
  8. element.forEach((block) => {
  9. hljs.highlightBlock(block);
  10. });
  11. });

(3)在【nuxt.config.js】中引入。

  1. plugins: [
  2. '@/plugins/highlight'
  3. ],

(4)在代码中使用

<div v-html='BlogArticleDetail.articleContent' v-highlight></div>

7.5-nuxt中使用全局水印

参考文献:

(1)实现水印:花花影院 - 最新电影电视剧在线观看

(2)nuxt自定义全局方法:nuxt 自定义全局方法、全局属性、全局变量解决方案_nuxt定义全局变量_雪狼之夜的博客-CSDN博客

(1) 在【plugins】文件夹里新增一个【watermark.js】文件(文件名可以自己取)。

  1. import Vue from 'vue';
  2. let watermarkObj = {};
  3. /**
  4. * 设置全局水印
  5. * @text == 水印内容
  6. * @sourceBody == 水印添加在哪里,不传就是body
  7. * */
  8. let idGlocal = 'watermark_id';
  9. let setWatermarkGlocal = (text, sourceBody) => {
  10. if (document.getElementById(idGlocal) !== null) {
  11. document.body.removeChild(document.getElementById(idGlocal));
  12. }
  13. let can = document.createElement('canvas');
  14. can.width = 500;
  15. can.height = 200;
  16. let cans = can.getContext('2d');
  17. cans.rotate((-20 * Math.PI) / 180);
  18. cans.font = '15px Vedana';
  19. cans.fillStyle = 'rgba(0, 0, 0, 0.05)';
  20. cans.textAlign = 'left';
  21. cans.textBaseline = 'Middle';
  22. cans.fillText(text, can.width / 20, can.height);
  23. let water_div = document.createElement('div');
  24. water_div.id = idGlocal;
  25. water_div.style.pointerEvents = 'none';
  26. water_div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat';
  27. if (sourceBody) {
  28. water_div.style.width = '100%';
  29. water_div.style.height = '100%';
  30. sourceBody.appendChild(water_div);
  31. } else {
  32. water_div.style.top = '3px';
  33. water_div.style.left = '0px';
  34. water_div.style.position = 'fixed';
  35. water_div.style.zIndex = '100000';
  36. water_div.style.width = document.documentElement.clientWidth + 'px';
  37. water_div.style.height = document.documentElement.clientHeight + 'px';
  38. document.body.appendChild(water_div);
  39. }
  40. };
  41. /**
  42. * 添加全局水印
  43. * @text == 水印内容
  44. * @sourceBody == 水印添加在哪里,不传就是body
  45. * */
  46. watermarkObj.setGlocal = (text, sourceBody) => {
  47. setWatermarkGlocal(text, sourceBody);
  48. window.onresize = () => {
  49. setWatermarkGlocal(text, sourceBody);
  50. };
  51. };
  52. /**
  53. * 删除全局水印
  54. * */
  55. watermarkObj.removeGlocal = () => {
  56. if (document.getElementById(idGlocal) !== null) {
  57. document.body.removeChild(document.getElementById(idGlocal));
  58. }
  59. };
  60. // 设置全局方法
  61. var watermark = {
  62. install(Vue) {
  63. Vue.prototype.$watermark = {
  64. // 设置全局水印
  65. setGlocal: function (test, sourceBody) {
  66. watermarkObj.setGlocal(test, sourceBody);
  67. },
  68. // 删除全局水印
  69. removeGlocal: function () {
  70. watermarkObj.removeGlocal();
  71. },
  72. };
  73. },
  74. };
  75. Vue.use(watermark);

(2)在【nuxt.config.js】中进行配置。

  1. plugins: [
  2. { src: '@/plugins/watermark', ssr: false }
  3. ],

(3)在xx.vue文件中使用。

【全局使用】

  1. mounted() {
  2. // 添加水印
  3. this.$watermark.setGlocal('©西瓜程序猿');
  4. },
  5. beforeDestroy() {
  6. // 删除水印
  7. this.$watermark.removeGlocal();
  8. },

【局部使用】(注意:局部使用记得外外层div设置宽高)

  1. <template>
  2. <div ref="content" style="width: 500px;height: 500px;border: 1px solid #ccc;">
  3. </template>
  4. <script>
  5. export default {
  6. mounted() {
  7. // 添加水印
  8. this.$watermark.setGlocal('©西瓜程序猿',this.$refs.content);
  9. },
  10. beforeDestroy() {
  11. // 删除水印
  12. this.$watermark.removeGlocal();
  13. },
  14. }
  15. </script>

7.6-nuxt中实现图片放大预览功能

参考文献:在nuxt中实现图片放大预览功能-腾讯云开发者社区-腾讯云

(1)安装

npm install v-viewer

(2)在【plugins】文件夹里新增一个【viewer.js】文件(文件名可以自己取)。

  1. import Vue from 'vue';
  2. import Viewer from 'v-viewer'
  3. import 'viewerjs/dist/viewer.css'
  4. Vue.use(Viewer);
  5. Viewer.setDefaults({
  6. Options: {
  7. 'inline': true,
  8. 'button': true,
  9. 'navbar': true,
  10. 'title': true,
  11. 'toolbar': true,
  12. 'tooltip': true,
  13. 'movable': true,
  14. 'zoomable': true,
  15. 'rotatable': true,
  16. 'scalable': true,
  17. 'transition': true,
  18. 'fullscreen': true,
  19. 'keyboard': true,
  20. 'url': 'data-source'
  21. }
  22. });

(3)在【nuxt.config.js】中进行配置。

  1. plugins: [
  2. { src: '@/plugins/viewer', ssr: false }
  3. ],

(4)在xx.vue文件中使用。

  1. <div class="markdown-body-box" v-viewer>
  2. <!-- 页面内容、图片等等 -->
  3. </div>

效果:

7.7-nuxt中使用windiCSS

官网网站:Windi CSS for Nuxt.js

(1)安装

npm i nuxt-windicss -D

(2)在【nuxt.config.js】文件中配置

  1. buildModules: [
  2. 'nuxt-windicss'
  3. ],

(3)如果使用了TS可以进行配置。

  1. "types": [
  2. "nuxt-windicss"
  3. ]

版权声明:本文为原创文章,版权归 [西瓜程序猿] 所有,转载请注明出处,有任何疑问请私信咨询。

原文链接:Nuxt.JS实战指南:从入门到精通的练习之旅_西瓜程序猿的博客-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/971364
推荐阅读
相关标签
  

闽ICP备14008679号