vue-koa 应用脚手架

简介: 支持多语言 支持多页应用 支持多种MOCK

项目地址: github.com/xxx-fe/mall…

mall-app

vue koa 应用脚手架

支持多语言
支持多页应用
支持多种MOCK

Architecture

  • 样式:scss.
  • 库管理:npm,bower(npm有的,bower不需要,但比如boostrap,npm方式比较麻烦,看情况).
  • 框架:vue2,koa2.
  • 模板引擎:handlebars4.
  • 打包:webpack4

运行环境中Nodejs的版本至少是7

目录结构

.
├── build                                       // 使用 vue-cli 2.9.3(有修正)
├── config                                      // 使用 vue-cli 2.9.3(有修正)
├── server                                      // 服务端(koa,nodejs)
│    ├── lib                                    //     库
│    ├── controller                             //     控制器
│    ├── router                                 //     路由(koa-router,或者在前端用vue-router)
│    ├── service                                //     数据(api)
│    ├── view                                   //     视图
│    ├── server.js                              //     服务器入口
├── dist                                        // 生产目录
├── mock                                        // 模拟数据目录
├── public                                      // 公共资源
│    ├── images                                 //     图片
│    └── vendor                                 //     第三方插件
├── web                                         // 前端(vue,js,css...)
│    ├── component                              //     组件
│    ├── lib                                    //     库
│    ├── locale                                 //     多语言文件
│    ├── page                                   //     页面(目录下的每个文件夹都应是一个应用)
│    ├── style                                  //     样式(应用样式)
│    ├── webpack.entry.conf.js                  //     webpack入口配置文件
│    ├── webpack.dev.conf.js                    //     webpack开发模式配置文件
│    └── webpack.pord.conf.js                   //     webpack生产模式配置文件
│   config.yml                                  //     通用配置文件,整个脚手架很多功能都与它有关

安装


npm install    //安装npm
bower install  //安装bower

命令


npm run dev    //启动开发模式
npm run build  //构建项目
npm run prod   //启动生产模式

example

1.新建应用路由

  • /server/router/example/example.js

  • const exampleCtrl = require('../../controller/example/example');
    module.exports.default = module.exports = [
        {path: '', ctrl: exampleCtrl.index},
        {path: 'example', ctrl: exampleCtrl.index},
        {path: 'example/list', ctrl: exampleCtrl.list, method: 'post'}
    ];
    
    

    2.新建应用控制器

    • /server/controller/example/example.js


import exampleService from '../../service/example/example';

const index = async (ctx, _next) => {
    let locals = {
        title: 'example'
    };
    //appName开发模式下不会加载生产后的css
    ctx.state.appName = 'example';
    await ctx.render('page/example', locals);
};

const list = async (ctx, _next) => {
    const service = new exampleService(ctx);
    let locals = {
        list: service.getList()
    };
    ctx.body = locals;
};

module.exports = {
    index,
    list
};



3.新建应用视图


  • /server/view/page/example.hbs
  • {{#extend "layout-example"}}         //使用layout-example布局
        {{#content "head"}}
            {{{parseUrl 'example.css'}}} //exmaple应用的css,直接引用
        {{/content}}                     //不需要新建,build时会抽取vue的style成独立的文件.否则生产模式看不到样式.
        {{#content "body"}}
            <div id="app"></div>
            {{{parseUrl 'example.js'}}}  //exmaple应用的js(相应webpack.entry)
        {{/content}}
    {{/extend}}
    
    

    /server/view/layout/**.hbs 以文件名注册为handlebars partial.

    引用:

  • handlebars(模板引擎)

handlebars-layouts(模板引擎布局helpers)

parseUrl

解析url, handlebars自定义helpers.根据当前开发环境返回正确的url.



{{{parseUrl 'example.css' 'example.js'}}}

结果:

//dev
<link href="/dist/static/css/example.[chunkhash].css" type="text/css" rel="stylesheet">//如果build过,则加载
<script web="example.js"></script>
//prod
<link href="/dist/static/css/example.[chunkhash].css" type="text/css" rel="stylesheet">
<script web="/dist/static/js/example.[chunkhash].js"></script>


如果没有build过,dev模式不会加载example.css,一般情况只加载example.js.即使加载build过的css也不影响dev模式下的样式应用.

4.新建应用页面

  • /web/page/example/example.vue


...
<script>
    export default {
        data () {
            return {
                list: ''
            }
        },
        mounted(){
            this.$http.post('/example/list').then(response => {
                console.log(response);
                this.list = response.data.list
            }, response => {
                console.log(response);
            })
        }
    }
</script>
...


5.新建应用入口

  • /web/page/example/index.js

import Vue from 'vue';
import axios from 'axios';
Vue.prototype.$http = axios;
import exampleApp from './example.vue';
//公共资源样式
import '../../../public/style/common.scss';
$(document).ready(function(){
    new Vue({
        el: '#app',
        template: '<exampleApp/>',
        components: {exampleApp}
    });
});


浏览: http://localhost:3333/example

配置文件

  • /webpack.entry.conf.js

任何模式都引用的配置文件

作为全局通用的入口文件,处在不同位置.在开发,生产模式webapck构建时自动合并引入webpack.entry.(不做其他属性合并).一般情况不作修改.



module.exports ={
    header: './web/lib/header/index.js', //全局头部通用文件
    footer: './web/lib/footer/index.js', //全局底部通用文件
};

header/index.js:不支持删除,在生产模式时,紧接着插入manifest.js,vendor.js.

footer/index.js:支持删除.

  • /webpack.dev.conf.js

开发模式时所引用的配置文件,构建会合并所有属性.


module.exports ={
    entry: {
        example: './web/page/example/index.js'
    },
    //devtool: '#cheap-module-eval-source-map'
    ...
};


  • /webpack.prod.conf.js

生产模式时所引用的配置文件,构建会合并所有属性.


module.exports ={
    ...
    new ManifestPlugin({
        publicPath: 'http://localhost:3333/example'
    })
    ...
};

多语言(locales)

1.配置参数

  • /config.yml
...
#多语言路由前缀
locales: ['zh', 'en'[,.]]
#webpack构建路径(entry)
buildPath:
     -
       name: './web/locale'
...

缺一不可

路由则支持

  • http://localhost:3333/example
  • http://localhost:3333/zh/example
  • http://localhost:3333/en/example

2.创建多语言文件

  • /web/locale/zh.js


window.locale = {
    'desc': 'vue koa 多页应用脚手架'
};

  • /web/locale/en.js


window.locale = {
    'desc': 'vue koa scaffold'
};

多语言文件会在header.js之前插入.

3.调用getLocale全局方法

  • /web/lib/utils/locale.js
getLocale('desc')

mock

  • /config.yml
...
# 是否使用模拟数据api(production模式无效)
isMockAPI : true
# apiServer api服务器
apiServer : 'http://localhost:3334'
...

1.不拦截Ajax方式

1.1 编写/mock/**/.json文件.

  • /mock/example/list.json

现在请求 /example/list

isMockAPI:true

服务端返回 /mock/example/list.json.

isMockAPI:false

服务端返回 http://localhost:3334/example/list.

2.拦截Ajax方式

2.1 编写/public/mock.js文件.

引用:

isMockAPI:true

在页面渲染时紧接着/header/index.js前插入/public/vender/mock-min.js,/public/mock.js.



<script src="/public/vendor/mockjs/dist/mock-min.js"></script><script src="/public/mock.js"></script><script src="header.js"></script>



  • /public/mock.js

这是个全局受影响的mock文件.


Mock.mock('/example/list', 'post', function () {
    return Mock.mock({
        "list|1-10": [{
            'name': '@cname',
            'imageUrl': 'https://placeholdit.imgix.net/~text?txtsize=50&bg=323232&txtclr=ffffff&txt=150%C3%97300&w=300&h=150',
            'description': '@cname'
        }
        ]
    });
});

如果注释该文件则以不拦截AJAX方式发出请求.

isMockAPI:false

不会插入mock-min.js,mock.js.

打包

  • /config.yml
...
#webpack构建路径(entry)
buildPath:
    # name 路径
    # isIndexEntry 是否使用index.js作为webpack.entry.
    # isIndexEntry = true
    # './web/page/example/index.js'  --> /dist/static/js/example[chunkhash].js
    # 使用index.js上一级目录名作为打包文件名(example.js).

    # isIndexEntry = false
    # './web/locale/zh.js'           --> /dist/static/js/zh[chunkhash].js
    # 使用当前文件作为打包文件名(zh.js).
     -
       name: './web/page'
       isIndexEntry : 'ture'
     -
       name: './web/locale'
...

一般情况每一个应用都建立在 /web/page/**/index.js,以index.js作为打包入口.

否则,如果有/web/page/example1/index.js,/web/page/example2/index.js,/web/page/example3/index.js.就会最终构建出以排序最后的index.js.

所以,/web/page/**,只要目录不重名,并且以index.js作为入口.就不会冲突.



原文发布时间为:2018年06月22日
本文作者: 小文酱
本文来源:掘金  如需转载请联系原作者
相关文章
|
3月前
|
存储 JavaScript 前端开发
Vue应用瘦身秘籍:揭秘Vuex如何重塑你的应用状态,让复杂变简单!🔥
【8月更文挑战第27天】在开发Vue应用时,随着应用规模的增长,组件间通信与状态共享问题日益复杂。Vuex作为Vue官方推荐的状态管理库,提供了集中式存储仓库来管理组件的共享状态,简化状态跟踪与组件通信。Vuex的核心概念包括state(存储状态数据)、mutations(同步修改state)和actions(处理异步操作)。通过一个购物车应用示例展示了如何定义state、mutations及actions,以及如何在Vue组件中使用这些状态管理功能。掌握Vuex有助于提高应用的健壮性和可维护性。
62 0
|
3月前
|
存储 缓存 监控
解锁Vuex性能优化的秘密:让大型Vue应用如丝般顺滑,紧跟技术热点,体验速度与效率的双重飞跃!
【8月更文挑战第27天】Vuex是Vue.js应用程序的状态管理解决方案,它允许开发者集中管理组件间共享的状态。然而,在大型应用中,庞大的状态树可能会影响性能。本文介绍几种优化策略:1)精简状态树,避免存储不必要的数据并通过模块化降低复杂度;2)利用getters缓存计算结果以提高效率;3)通过actions处理异步操作,确保状态更新的同步性和逻辑清晰;4)在组件级别上减少不必要的重渲染;5)使用工具如Vue Devtools进行监控和调试。这些方法有助于提升应用的整体性能和用户体验。
67 0
|
6天前
|
JavaScript 搜索推荐 前端开发
Vue SSR 预渲染的广泛应用场景及其优势
【10月更文挑战第23天】Vue SSR 预渲染技术在众多领域都有着广泛的应用价值,可以显著提升网站的性能、用户体验和搜索引擎优化效果。随着技术的不断发展和完善,其应用场景还将不断拓展和深化
19 2
|
17天前
|
JavaScript 前端开发 开发者
Vue v-for 进阶指南:in 与 of 的区别及应用场景 | 笔记
Vue.js 中的 v-for 是强大的遍历指令,但其中的 in 和 of 关键字往往被开发者忽视。尽管它们的用法相似,但适用的场景和数据结构却各有不同。本文将详细探讨 v-for 中 in 和 of 的区别、适用场景以及在实际开发中的最佳使用时机。通过理解它们的差异,你将能够编写更加高效、简洁的 Vue.js 代码,灵活应对各种数据结构的遍历需求。
70 6
|
20天前
|
JavaScript 前端开发 API
Vue.js:打造高效前端应用的最佳选择
【10月更文挑战第9天】Vue.js:打造高效前端应用的最佳选择
15 2
|
28天前
|
存储 JavaScript 前端开发
如何使用Vue.js实现一个简单的待办事项应用
【10月更文挑战第1天】如何使用Vue.js实现一个简单的待办事项应用
24 5
|
7天前
|
缓存 JavaScript 数据管理
优化 Vue 应用中的性能
【10月更文挑战第22天】优化 Vue 应用性能需要综合考虑多个方面,从数据管理、组件化、虚拟 DOM 操作、网络请求、代码结构等多方面入手,不断进行优化和改进,以提供更流畅的用户体验。同时,要根据具体的应用场景和需求,选择合适的优化策略,确保性能优化的效果和可行性。
|
18天前
|
监控 JavaScript 前端开发
深入了解Vue.js:构建现代前端应用的利器
【10月更文挑战第11天】深入了解Vue.js:构建现代前端应用的利器
12 0
|
27天前
|
JavaScript 前端开发 开发者
使用 Vue.js 和 Vuex 构建响应式前端应用
【10月更文挑战第2天】使用 Vue.js 和 Vuex 构建响应式前端应用
23 0
|
2月前
|
JavaScript 前端开发 开发者
深入浅出 Vue.js:构建响应式前端应用
Vue.js 是一个流行的前端框架,以其简洁、高效和易学著称。它采用响应式和组件化设计,简化了交互式用户界面的构建。本文详细介绍 Vue.js 的核心概念、基本用法及如何构建响应式前端应用,包括实例、模板、响应式数据和组件等关键要素,并介绍了项目结构、Vue CLI、路由管理和状态管理等内容,帮助开发者高效地开发现代化前端应用。