koa项目构建

【实践作业二】koa实现图书管理系统(上) - 图1

初始化项目

yarn init -y
yarn add koa
配置启动文件app.js

  1. const Koa = require('koa')
  2. const app = new Koa()
  3. app.use(ctx => {
  4. ctx.body = 'hello'
  5. })
  6. app.listen(3000)

配置环境变量(区分开发和生产环境)

config/index.js
yarn add lodash

  1. const { extend } = require("lodash")
  2. const baseConfig = {}
  3. if (process.env.NODE_ENV == "development") {
  4. const localConfig = {
  5. port: 8081
  6. }
  7. baseConfig = extend(baseConfig, localConfig)
  8. }
  9. if (process.env.NODE_ENV == "production") {
  10. const prodConfig = {
  11. port: 80
  12. }
  13. baseConfig = extend(baseConfig, prodConfig)
  14. }
  15. module.exports = baseConfig

修改app.js监听接口来自与配置文件

  1. const {port} = require('./config')
  2. app.listen(port)

需要只能指定环境变量
cross-env, 运行跨平台设置和使用环境变量的脚本
yarn add cross-env
添加脚本”server:start”: “cross-env NODE_ENV=development ./app.js”

自动重启(热更新)

yarn add nodemon —dev
修改脚本 “server:start”: “cross-env NODE_ENV=development nodemon ./app.js”,
启动 yarn server:start

配置路由

yarn add koa-simple-router
app.js 中添加

  1. const router = require('koa-simple-router')
  2. app.use(router(_ => {
  3. _.get('/', (ctx, next) => {
  4. ctx.body = 'hello'
  5. })
  6. _.post('/name/:id', (ctx, next) => {
  7. // ...
  8. })
  9. })

分离controller

app.js 添加路由组册中心

  1. require("./controllers")(app)

controller/index.js

  1. const router = require('koa-simple-router')
  2. const BookController = require("./BooksController")
  3. const bookController = new BookController()
  4. const IndexController = require("./IndexController")
  5. const indexController = new IndexController()
  6. module.exports = app => {
  7. app.use(router(_ => {
  8. // 伪静态
  9. _.get('/', indexController.actionIndex)
  10. _.get('/books/list', bookController.actionIndex)
  11. }))
  12. }

添加 controllers/BooksController

  1. class IndexController {
  2. constructor() {
  3. }
  4. actionIndex(ctx, next) {
  5. ctx.body = {
  6. data: ' 首页'
  7. }
  8. }
  9. }
  10. module.exports = IndexController

首页, 访问 localhost:8081/ 。列表页, 访问 localhost:8081/books/list。

分离Models

添加 models/Books

  1. class Books {
  2. constructor(app) {
  3. this.app = app
  4. }
  5. getData(options) {
  6. return Promise.resolve("数据请求成功")
  7. }
  8. }

修改actionIndex

  1. async actionIndex(ctx, next) {
  2. const books = new Books()
  3. const result = await books.getData();
  4. ctx.body = result
  5. }

生成文档

jsdoc/swagger, vscode插件jsdoc风格注释

yarn add jsdoc —dev
添加脚本 “api:docs”: “jsdoc ./*/.js -d ./docs/jsdoc”

配置别名

// 别名 module-alias
yarn add module-alias
app.js 顶部添加

  1. const moduleAlias = require("module-alias")
  2. moduleAlias.addAliases({
  3. '@root': __dirname,
  4. '@controllers': __dirname+'/controllers',
  5. '@models': __dirname+'/models'
  6. })

【实践作业二】koa实现图书管理系统(上) - 图2

MPA

模版语言

// SSR - 借助模版语言koa2-swig(缓存好)
yarn add koa2-swig
// co 辅助
yarn add co

  1. var render = require('koa-swig');
  2. const co = require("co")
  3. app.context.render = co.wrap(render({
  4. // root: path.join(__dirname, 'views'),
  5. root: viewDir,
  6. autoescape: true,
  7. // cache: 'memory', // disable, set to false
  8. cache: process.env.NODE_ENV == "development" ? false : 'memory',
  9. ext: 'html',
  10. // locals: locals,
  11. // filters: filters,
  12. // tags: tags,
  13. // extensions: extensions
  14. writeBody: false
  15. }));

模版语言

创建views/layout.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width">
  6. <head>
  7. <meta charset="utf-8" />
  8. <title>
  9. {% block title %}{% endblock %}
  10. </title>
  11. {% block style %}{% endblock %}
  12. </head>
  13. </head>
  14. <body>
  15. {% block content %}{% endblock %}
  16. {% block script %}{% endblock %}
  17. </body>
  18. </html>

创建 views/index.html

  1. {% extends './layout.html' %}
  2. {% block title %}
  3. 首页
  4. {% endblock %}
  5. {% block content %}
  6. <h1>首页</h1>
  7. {% endblock %}
  8. {% block script %}
  9. <script>
  10. console.log('本地log')
  11. </script>
  12. {% endblock %}

引入外部资源(js/css)

yarn add koa-static
app.js 添加

  1. const serve = require('koa-static')
  2. app.use(serve(path.join(__dirname, 'assets')))

index.html中添加 外部资源引入

  1. {% block style %}
  2. <link rel="stylesheet" type="text/css" href="/styles/index.css" />
  3. <style>
  4. .gray-text{
  5. color: #eee;
  6. }
  7. </style>
  8. {% endblock %}
  9. {% block script %}
  10. <script src="/scripts/index.js" ></script>
  11. <script>
  12. console.log('本地log')
  13. </script>
  14. {% endblock %}

创建assets/scripts/index.js
创建assets/styles/index.css

模版冲突

与vue中{{ }}
解决方案一:模版render中添加

  1. app.context.render = render({
  2. varControls: ["[[", "]]"]// 双花括号冲突
  3. })

解决方案二:修改vue的编译格式

  1. new Vue({
  2. delimiters:['$$','$$'],
  3. })

MPA+SPA,vue项目继集成

ApiController.js
前端路由(SPA), 靠js驱动
后端路由 (MPA)

pushstate

需要区分前后端路由
// koa2-connect-history-api-fallback, 添加白名单
yarn add koa2-connect-history-api-fallback

压测swig缓存优势,qps

函数式编程学习路径:
概念 — 实战 redux

搭建vue工程

  1. // 检查node和npm版本
  2. node/npm --version
  3. yarn global add @vue/cli
  4. yarn info @vue/cli version
  5. vue --version
  6. vue create homework-books
  7. $ cd homework-books
  8. $ yarn serve

开发访问 http://localhost:8080/