日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Vue服務(wù)器端渲染nuxt.js初探

開頭還是來一段廢話: 年關(guān)將近,給大家拜個早年,愿大家年會都能抽大獎,來年行大運。

我們提供的服務(wù)有:成都做網(wǎng)站、網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、平陸ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的平陸網(wǎng)站制作公司

廢話不多說,直接進正文。

項目環(huán)境:

前端vue項目, 需要將新增的幾個路由頁面做seo處理。

在調(diào)研 插件 prerender-spa-plugin后,發(fā)現(xiàn)無法滿足 vuex 以及 plugins 等要求時,果斷選用了 nuxt.js做服務(wù)器渲染。

下面是在項目中整理的 文檔 和 問題

nuxt.js 是一個基于 Vue.js 的通用應(yīng)用框架

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

值得一提的是,nuxt是基于node.js的,后端如果是其他語言時,是否考慮到再加一層node.js的合理性。

鏈接地址: https://zh.nuxtjs.org/guide/installation

利用npx腳手架創(chuàng)建項目

鏈接地址: https://zh.nuxtjs.org/guide/installation

會提供以下選項

1. 在集成的服務(wù)器端框架之間進行選擇: Express / Koa ...

2. 選擇您喜歡的UI框架: Bootstrap / Element UI ...

3. 選擇你想要的Nuxt模式 (Universal or SPA) 普通類型 / 單頁應(yīng)用

4. 添加 axios module 以輕松地將HTTP請求發(fā)送到您的應(yīng)用程序中。

5. 添加 EsLint 以在保存時代碼規(guī)范和錯誤檢查您的代碼。

6. 添加 Prettier 以在保存時格式化/美化您的代碼。

注意:

1. 如果項目自帶分支等git信息時, 需要將npx生產(chǎn)的目錄里面隱藏的git 文件刪除

因為npx生成文件時,默認為master 分支,類似于 gitmodule 子分支性質(zhì)

2. 其中第3點,選擇 Universal 時 才會默認輸出靜態(tài)頁,也就是能夠seo的,當選擇spa時,則無法seo

可修改 nuxt.config.js 中的配置項 mode: 'Universal' 來定義類型

啟動項目

命令: npm run dev 默認命令

這時會報錯,說未指定ip 什么的,需配置項:

nuxt.config.js 中:

 
 
 
 
  1. server: {  
  2. // port: '3000', // 定義 輸出端口 ,默認為3000  
  3. host:'0.0.0.0' // 定義 輸出 ip  
  4. },  

注意:

在server 目錄中國的index.js中 會讀取 nuxt.config.js 中的配置項,當不存在時會賦值默認值

 
 
 
 
  1. const {  
  2. host = process.env.HOST || '127.0.0.1',  
  3. port = process.env.PORT || 3000 // 默認配置條件下,修改此處無效 仍舊為3000端口  
  4. } = nuxt.options.server  

頁面上的注意點有:

css 都默認加載到 頁面上了;

處理方式有2種:

1. 在 nuxt.config.js 文件 header 配置 link 外鏈這些公共樣式 (下面有具體說明)

2. 在 nuxt.config.js 文件 build 配置 中 自定義文件路徑 以及hash值 (下面有具體說明)

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

1. 資源目錄 (assets)

用于組織未編譯的靜態(tài)資源如 LESS、SASS 或 JavaScript。

2. 組件目錄 (components)

用于組織應(yīng)用的 Vue.js 組件。Nuxt.js 不會擴展增強該目錄下 Vue.js 組件,

即這些組件不會像頁面組件那樣有 asyncData 方法的特性。

3. 布局目錄 (layouts) 該目錄名為Nuxt.js保留的,不可更改。

用于組織應(yīng)用的布局組件。

4. 中間件目錄 (middleware)

目錄用于存放應(yīng)用的中間件

文件名的名稱將成為中間件名稱(middleware/auth.js將成為 auth 中間件)。

一個中間件接收 context 作為第一個參數(shù):

具體參考: https://zh.nuxtjs.org/guide/routing#中間件

5. 頁面目錄 (page) 該目錄名為Nuxt.js保留的,不可更改。

用于組織應(yīng)用的路由及視圖。Nuxt.js 框架讀取該目錄下所有的 .vue 文件并自動生成對應(yīng)的路由配置。

nuxt 會根據(jù)文件夾名稱以及目錄結(jié)構(gòu)動態(tài)生產(chǎn) router, 無需額外配置。

6. 靜態(tài)文件目錄 (static)

用于存放應(yīng)用的靜態(tài)文件,此類文件不會被 Nuxt.js 調(diào)用 Webpack 進行構(gòu)建編譯處理。

服務(wù)器啟動的時候,該目錄下的文件會映射至應(yīng)用的根路徑 / 下。

一般用于 放置公共css,以及 js 文件, 但是如果不想這些css和js走根目錄的話,

需要將這些css放置到 assets中,然后在 nuxt.config.js中 配置 build 選項 下面會具體說明

7. Store 目錄

用于組織應(yīng)用的 Vuex 狀態(tài)樹 文件

注意: 普通的spa 項目中拋出一個實例對象即可, store為:

 
 
 
 
  1. export default new Vuex.Store({  
  2. actions,  
  3. getters,  
  4. })  

這里則需要拋出一個 實例函數(shù)對象:

 
 
 
 
  1. const store = () => {  
  2. return new Vuex.Store({  
  3. state,  
  4. getters,  
  5. mutations,  
  6. actions  
  7. })  
  8. }  
  9. export default store  

8. nuxt.config.js

用于組織Nuxt.js 應(yīng)用的個性化配置,以便覆蓋默認配置。

9. package.json

省略...

別名

~ 或 @ // src目錄

~~ 或 @@ // 根目錄

默認情況下,src目錄和根目錄相同

頁面間路由的跳轉(zhuǎn)

要在頁面之間使用路由,建議使用 標簽。

js 中仍然可以使用 $router.push 等方法。

路由跳轉(zhuǎn)時的頁面間過渡效果

Nuxt.js 默認使用的過渡效果名稱為 page。

需要在 assets/目錄下創(chuàng)建 main.css 添加全局樣式。

 
 
 
 
  1. .page-enter-active, .page-leave-active {  
  2. transition: opacity .5s;  
  3. }  
  4. .page-enter, .page-leave-active {  
  5. opacity: 0;  
  6. }  

然后添加到 nuxt.config.js 文件中:

 
 
 
 
  1. module.exports = {  
  2. css: [  
  3. 'assets/main.css'  
  4. ],  
  5. loading: { color: '#2152F3' },  
  6. }  

更多過渡效果: https://zh.nuxtjs.org/guide/routing#過渡動效

頭部信息 (Meta 標簽 ,全局樣式)

nuxt.config.js 里定義應(yīng)用所需的所有默認 meta 標簽

 
 
 
 
  1. head: {  
  2. meta: [  
  3. { charset: 'utf-8' },  
  4. { name: 'viewport', content: 'width=device-width, initial-scale=1' }  
  5. { hid: 'description', name: 'description', content: '' }  
  6. ],  
  7. link: [ // 這里可以引用全局的樣式,但是會默認走根目錄  
  8. { rel: 'stylesheet', href: 'https://fonts.googleapis.com/css?family=Roboto' }  
  9. { rel: 'stylesheet', href: '~/static/common.js' } // 文件一般都放在static目錄下  
  10. ]  
  11. }  

具體參考:https://zh.nuxtjs.org/api/configuration-head

異步數(shù)據(jù) (asyncData方法,限于page頁面組件,components中不適用)

這里包括 asyncData鉤子 / fetch 鉤子 / 。。。

【fetch】 用于在渲染頁面前填充應(yīng)用的狀態(tài)樹(store)數(shù)據(jù), 與 asyncData 方法類似,不同的是它不會設(shè)置組件的數(shù)據(jù)

【asyncData】 主要用于請求ajax 填充data中的數(shù)據(jù)

每次加載之前被調(diào)用。它可以在服務(wù)端或路由更新之前被調(diào)用。

 
 
 
 
  1. asyncData ({ params }) {  
  2. return axios.get(`https://my-api/posts/${params.id}`) 
  3. .then((res) => {  
  4. // 賦值給頁面 data中的數(shù)據(jù)  
  5. return { title: res.data.title }  
  6. })  
  7. }  

或者變換為同步請求:

 
 
 
 
  1. async asyncData() {  
  2. let formData = {}  
  3. let ajaxData = await axios({  
  4. method: "post",  
  5. url: url,  
  6. data: qs.stringify(formData),  
  7. retryDelay : 1000,  
  8. withCredentials : true,  
  9. responseType : 'json',  
  10. timeout : 60000,  
  11. 'Content-Type' : 'application/x-www-form-urlencoded'  
  12. })  
  13. }  

注意添加 catch

注意:

這個異步請求函數(shù), 第一次執(zhí)行環(huán)境為node環(huán)境中,也就是服務(wù)器端,后續(xù)刷新頁面則執(zhí)行環(huán)境為client 客戶端

本地開發(fā)時,如果在客戶端直接請求完整路徑時會經(jīng)常遇到跨域問題,所以需要在 asyncData 中區(qū)分環(huán)境變量

process.env.VUE_ENV 區(qū)分 是server 還是 client

然后根據(jù)不同的環(huán)境配置不同的 url , 并且在 client時, 需要做服務(wù)器端代理請求,需要給url增加一層代理標識

例如:client環(huán)境中

 
 
 
 
  1. url = '/api' + '/get-user-info';  
  2. nuxt.config.js 中  
  3. /*  
  4. ** 處理代理跨域問題  
  5. */  
  6. axios: {  
  7. proxy: true,  
  8. prefix: '/api', // 增加請求標識  
  9. credentials: true,  
  10. },  
  11. proxy: {  
  12. '/api': {  
  13. // 代理地址  
  14. target: (process.env.NODE_ENV == 'production') ?'http://test.' : 'http://www.' ,  
  15. changeOrigin: true,  
  16. pathRewrite: {  
  17. '^/api': '' // 將標識 替換為 ‘’  
  18. },  
  19. },  
  20. }  

錯誤處理 :

context中提供了一個 error(params) 方法,你可以通過調(diào)用該方法來顯示錯誤信息頁面。

params.statusCode 可用于指定服務(wù)端返回的請求狀態(tài)碼。

 
 
 
 
  1. asyncData ({ params, error }) {  
  2. return axios.get(`https://my-api/posts/${params.id}`)  
  3. .then((res) => {  
  4. return { title: res.data.title }  
  5. })  
  6. .catch((e) => {  
  7. error({ statusCode: 404, message: 'Post not found' })  
  8. })  
  9. }  

第三方插件的使用

例如:element-ui

需要在 plugins/ 中 添加 element-ui.js

 
 
 
 
  1. import Vue from 'vue'  
  2. import Element from 'element-ui/lib/element-ui.common'  
  3. import locale from 'element-ui/lib/locale/lang/en'  
  4. export default () => {  
  5. Vue.use(Element, { locale })  
  6. }  

在 uuxt.config.js 中

 
 
 
 
  1. plugins: [  
  2. "~/plugins/element-ui",  
  3. // {src : '~/plugins/ga.js' , ssr : false} 是否做ssr處理, false時為在客戶端才加載  
  4. ],  

這樣全局就可以使用了

注意:

在使用第三方插件時需要注意 插件內(nèi)部很多地方都會用到window對象,在服務(wù)端會報錯,所以需要將ssr設(shè)置為false

在生產(chǎn)環(huán)境中, 有一些插件,在多個頁面中引用,這樣會造成多次加載打包的現(xiàn)象

所以: 在 build配置項中增加配置

 
 
 
 
  1. build: {  
  2. vendor:['axios', 'qs'], // 防止多次打包  
  3. }  

page 函數(shù)鉤子生命周期 以及window 對象

經(jīng)常會在 第三方組件或者調(diào)用的時候 遇到window對象報錯問題。

 
 
 
 
  1. asyncData() {  
  2. console.log(window) // 服務(wù)端報錯  
  3. console.log(this) // undefined  
  4. },  
  5. fetch() {  
  6. console.log(window) // 服務(wù)端報錯  
  7. },  
  8. created () {  
  9. console.log(window) // undefined  
  10. },  
  11. mounted () {  
  12. console.log(window) // Window {postMessage: ?, blur: ?, focus: ?, close: ?, frames: Window, …}  
  13. }  

css js 文件打包文件夾處理

在 uuxt.config.js 中,只需配置生產(chǎn)環(huán)境中。

 
 
 
 
  1. build: {  
  2. extractCSS: { allChunks: true }, // css 獨立打包 link 的形式加載  
  3. publicPath: '/sample/assets/', //sample/essays 打包的默認路徑為 ‘_nuxt’ 或者可以指定cdn 域名  
  4. filenames:{ // css 和 js img 打包時指定文件夾  
  5. app: ({ isDev }) => isDev ? '[name].js' : '[chunkhash].js',  
  6. chunk: ({ isDev }) => isDev ? '[name].js' : '[chunkhash].js',  
  7. css: ({ isDev }) => isDev ? '[name].js' : '[contenthash].css',  
  8. img: ({ isDev }) => isDev ? '[path][name].[ext]' : '[hash:7].[ext]'  
  9. }  
  10. },  

輸出 css link 路徑: /sample/essays/[contenthash].css

注意: 靜態(tài)資源文件路徑名 不能和頁面路由名稱相同 publicPath 默認配置 '/' 無效

部署

先 npm run build 打包 client文件和 server 文件。

然后 npm runb start 啟動服務(wù)器。

pm2 管理:

 
 
 
 
  1. pm2 start npm --name "my-nuxt" -- run start 

部署時 需要注意 如果是 從其他地方重定向 到 nuxt 環(huán)境中的頁面是, 需要額外配置一個 css / js 重定向路由,并且需要注意 header頭部信息,防止出現(xiàn) css 文件返回頭部信息為 Content-Type text/plain。

目前項目中只運用到這么多,后續(xù)項目遷移時遇到更多的問題會做補充,如果大家遇到過其他的坑點可以在下面評論中總結(jié)出來以及解決方案。


分享名稱:Vue服務(wù)器端渲染nuxt.js初探
本文URL:http://www.5511xx.com/article/cohechg.html