最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nuxt.js實戰(zhàn)詳解

 更新時間:2018年01月18日 10:17:02   作者:yingye  
這篇文章主要介紹了Nuxt.js實戰(zhàn)詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、為什么選擇Nuxt.js

多數(shù)是基于webpack構(gòu)建的項目,編譯出來的html文件,資源文件都被打包到j(luò)s中,以下圖404頁面代碼為例。從代碼中可以看出,這樣的頁面是不利于 搜索引擎優(yōu)化(SEO, Search Engine Optimization) ,并且 內(nèi)容到達(dá)時間(time-to-content) (或稱之為首屏渲染時長)也有很大的優(yōu)化空間。為了解決以上問題,引入了 Nuxt.js 框架。

vue官網(wǎng)對于Nuxt.js也是很推薦的,除此之外,Nuxt.js的開發(fā)者積極活躍,版本迭代迅速。經(jīng)過一系列rc版本后,終于在1月9日發(fā)布了 v1.0.0 正式版本!

圖1. 使用webpack構(gòu)建的HTML(代碼已格式化)

圖2. 使用 Nuxt.js 構(gòu)建的HTML(代碼已格式化)

二、Nuxt.js 簡介

Nuxt.js 是一個基于 Vue.js 的通用應(yīng)用框架,它預(yù)設(shè)了利用 Vue.js 開發(fā) 服務(wù)端渲染(SSR, Server Side Render) 的應(yīng)用所需要的各種配置,同時也可以一鍵生成靜態(tài)站點。

作為框架,Nuxt.js 為 客戶端/服務(wù)端 這種典型的應(yīng)用架構(gòu)模式提供了許多有用的特性,例如異步數(shù)據(jù)加載、中間件支持、布局支持等。區(qū)別于其他 vue SSR 框架,Nuxt.js 有以下比較明顯的特性。

  1. 自動代碼分層
  2. 強大的路由功能,支持異步數(shù)據(jù)(路由無需額外配置)
  3. HTML頭部標(biāo)簽管理(依賴 vue-meta 實現(xiàn))
  4. 內(nèi)置 webpack 配置,無需額外配置

三、項目實戰(zhàn)1、項目創(chuàng)建

官方提供了基于 vue-cli 腳手架工具,常用的有如下三個,更多腳手架工具可以查看nuxt-community 。本項目使用的是 express-template。

vue init nuxt-community/starter-template <project-name>

vue init nuxt-community/koa-template <project-name>
 
vue init nuxt-community/express-template <project-name>

2、開發(fā)

1)目錄結(jié)構(gòu)

├─assets   資源目錄,未編譯的靜態(tài)資源如less、js
├─components  組件目錄
├─layouts  布局目錄
├─mock   mock數(shù)據(jù)
├─node_modules  
├─pages   頁面目錄
 ├─index.vue
 ├─....   
├─plugins  插件
├─server   express服務(wù)
├─static   靜態(tài)文件目錄
├─store   vuex store
├─utils   工具方法

2)配置

Nuxt.js 默認(rèn)的配置涵蓋了大部分使用情形,也可通過修改 nuxt.config.js 來覆蓋默認(rèn)配置。

// nuxt.config.js 文件配置
const path = require('path')

module.exports = {
 // Headers of the page
 head: {
 title: '默認(rèn)共用title',
 meta: [
 { charset: 'utf-8' },
 { 'http-equiv': 'pragma', content: 'no-cache' },
 { 'http-equiv': 'cache-control', content: 'no-cache' },
 { 'http-equiv': 'expires', content: '0' },
 { content: 'telephone=no', name: 'format-detection' }
 ],
 // html head 中創(chuàng)建 script 標(biāo)簽
 script: [
 { innerHTML: require('./assets/js/flexible_nuxt'), type: 'text/javascript', charset: 'utf-8'}
 ],
 // 不對<script>標(biāo)簽中內(nèi)容做轉(zhuǎn)義處理
 __dangerouslyDisableSanitizers: ['script']
 },
 // Global CSS
 css: ['~/assets/css/reset.css', '~/assets/css/main.less'],
 // Global env
 env: {
 __ENV: process.env.__ENV
 },
 build: {
 vendor: ['axios'],
 postcss: [
 require('postcss-px2rem')({
 remUnit: 75
 })
 ],
 extend (config, ctx) {
 if (ctx.isClient) {
 // 拓展 webpack 配置
 config.entry['polyfill'] = ['babel-polyfill']
 config.module.rules.push({
  enforce: 'pre',
  test: /\.(js|vue)$/,
  loader: 'eslint-loader',
  exclude: /(node_modules)/
 })
 // 添加 alias 配置
 Object.assign(config.resolve.alias, {
  'utils': path.resolve(__dirname, 'utils')
 })
 }
 }
 },
 plugins: [{src: '~plugins/toast', ssr: false}, {src: '~plugins/dialog', ssr: false}]
}

HTML頭部標(biāo)簽管理:

Nuxt.js 通過 vue-meta 實現(xiàn)頭部標(biāo)簽管理,在 nuxt.config.js 中的 head 配置。所有的頁面都會走這個配置,如果想要修改某一頁面的title,可以在 pages/**.vue 文件下,添加如下配置,這時該頁面的標(biāo)題就變成了“收車費”,其余頁面還保持原有標(biāo)題不變。

在config header配置中, __dangerouslyDisableSanitizers: ['script'] 主要是為了不對<script>標(biāo)簽中內(nèi)容做轉(zhuǎn)義處理。看下面的例子🌰:

head: {
 title: 'myTitle',
 meta: [
 { charset: 'utf-8' },
 { 'http-equiv': 'pragma', content: 'no-cache' },
 { 'http-equiv': 'cache-control', content: 'no-cache' },
 { 'http-equiv': 'expires', content: '0' },
 { content: 'telephone=no', name: 'format-detection' }
 ],
 script: [
 { innerHTML: 'console.log("hello")', type: 'text/javascript', charset: 'utf-8'}
 ]
 },

生成 html:

復(fù)制代碼 代碼如下:

<script data-n-head="true" type="text/javascript" charset="utf-8">console.log(&quot;hello&quot;)</script>

我們發(fā)現(xiàn) vue-meta 把引號做了轉(zhuǎn)義處理,加入 __dangerouslyDisableSanitizers: ['script'] 后,就不會再對這些字符做轉(zhuǎn)義了,該字段使用需慎重!

3)路由

Nuxt.js 依據(jù) pages 目錄結(jié)構(gòu),自動生成 vue-router 模塊的路由配置。

假設(shè) pages 的目錄結(jié)構(gòu)如下:

那么,Nuxt.js 自動生成的路由配置如下:

嵌套路由:

創(chuàng)建內(nèi)嵌子路由,需要添加一個 Vue 文件,同時添加一個與該文件同名的目錄用來存放子視圖組件。在父級 Vue 文件內(nèi)增加 <nuxt-child/> 用于顯示子視圖內(nèi)容。

4)布局

Nuxt.js布局方式如下圖所示:

layouts對應(yīng)目錄中的layouts文件夾,默認(rèn)pages下的頁面走的都是 layouts/default.vue 布局方式,如下圖。其中<nuxt/>可以類似vueslot插槽的概念,pages/**.vue中的內(nèi)容會插在<nuxt/>內(nèi)。

此外,如果想要某一頁面,不走默認(rèn)布局方式,可以在vue文件中配置layouts,如下。

<script>
export default {
 layout: 'demo_layout',
 ...
}
</script>

5)vuex

在根目錄創(chuàng)建 store 目錄,就會默認(rèn)引用 vuex 模塊,除此之外,還進(jìn)行了以下的操作:1)將 vuex 模塊 加到 vendors 構(gòu)建配置中去;2)設(shè)置 Vue 根實例的 store 配置項。

Nuxt.js 支持兩種使用 store 的方式:

  1. 普通方式:store/index.js 返回一個 Vuex.Store 實例
  2. 模塊方式:store 目錄下的每個 .js 文件會被轉(zhuǎn)換成為狀態(tài)樹指定命名的子模塊 (當(dāng)然,index 是根模塊,相當(dāng)于設(shè)置了namespaced: true)

Nuxt.js提供了模塊方式的簡單寫法:使用狀態(tài)樹模塊化的方式,store/index.js 不需要返回 Vuex.Store 實例,直接將 state、mutations 和 actions 暴露出來即可。示例如下:

export const state = () => ({
 accesstoken: ''
})

export const mutations = {
 setAccesstoken (state, accesstoken) {
 state.accesstoken = accesstoken
 }
}

6)異步數(shù)據(jù) asyncData

Nuxt.js 增加了一個 asyncData 方法,用于 在設(shè)置組件數(shù)據(jù) 之前 能夠異步獲取 或 處理數(shù)據(jù)。
由于 asyncData 是在組件 初始化 之前被調(diào)用的,所以不能通過 this 引用組件的實例對象,可以使用上下文對象來實現(xiàn)某些功能,可參考 context api

示例🌰:

asyncData (params) {
 let accesstoken = params.route.query.accesstoken
 // request 基于 axios 封裝的函數(shù)
 return request({
 url: '/drivers/banks',
 method: 'get',
 headers: {
 accesstoken
 }
 })
 .then(res => {
 let {
 bankInfo
 } = res.data
 return {
 banksData: bankInfo,
 accesstoken
 }
 })
 .catch(err => {
 return error({ message: 'accesstoken not found', statusCode: 404 })
 })
}

上述代碼,會在 組件初始化 之前,請求'/drivers/banks'接口,接口返回的數(shù)據(jù)會 融合在 data 中,一并返回模版顯示。在瀏覽器中,使用Vue DevTools可以清晰的查看到 banksData, accesstoken 都在data中。
在調(diào)試中發(fā)現(xiàn),刷新頁面時,該請求是在服務(wù)端發(fā)送的,由其他頁面回退到該頁面時,請求是在客戶端發(fā)送的。

7)fecth方法

asyncData 方法類似,不同的是它不會設(shè)置組件的數(shù)據(jù),作用是設(shè)置 store 數(shù)據(jù)。

五、總結(jié)

本項目在開發(fā)中,使用的是 1.0.0-rc9 版本,我們正在積極嘗試遷移到 1.0.0 正式版本。但是,1.0.0-rc9 版本,未見明顯問題,比較穩(wěn)定,足以投入到生產(chǎn)中。

本文主要介紹 Nuxt.js 的特性,后面還會和大家分享踩的坑。文中有任何表述不清或不當(dāng)?shù)牡胤剑瑲g迎大家批評指正。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue使用echarts畫組織結(jié)構(gòu)圖

    vue使用echarts畫組織結(jié)構(gòu)圖

    這篇文章主要介紹了vue使用echarts畫組織結(jié)構(gòu)圖的示例,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-02-02
  • 詳解vue3中的非父子組件傳值

    詳解vue3中的非父子組件傳值

    這篇文章主要為大家介紹了vue3中的非父子組件傳值,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • FastApi+Vue+LayUI實現(xiàn)前后端分離的示例代碼

    FastApi+Vue+LayUI實現(xiàn)前后端分離的示例代碼

    本文主要介紹了FastApi+Vue+LayUI實現(xiàn)前后端分離的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • vue?this.$toast?失效問題解決方案

    vue?this.$toast?失效問題解決方案

    這篇文章主要介紹了vue?this.$toast?失效問題匯總,本文給大家分享完美解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • 詳解vue中async-await的使用誤區(qū)

    詳解vue中async-await的使用誤區(qū)

    這篇文章主要介紹了vue中async-await的使用誤區(qū),本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-12-12
  • Vue 實現(xiàn)高級穿梭框 Transfer 封裝過程

    Vue 實現(xiàn)高級穿梭框 Transfer 封裝過程

    本文介紹了基于Vue2和Element-UI實現(xiàn)的高級穿梭框組件Transfer的設(shè)計與技術(shù)方案,組件支持多項選擇,并能實時同步已選擇項,包含豎版和橫版設(shè)計稿,并提供了組件的使用方法和源碼,此組件具備本地分頁和搜索功能,適用于需要在兩個列表間進(jìn)行數(shù)據(jù)選擇和同步的場景
    2024-09-09
  • vue對el-autocomplete二次封裝增加下拉分頁

    vue對el-autocomplete二次封裝增加下拉分頁

    項目中的聯(lián)想輸入框現(xiàn)在都是采用的el-autocomplete實現(xiàn)的,但是數(shù)據(jù)增多就會需要做分頁處理,本文主要介紹了vue對el-autocomplete二次封裝增加下拉分頁,感興趣的可以了解一下
    2022-03-03
  • Vue引入jquery實現(xiàn)平滑滾動到指定位置

    Vue引入jquery實現(xiàn)平滑滾動到指定位置

    這篇文章主要介紹了Vue引入jquery實現(xiàn)平滑滾動到指定位置的效果,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-05-05
  • vue中如何去掉空格的方法實現(xiàn)

    vue中如何去掉空格的方法實現(xiàn)

    這篇文章主要介紹了vue中如何去掉空格的方法實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • vue router點擊打開新的標(biāo)簽頁的方法(最新推薦)

    vue router點擊打開新的標(biāo)簽頁的方法(最新推薦)

    vue router點擊打開新的標(biāo)簽頁的方法,只需要在router-link中加入target="_blank"即可在新的頁面打開標(biāo)簽,本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10

最新評論

平罗县| 淅川县| 达日县| 开化县| 怀来县| 邵阳县| 咸丰县| 晋宁县| 侯马市| 南雄市| 资兴市| 防城港市| 穆棱市| 闸北区| 忻州市| 抚州市| 景泰县| 古丈县| 延津县| 上虞市| 应城市| 嵊泗县| 搜索| 砚山县| 汉川市| 三亚市| 大安市| 五台县| 县级市| 左贡县| 梅河口市| 武功县| 南京市| 龙游县| 桐梓县| 凤城市| 永顺县| 漳浦县| 广东省| 清流县| 项城市|