脚手架简介

项目初始化结构如下

project
├── mock
│   ├── mock.config.js
│   └── rpc
│       └── test.js
├── package.json
├── www
└── src├── common│   ├── components│   ├── css│   │   └── base.less│   ├── img│   └── js├── layout│   ├── index.html│   └── layout.html└── pages└── index├── components├── index.js└── store

mock
该目录提供了一种数据方式,即使用 cnpm run dev:mock 启动时,会自动加载其中的 rpc 目录和 jsapi 目录的对应数据接口。

package.json
在 package.json 文件中的 kylinApp 字段包含了项目配置的元信息,主要有 pages、output、devPort、plugins、dirAlias。

www
执行 cnpm run build 之后,会自动将构建产物输出到www目录中

src/common
用以放置项目中使用的CSS,JS,IMG文件

src/layout
对应./src/pages/${pageName} 的各个页面,可以在 package.json 中配置对应页面使用的 HTML 模板路径。支持 Nunjucks 语法。

src/pages
此目录用于存放各个页面。页面存放于 ./src/pages/${pageName}/ 目录下,各页面分别包含 components , store 和 index.js 。

  • components 目录中,每个组件都是 Vue 组件,具体编写规范请参考 组件规范。
  • store 目录中,有一个 Vuex.Store 实例,具体使用请参考 状态注入。
  • index.js 为当前 page 的主入口,这里的 page 页面最后会生成一个特定的 ${pageName}.html 页面

页面

Page是一个Webview的逻辑抽象层,同时也是组件挂载的根节点。
注意关于页面Page的代码全在src/pages的index.js里面

代码引入

import { Page } from '@ali/kylin-framework';

页面声明结构

一个Page包含的借口咋页面接口中声明,提供了对Vue实例的完整控制能力,简易的Page使用如下,initOptions负责处理额外的Vue配置选项。
demo

import { Page } from '@ali/kylin-framework';
import IndexComponent from './indexComponent.vue';class IndexPage extends Page {initOptions() {return {}}render(h) {return <IndexComponent></IndexComponent>}}new IndexPage('#app');

实例代码

import { Page } from '@ali/kylin-framework';
import IndexView from './components/index-view.vue';
import store from './store';
import FastClick from 'fastclick';
import '@alipay/antui/dist/rem/antui.css';
import '@alipay/antui/dist/rem/widget/switch.css';
import "@alipay/antui/dist/rem/widget/dialog.css";
import "@alipay/antui/dist/rem/widget/toast.css";
// 自定义指令
import Vue from "vue";
import DiyDirective from 'common/js/registerDirectives.js';
Vue.use(DiyDirective);FastClick.attach(document.body);class IndexPage extends Page {initOptions() {return {store};}render() {return <IndexView></IndexView>;}
}
new IndexPage('#app');

页面接口

命名空间

es6 通过如下方式引入

import { Page } from '@ali/kylin-framework';

API

目前Page提供如下成员方法以供派生:

  • initOptions
  • render

initOptions

function initOptions(): VueOptions

返回值
返回结果要求是一个合法的Vue入参。一般来说,不建议在Page层引入过于复杂的配置,设计到的逻辑都可以放到 Component 中来维护。

render
该函数要求是一个合法的Vue的render函数

function render():VNode

返回值
返回结果要求是合法VNode元素,请按照JSX规范书写。

组件

Componet扩充自Vue的组件,提供了Vue组件对等的输入参数能力。在代码书写时提供类class的装饰器Decorator风格。

注意关于组件Component的代码全在src\pages\xxx\components里面

代码引入

import { Component, Watch } from '@ali/kylin-framework';

组件声明结构

一个组件可以包含数据,JSX渲染函数,模板,挂载元素,方法,生命周期等Vue的options选项的对等配置。组件声明包括以下几部分, 分别使用@Component和@Watch两种不同装饰器进行包装:

  • class类声明,使用装饰器@ Component。
  • 类成员声明,不使用装饰器
  • 类成员方法声明,一般不装饰器,除非该方法需要watch另外一个已声明的变量。

vue单文件组件

<!-- Hello.vue --><template><div>hello {{name}}<Child></Child></div>
</template><style>/* put style here */
</style><component default="Child" src="./child.vue" /><script>import { Component } from '@ali/kylin-framework';@Componentclass Hello {data = {name: 'world'}}export default Hello;
</script>

组件接口

跟vue基本一致,组件定义写在.vue文件内,以下是一个简单的例子:

demo

<template><div><AButton @click="onClick">点击</AButton></div>
</template><style lang="less" rel="stylesheet/less">/* less */
</style><dependency component="{ AButton }" src="@alipay/antui-vue" lazy/><script type="text/javascript">import { Component } from '@ali/kylin-framework';@Componentexport default class IndexView {props = {}data = {}get comput() { return this.data.c * 2 }onClick() {}mounted() {}}
</script>

实例代码

<template><div><Toast @click="onClick">点击</Toast></div>
</template><style lang="less" rel="stylesheet/less" scoped>/* less */
</style><dependency component='Toast' src="common/compoments/toast.vue" lazy/><script type="text/javascript">import { Component } from '@ali/kylin-framework';@Component({mapStateToProps: ["xxxx", "yyyyy", "zzzzz"],//数据mapActionsToMethods: ["bbbbb", "qaaaa"]//方法
})export default class IndexView {props = {}data = {}get comput() { return this.data.c * 2 }mounted() {}}
</script>

上述例子中,有个顶级标签,除了与vue相同的<template>、<style>、<script> 之外,还有一个 <dependency> 标签。

<template>、<style>与vue一致

script

class结构
定义一个Componet,在代码结构上,使用;类class的装饰器Decorator风格。其中装饰器有 @Component 和 @Watch 这 2 种,通过以下方式引入。

import { Component, Watch } from '@ali/kylin-framework';@Component
export default class Hello {}

方法类型
组件以class形式声明,必须对该class进行装饰修饰。在class内部,成员变量是不需要被手动处理的,在构建过程中通过 babel 插件自动进行处理,而成员函数一般不需要装饰器挂载,除非是使用@Watch的场景,其中@Component回处理的属性如下表


getter/setter属性

@Component
export default class Hello {get computName() {// to sth}
}

上述getter声明,等价于如下Vue配置

HelloOption = {computed: {computName: {get: computName() {// to sth}}}
}

同理,setter也会被提取,如果同时存在getter和setter则会一起被提取。

生命周期函数

@Component
export default class Hello {created() {}mounted() {}
}

Watch
该装饰器的出现,只是因为watch需要有以下几个要素

  • 被监听的变量名
  • 监听选项
  • 触发函数

用法
完整的@Watch接口如下表所示

示例

  • 对于@Watch装饰的成员函数,支持对成员函数配置多个变量的监听,如下同时对a和c的变化进行了监听,如果任何一个发生变化,会触发 OnChangeA 成员方法。
  • 如下,OnChangeA本质是成员方法,所以他也会和其他成员方法一起被提取到methods块中,那么必须保证没有与其他方法重名。
  • 如果对Watch有额外配置项,请按@Watch('a', {deep: false})的方法传入,配置项请参考watch配置项
@Component
class WTest {data = {a: {b: 2},c: 3}@Watch('c')@Watch('a', {deep: false}) OnChangeA(newVal, oldVal) {}
}

注意 以上对 data.a 的监听,会转换成如下形式,需要注意的是,如果没开启 deep: true 选项,当 data.a.b 发生变动的时候,不会触发该 OnChangeA 监听。

实例代码

 @Watch('count') // 监听倒计时,清理timeID并重置mm(oldValue, newValue) {if (oldValue < 1) {clearInterval(this.t);this.t = null;this.count = 60;this.$parent.$parent.sendSuccess = false;}}@Watch('sendSuccess')sendS(oldValue, newValue) {if (oldValue) {this.used = true;this.t = setInterval(() => {this.count = --this.count;}, 1000);}}

属性类型
构建工具会自动对成员变量应用了@Component.Property装饰器,不需要用户手动填写,最终的合并策略取决于被装饰的成员变量的标识符名称,框架内置了以下几种。如果不在下表中,会透传至 VueComponent 的 options 对象中。

props

@Component
export default class Hello {props = {name: {type: String,default: 'haha'},num: Number}
}

详情请看API-props

data

@Component
export default class Hello {props = {name: {type: Number,default: 1},}data = {hello: this.props.name + 2}
}

上述 data 成员变量定义,会被转换成 data 函数形式,您无需手动编写 data 函数。

TestOption = {props: {name: {type: Number,default: 1}, },data: function data() {return {hello: this.props.name + 2}}
}

dependency

上述

<template><child></child>
</template><dependency component="Child" src="./child.vue" />



默认对 @alipay/antui-vue 组件库支持 babel-plugin-import 按需加载。

状态注入

推荐使用下面的connent机制来透传$store数据

  • 接口声明

  • 透传数据有以下三种方式

    1.mapStateToProps

    2.mapActionsToMethods

    3.mapMethods

接口声明

@Component({mapStateToProps: Object|Array,mapActionsToMethods: Object|Array,mapMethods: Array|Boolean,mapEvents: Array
})
class Hello {}

mapStateToProps
把state中的特定键值映射到当前组件的props中,其接收参数等价于Vuex提供的mapState辅助函数

辅助函数图解
第一个版本
首先是html


第二个版本
首先是html


第三个版本
首先html


新写法


mapStateToProps:以下三种方式实现

1.函数方式
说明 把 $store.state 中的名为 bbb 的数据,映射到名为 aaa 的 props 上。

{mapStateToProps: {aaa: (state, getters) => state.bbb}
}

2.字符串键值对方式
说明 把 $store.state 中名为 bbb 的数据,映射到名为 aaa 的 props 上。

{mapStateToProps: {aaa: 'bbb'}
}

3.字符串数组方式

  • 把 $store.state 中名为 aaa 的数据,映射到名为 aaa 的 props 上。
  • 把 $store.state 中的名为 bbb 的数据,映射到名为 bbb 的 props 上。
{mapStateToProps: ['aaa', 'bbb']
}

mapActionsToMethods(常用)
与 Vuex 中 mapActions 入参一致,支持使用对象方式(名称映射)、数组方式(名称)把在全局 $store 下配置的 actions 注入到当前组件的 methods 中。

@Component({mapActionsToMethods: ['a', 'b']
})
class IndexView {async doSomeAction() {const ret = await this.a(123);// 等价于调用// const ret = await this.$store.dispatch('a', 123);}
}

mapMethods
通过在父子组件之间加一层中间层组件的方式来具体实现 connect 机制。当父组件调用子组件中特定的 method 方法时,无法直接访问子组件(实际访问到的是中间层组件),需要通过以下配置实现访问。

@Component({mapMethods: true
})
export default class Child {a() {}
}
<template><div>this is parent<child ref="child"></child></div>
</template>
<script>@Componentexport default class Parent {b() {// 此处可以访问this.$refs.child.a();}}
</script>

命令行工具

初始化

当工程脚手架初始化完后,如果需要新增页面,除了单纯的复制粘贴以外,提供了以下命令来添加页面定义和组件定义

  • init-page
  • init-component

init-page

命令格式

kylin init-page <pageName>

注意

  • 上述命令中pageName为必选参数,指新创建页面的英文名称。
  • 如果当前 cwd 下有 package.json 并且存在 kylinApp 字段,则会自动往 kylinApp.pages 添加新增的 page。

init-component

命令格式

kylin init-component <componentName>
``**项目常用构建**

kylin build --dev # dev 构建及静态服务器
kylin build --server --no-prod --hot # dev 构建及静态服务器及启用热更新
kylin build --server # prod 构建及静态服务器
kylin build --no-prod --watch # dev 构建及监听文件变化


mpaaS的kylin框架-项目结构(脚手架)相关推荐

  1. springboot项目结构_从零搭建Spring Boot脚手架(1):开篇以及技术选型

    1. 前言 目前Spring Boot已经成为主流的Java Web开发框架,熟练掌握Spring Boot并能够根据业务来定制Spring Boot成为一个Java开发者的必备技巧,但是总是零零碎碎 ...

  2. gin 项目结构_Gin框架 - 项目目录

    GO GO语言 GOLANG Gin框架 - 项目目录 概述 今天给大家分享,在 API 端使用 Gin 框架时,项目的目录. 目录 ├─ Project Name │ ├─ config //配置文 ...

  3. 在Blazor中构建数据库应用程序——第1部分——项目结构和框架

    目录 介绍 存储库和数据库 设计理念 数据 UI 解决方案结构 界面结构 页面 路由视图 布局 表单 控件 Blazor.Database项目 Program.cs ServiceCollection ...

  4. 快速上手Flask(一) 认识框架Flask、项目结构、开发环境

    文章目录 快速上手Flask(一) 认识框架Flask.项目结构.开发环境 Web开发轻量级框架Flask Flash历史和团队 Pallets 项目 flask运行过程 使用flask的场景 使用P ...

  5. 使用vue-cli脚手架初始化Vue项目下的项目结构

    vue-cli是Vue 提供的一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程.只需几分钟即可创建并启动一个带热重载.保存时静态检查以及可用于 ...

  6. Django框架学习——1—(虚拟环境搭建、MVC思想与Django的MVT区别、Django项目的创建、运行Django项目、项目结构介绍)

    1.虚拟环境搭建 创建新的Django框架的虚拟环境: 注意:如果没有pipenv指令,需要安装这个支持库,同时需要记住配置它的环境变量,否则虚拟环境会安装在默认文件夹下(一般是C:\Users\Ad ...

  7. 二十四、【开源】EFW框架Winform前端开发之项目结构说明和调试方法

    回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan.baidu. ...

  8. JavaWeb项目结构使用Vue项目

    提示:javaweb项目中引用Vue项目的案例 文章目录 前言 一.JavaWeb项目结构 项目启动顺序 二.Vue项目结构 Vue结构粗略解释 思考 三.使用Vue 1.使用vue.js, 在htm ...

  9. 初识Reactjs的项目结构与思想

    前言 一个月之前,学完了html.css.html5.css3.接下来,准备入坑传说中的前端框架,首先明白一个东西,什么是框架?框架顾名思义,是别人集成好的一系列技术,那么基于框架的开发,其实也就是在 ...

最新文章

  1. 领歌leangoo敏捷工具个人工作台功能
  2. Jetty 开发指南:嵌入式开发示例
  3. (chap5 web服务器) 数据转发之“网关和隧道”
  4. 源码包编译PHP5.6,源码编译安装php5.6
  5. C++中for循环的5种语法
  6. php dom 分离html内容
  7. 【numpy】查询手册
  8. 全网最新Linux全套教程
  9. 如何下载网易公开课视频(转载)
  10. Codeforces Round #822 (Div. 2) C Removing Smallest Multiples(复杂度为调和级数级别的暴力)
  11. 陆金所金融核心场景数据库的去 O 之路
  12. Google地图开发初级篇
  13. php查询mysql显示在html表格中_php – 在网页上的HTML表格中显示MySQL数据库表中的值...
  14. 【Java中继承总结与练习 】
  15. Excel电子表格隔行自动填充底色
  16. 企业如何建立商业生态系统
  17. 期权组合策略用matlab分析,matlab期权分析
  18. Web前端HTML5CSS3初学者零基础入门——第三天
  19. mysqldump备份恢复数据库
  20. 使用mint ui(一)

热门文章

  1. 数字信号处理基础----采样定理
  2. 北大学霸隐居20年,王青松花光350万后,如今怎么样了?
  3. Javascript是什么,能干什么、JavaScript的发展史、JavaScript的使用、方式一:内部引用、方式二:外部引用、程序设计的基础、数据类型与变量、运算符
  4. UltraEdit注册机使用教程
  5. mt管理器主题修改教程_领不了的QQ画图红包教程
  6. 黑鲨会升级鸿蒙吗,黑鲨游戏手机2系统更新好吗?
  7. HTML网页字体动态显示
  8. 【科研学术】Typora之markdown公式,汇总,看这一篇就够了~
  9. 关于工作中的相关问题的看法和建议 (一)JAVA小组的调整问题
  10. RT-Thread 柿饼GUI