從零搭建我的博客網站(一)-自動加載 Koa 路由

其實好久以前就想作一個我的博客網站,服務器域名也很早就買好了。我的就是不知道爲啥一直沒下定決心幹起來,此次由於疫情滯留在家裏(湖北。。。),從新燃起了這個目標.很少BB,直接開幹。前端

框架選擇

在這方面我猶豫了好久,去年學了一下 JAVA-SpringBoot,而後在想要不要繼續深刻下,就用 JAVA-SpringBoot+ react/Vue 。又想,就幾個頁面要不網上直接下個模板 就用原生 + Jquer 幹得了。最後敲定下來 , 前端 React SSR 服務端 Node.Js + Koanode

後端項目搭建

npm init 
複製代碼

添加依賴

npm install koa koa-bodyparser koa-static 
複製代碼

新建項目入口文件 app.js

const koa = require('koa')
var router = require('koa-router')();
const parser = require('koa-bodyparser')

const app = new koa()

app.use(parser())
router.get('/',async (ctx)=>{
    ctx.body="hello node";
})
 
app.use(router.routes()); 
app.on('error', (err, ctx) => {
    console.log('捕獲到了!', err.message);
});

app.listen(8080)
複製代碼

而後在瀏覽器訪問 - http://localhost:8080/react

顯示 hello node , Ok,一個簡單的 Node 服務啓動了.npm

使用 require-directory 自動加載路由

使用 require-directory 庫能夠加載指定文件夾下的全部模塊,而不須要每次都使用 require() 來加載
複製代碼

添加 require-directory 依賴後端

npm install require-directory
複製代碼

基本語法

require-directory 能夠指定文件夾也能夠不指定,文件夾嵌套也沒事。不指定,默認是 __dirname ,即當前模塊的目錄名(絕對路徑),咱們這裏採用 process.cwd()api

有人會問 __dirname 和 process.cwd() 的區別瀏覽器

process.cwd() 是當前執行node命令時候的文件夾地址 ——工做目錄,保證了文件在不一樣的目錄下執行時,路徑始終不變bash

__dirname 是被執行的js 文件的地址 ——文件所在目錄服務器

假如 app 目錄下有 home.js 和 user 目錄,user 目錄下還有 login.js 和 logout.js 文件app

const requireDirectory = require("require-directory");
const modules = requireDirectory(module, `${process.cwd()}/app`);

複製代碼

modules結果至關於

const modules = {
    home: require("./app/home.js"),
    auth: {
        login: require("./app/user/login.js"),
        logout: require("./app/user/logout.js")
    }
}
複製代碼

知道了這個概念咱們下面就好操做了.

自動加載 Koa 路由

const koa = require('koa')
const requireDirectory = require('require-directory')
const Router = require('koa-router')

const app = new koa()

const apiDirectory = `${process.cwd()}/app/api`
requireDirectory(module, apiDirectory, { visit: whenLoadModule })

function whenModuleLoad(obj) {
    if (obj instanceof Router) {
        InitManager.app.use(obj.routes());
    } else if (typeof obj === "object") {
        // 兼容 module.exports 導出對象的寫法
        for (let k in obj) {
            if (obj[k] instanceof Router) {
                InitManager.app.use(obj[k].routes());
            }
        }
    }
}
複製代碼

咱們在 api 目錄下新建 test.js 和 user目錄, 在 user 目錄下新建 login.js 和 logout.js 文件

const Router = require("koa-router");

const router = new Router()

router.get('/test', async (ctx, next) => {
    ctx.body = "usertest"
})

module.exports = router
複製代碼

咱們試試 導出對象的寫法

const Router = require("koa-router");

const router = new Router({
    prefix:'/user'
})

router.get('/login', async (ctx, next) => {
    ctx.body = "login"
})

module.exports = {
    router
}
複製代碼

使用 nodemon 啓動調試

nodemon 用來監視node.js應用程序中的任何更改並自動重啓服務,不須要咱們每次改了代碼手動重啓。

全局安裝 nodemon

npm install nodemon -g 
複製代碼

啓動 app.js

nodemon app.js
複製代碼

ok , 如今咱們依次訪問瀏覽器路由

test.jpg

login.jpg

發現咱們的路由所有都是自動加載了

相關文章
相關標籤/搜索