使用Nuxt.js改造已有項目的方法
前言
如果我們需要對現(xiàn)有的vue項目進(jìn)行ssr改造,使用nuxt.js是一個不錯的選擇。這里用作例子的“現(xiàn)有項目”是一個“高仿”餓了么外賣APP的spa。不過我沒有把全部功能開發(fā)出來(全部做出來就不得了了),只是做出幾個基本界面意思意思
下面就以這個demo為小白鼠進(jìn)行ssr改造
準(zhǔn)備
現(xiàn)有目錄
很明顯,這是使用vue-cli搭建的項目
其中prod.server.js是build之后的啟動文件
dataa.json文件是模擬數(shù)據(jù),在build/dev-server.js中會用到它
安裝與配置
安裝nuxt
npm install --save-dev nuxt
新建nuxt文件夾
我們需要在根目錄下建立一個nuxt文件夾,該文件夾的內(nèi)部組織按照nuxt本身的應(yīng)用目錄架構(gòu)進(jìn)行組織(參考)
注意,在static目錄下有一個logo.png,它將作為項目圖標(biāo),在nuxt.config.js中這張圖片的地址直接寫成/logo.png。下一節(jié)會對nuxt文件夾的組織進(jìn)行詳細(xì)說明。
新建并設(shè)置nuxt.config.js
當(dāng)然,我們也需要在根目錄下創(chuàng)建nuxt.config.js文件用于組織Nuxt.js 應(yīng)用的個性化配置,在這個項目中,需要進(jìn)行設(shè)置的點(diǎn)有:
- 源碼目錄路徑
- head中的meta以及l(fā)ink(主要是圖標(biāo))
- 全局的css樣式
- 項目中需要使用圖片和字體文件,雖然nuxt默認(rèn)對其進(jìn)行配置,但我們需要重新定義部分內(nèi)容(項目中是擴(kuò)大limit)
- 項目中使用了sass,需要對其進(jìn)行配置
所以,nuxt.config.js的代碼如下
module.exports = {
// 設(shè)置nuxt源碼目錄路徑
srcDir: "nuxt/",
head: {
title: "sell-nuxt",
meta: [
{
charset: "utf-8"
},
{
name: "viewport",
content: "width=device-width, initial-scale=1,user-scalable=no,maximum-scale=1.0,minimum-scale=1.0"
}
],
link: [
{
rel: "shortcut icon",
type: "image/png",
// 注意圖片的路徑直接指向static下的logo.png
href: "/logo.png"
}
]
},
css: [
"~assets/reset.css"
],
build: {
vendor: ['axios'],
loaders: [
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'img/[name].[hash:7].[ext]'
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: 'fonts/[name].[hash:7].[ext]'
}
},
{
test: /\.scss$/,
loader: "vue-style-loader!css-loader!sass-loader"
}
]
}
}
配置package.json
package.json是npm的配置文件,現(xiàn)在,我們需要對script選項進(jìn)行配置
"scripts": {
"dev": "nuxt",
"build": "nuxt build",
"start": "nuxt start",
"generate": "nuxt generate",
"lint": "eslint --ext .js,.vue --ignore-path .gitignore .",
"precommit": "npm run lint"
}
可以參考nuxt的命令列表
改造后的目錄
其中有個nuxt.api.js,這個文件是為完成ssr改造后的項目提供api接口的,使用koa,運(yùn)行在3001端口
nuxt文件夾組織
因為我們已經(jīng)把項目代碼開發(fā)出來了,所以nuxt文件夾里面的大部分代碼可以直接從已有代碼中拷貝
layouts
布局目錄 layouts 用于組織應(yīng)用的布局組件,nuxt可通過添加 layouts/default.vue 文件來擴(kuò)展應(yīng)用的默認(rèn)布局,在layouts下新建default.vue
<template>
<div id="app">
<v-header v-bind:seller="seller"></v-header>
<v-tab></v-tab>
<nuxt/>
</div>
</template>
<script>
import axios from 'axios';
// 引入組件
import header from "~/components/header/header.vue";
import tab from "~/components/tab/tab.vue";
export default {
data:function(){
return {
seller:{}
}
},
created:function(){
axios.get("http://localhost:3001/seller").then(res=>{
console.log(res.data);
this.seller = res.data.data;
});
},
components:{
"v-header":header,
"v-tab":tab
}
}
</script>
<style lang="scss" rel="text/css">
</style>
<nuxt/> 組件用于顯示頁面的主體內(nèi)容,即“商品”、“評論”、“商家”這幾個部分
pages
nuxt依據(jù) pages 目錄結(jié)構(gòu)自動生成 vue-router 模塊的路由配置,這無疑是非常方便的
不難看出goods、patings、seller分別對應(yīng)“商品”、“評論”、“商家”
這樣子設(shè)置,則nuxt自動生成的路由配置如下
router: {
routes: [
{
name: 'index',
path: '/',
component: 'pages/index.vue'
},
{
name: 'goods',
path: '/goods',
component: 'pages/goods/index.vue'
},
{
name: 'patings',
path: '/patings',
component: 'pages/patings/index.vue'
},
{
name: 'seller',
path: '/seller',
component: 'pages/seller/index.vue'
}
]
}
但我們希望默認(rèn)進(jìn)入goods,nuxt官方文檔并沒有說如何設(shè)置默認(rèn)路徑,這就是為什么要在pages下面創(chuàng)建一個index.vue
<template>
</template>
<script>
export default {
created:function(){
this.$router.push('/goods'); // 頁面加載時跳轉(zhuǎn)
}
}
</script>
<style lang="scss" rel="text/css">
</style>
對于那些不需要像在pages下的頁面組件那樣有 asyncData 方法的特性的組件,我們可以將他們放到components目錄下
assets
資源目錄 assets 用于組織未編譯的靜態(tài)資源如 LESS、SASS 或 JavaScript,這個目錄是我感覺在引用路徑時最坑的一個。
在官方文檔中,每個目錄都有別名,這些別名在nuxt.config.js中配置時是有效的,比如之前配置的css選項,但不代表我們在組件中使用這些別名會有效,在組件中我們最好使用相對路徑,比如在components/header/header.vue中就不能直接寫~assets,而得老老實實寫相對路徑
<style lang="scss" rel="text/css" src="../../assets/base.scss"></style> <style type="text/css" src="../../assets/style.css"></style> <style lang="scss" rel="text/css"> @import "../../assets/mixin.scss"; @import "./header.scss"; </style>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue如何設(shè)置描點(diǎn)跳轉(zhuǎn)到對應(yīng)頁面
這篇文章主要介紹了vue如何設(shè)置描點(diǎn)跳轉(zhuǎn)到對應(yīng)頁面問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Vue3使用el-form嵌套el-table進(jìn)行單條數(shù)據(jù)的表單校驗功能
在實際開發(fā)過程中,我們經(jīng)常需要處理表格中的表單數(shù)據(jù),比如在編輯表格中的某一行數(shù)據(jù)時進(jìn)行校驗,本文給大家介紹了Vue3使用el-form嵌套el-table進(jìn)行單條數(shù)據(jù)的表單校驗功能,文中有相關(guān)的代碼供大家參考,需要的朋友可以參考下2024-08-08
vue3.x源碼剖析之?dāng)?shù)據(jù)響應(yīng)式的深入講解
這篇文章主要給大家介紹了關(guān)于vue3.x源碼剖析之?dāng)?shù)據(jù)響應(yīng)式的相關(guān)資料,在講解過程中,我們會對比Vue2.x的API特性,使用有哪些區(qū)別,需要的朋友可以參考下2022-01-01

