Giter Club home page Giter Club logo

webapp-template's Introduction

webapp-template

基于koa2,umijs,antd-pro5 的 web 应用模板项目。

技术栈

客户端

  • umijs
  • antd-pro5
  • react
  • dva

服务端

  • koa2
  • koa-router 路由
  • koa-nunjucks-2 模板引擎
  • koa-static 静态资源管理

项目搭建过程

构建和本地部署

使用 docker 构建应用并部署在本地

  • build docker image
# BASH
docker build -t ${your_name}/${image_name}:${tag} .
  • 启动容器
# BASH
docker run --rm -d -p 80:3000 ${your_name}/${image_name}:${tag}

# eg. docker run --rm -d -p 80:3000 zhangss2017/centos:0.1.0
# --rm 容器退出后随之将其删除
# -d 后台运行
# -p 指定端口映射 前者(80)为外界访问应用的端口,后者(3000)是Dockerfile里EXPOSE指定的端口
  • 同步镜像到 docker hub
# BASH
docker push ${your_name}/${image_name}:${tag}

webapp-template's People

Stargazers

 avatar

Watchers

 avatar  avatar  avatar

webapp-template's Issues

docker 基本概念和常用操作

基本概念

docker 是一项虚拟化容器技术,它可以直接运行在宿主机器上,共享宿主机器上的资源。
docker 虚拟环境的内核其实就是一个 Linux VM。

docker 有三个核心概念:镜像(image)、容器(container)、仓库(registry)。

镜像

镜像可以理解为一个可独立运行环境的只读文件(或者说是描述文件),有点类似于windows操作系统镜像文件,里面不仅包含了windows操作系统,还安装了一些软件、应用,比如 IE浏览器、office套件之类的。

镜像是一个模板,可以基于某个镜像运行多个容器实例,就像 windows操作系统的镜像文件一样,可以被安装到多台电脑上并运行。

容器

Docker容器本质上是宿主机上的进程。

Docker 通过namespace实现了资源隔离,
通过cgroups实现资源限制,
通过写时复制机制(Copy-on-write)实现了高效的文件操作。

容器是从镜像创建的运行实例。

可以把容器看做一个简易的Linux环境,docker 就是利用容器来运行应用。

容器之间是彼此隔离的,对外界环境不感知。

镜像是只读的,容器在启动时创建一层可写层作为最上层。

仓库

为了方便管理镜像文件,可以把镜像放在仓库中,可以类比 git 仓库。

docker 仓库分为公共仓库和私有仓库。你可以从公共仓库拉取别的镜像直接使用,也可以把自己的镜像放到公共仓库共享出去。

docker hub

常用操作

操作容器

容器可以 启动、开始、停止、删除。

  • 启动容器
# BASH
docker run --rm -d -p 80:3000 ${your_name}/${image_name}:${tag}
# eg. docker run --rm -d -p 80:3000 zhangss2017/centos:0.1.0
# --rm 容器退出后随之将其删除
# -d 后台运行
# -p 指定端口映射 前者(80)为外界访问应用的端口,后者(3000)是Dockerfile里EXPOSE指定的端口
  • 查看所有容器
# BASH
docker ps # 所有

docker ps -a # 所有正在运行的
  • 删除所有停止的容器
# BASH
docker container prune -f

操作镜像

  • build docker image
# BASH
docker build -t ${your_name}/${image_name}:${tag} .
  • 查看所有镜像
# BASH
docker images
  • 删除所有不使用的镜像
# BASH
docker image prune -f -a
  • 同步镜像到 docker hub
# BASH
docker push ${your_name}/${image_name}:${tag}

前后端项目混合应用开发

本项目是一个前后端混合的项目。

技术栈

前端技术栈:umijs、react、dva、umi-request
后端技术栈:koa、koa-static、koa-nunjucks-2
工具插件:concurrently、nodemon

目录结构

webapp
│   README.md
│   Dockerfile
│   package.json  
│
└───client
│   │   tsconfig.json
│   │   .eslintrc.js
│   │
│   └───config
│   │    │   config.ts
│   │    │   ...
│   └───src
│        │   app.tsx
│        └───assets
│        └───components
│        └───models
│        └───pages
│   
└───server
    │    server.ts
    │    tsconfig.json
    │    .eslintrc.js
    └───controller
         │    home.ts
    └───service
    └───middles
    └───models
    └───router
    └───view
         │    index.html

混合开发策略

  • 前端负责打包生成资源文件,.js,.css等
  • 后端负责渲染模板html,加载前端生成的资源文件

修改前端项目开发模式下的打包策略

默认情况下,umijs会将资源文件拆包,以实现动态引入,这在混合app里不太友好,在html模板中无法引入全部的资源文件,我们需要改变umijs开发模式下的打包方式,让所有的资源只生成一个*.js文件和*.css文件。

做法也比较简单,只要将dynamicImport在开发模式下禁掉就行,配置修改如下图:
image

后端负责渲染模板文件

  • 在模板文件中,加载前端生成的资源文件
    image

图中的资源文件,以 dev-server 服务地址的方式引入。

  • 使用koa-nunjucks-2模板引擎渲染模板
// home controller
export default {
  index: async(ctx, next) => {
    await ctx.render('index');
  }
}
// router
import Router = require('koa-router');
import HomeCtrl from '../controller/home';
import UserCtrl from '../controller/user';

const router = new Router();

export default (app) => {
  router.get('/api/currentUser', UserCtrl.current);
  router.all('(.*)', HomeCtrl.index); // 设置通配符路由
  app.use(router.routes());
};
// server.ts

import Koa = require('koa');
import router from './router';

const path = require('path');
const koaNunjucks  = require('koa-nunjucks-2');

const serve = require('koa-static');


const app = new Koa();

const staticPath = path.join(__dirname, 'views');
app.use(koaNunjucks({
  ext: 'html',
  path: staticPath,
  nunjucksConfig: {
    noCache: true
  }
}))

app.use(serve(staticPath))

router(app);

app.listen(3000, ()=> {
  console.log(`Server running on  http://localhost:3000`);
});

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.