github: maka.js 留下您宝贵的STAR!谢谢


maka

  • maka源于中文码咖,意为写代码的大咖
  • 一眼即可看懂的前端框架,简约而不简单

1、安装

bash sudo npm i -g @makajs/cli

依赖项: - npm - yarn bash sudo npm i -g yarn

2、快速上手

bash maka app helloworld cd helloworld yarn start 创建一个名叫helloworld的应用,并且运行起来

3、入门概念

3.1、State

js const state = { data: { content: 'hello ', input: '' } }

  • state很简单,可以理解为是应用的数据部分
  • 引擎内部状态的存储结构是immutable类型
  • 每次状态变化会通知view,重新render

3.2、Action

` js @actionMixin('base') class action { constructor(option) { Object.assign(this, option.mixins) }

onChange = (e) => {
this.base.setState({ 'data.input': e.target.value })
console.log(this.base.getState('data.input'))
}

} `

  • action很简单,可以理解为是一些提供给ui调用的函数
  • actionMixin,混入外部action,默认混入了maka引擎base
  • 详细参见后面高级概念

3.3、View

js const view = { component: 'div', className: 'hello', children: [{ component: 'div', children: '{{data.content + data.input}}' }, { component: 'input', placeholder: 'world', value: '{{data.input}}', onChange: '{{$onChange}}' }] }

  • view很简单,可以理解为react的json化表示
  • component是react组件名
  • 详细参见后面高级概念

4、高级概念

4.1、表达式

view的所有属性值支持表达式语法

表达式可以支持js语法,见下面示例

  • 绑定state中path为data.content的数据 js { ... value: `{{data.content}}` //value = state.data.content ... }

  • 绑定action中方法名为onChange的函数 js { ... onChange:{{$onChange}}` // onChange = action.$onChange ... }

`

  • 函数体 js { onChange: {{{ debugger; return $onChange }}}`

    / onChange = new Function( debugger; return action.onChange )() / } `

4.2、view节有哪些系统属性?

javascript { component: 'div', children: 'hello', _visible: 'true' }

这里说的系统属性就是上面例子中的component、children、_visible等; 除系统属性外还可以设置控件支持的任何属性; 主要支持下面描述的几种系统属性;

  • component 组件名,缺省可使用所有html元素 javascript { component: 'div' } //<div></div>
  • children 子组件 `javascript { component: 'div' children: { component: 'div', children: 'children' } }

/ <div> <div>chidlren</div> </div> / `

  • _visible 是否显示,值支持表达式, 默认true

`javascript { component: 'div', _visible: false }

` _visible设置为false,将不创建该组件

  • _for 循环,支持for嵌套

`javascript const state = { data: { list: [{a:1}, {a:2}, {a:3}] } }

const view = { component: 'div', children: { _for: 'item in data.list', // or (item,index) in data.list component: 'div', children: '{{item.a}}' } } `

  • _function 函数,当组件的某个属性要求是一个函数并返回react 元素时使用它

`javascript

import {registerComponent} from 'maka'

class CustomComponent extends React.PureComponent { render(){ var {getSub} = this.props return ( <div> {getSub('aaa','bbb')} </div> ) } }

registerComponent('CustomComponent', CustomComponent)

const view = { component: 'div', children: { component: 'CustomComponet' getSub: { _function: '(a,b)', component: 'div', children: '{{a+b}}' } } }

`

4.3、如何使用自定义组件?

view可以使用自定义组件或者外部的react组件,见下面示例

`javascript import React from 'react' import { registerComponent } from 'maka' import { Button } from 'antd'

class CustomComponent extends React.PureComponent { render() { return (<div>custom component</div>) } }

registerComponent('CustomComponent', CustomComponent) registerComponent('antd.Button', Button)

const view = { component: 'div', children: [{ component: 'CustomComponent' },{ component: 'antd.Button', children: 'Button' }] } `

4.4、如何自定义模板组件?

模板组件是为了减少view json的代码量提出的概念,把相似度很高、并且经常使用的一些json定义为模板组件,在使用中能有效减少代码量,见下面示例

`javascript import { registerTemplate } from 'maka'

const CustomTemplate = function(props) { return { component: 'div', children: [{ component: 'div', children: props.content },{ component: 'div', children: props.content } ] } }

registerTemplate( 'CustomTemplate', customTemplate)

const view = { component: 'CustomTemplate', content: 'hello' }

`

4.5、ActionMixin

ActionMixin提供了低耦合方式混入外部行为的可能,缺省并至少需要混入了Maka框架的base行为

  • maka引擎混入的base提供了哪些可用行为?

方法名 | 描述 | action中使用示例 | view中使用示例 --- | -- | --- | --- getState | 获取状态 | this.base.getState('data.input') | $base.getState('data.input') setState | 设置状态 | this.base.setState({'data.input', 'hello'}) | $base.setState({'data.input', 'hello'}) gs | =getState | this.base.gs('data.input') | $base.gs('data.input') ss | =setState | this.base.ss({'data.input', 'hello'}) |$base.ss({'data.input', 'hello'}) context | 上下文,支持get、set方法 | this.base.context.get('currentUser') or this.base.context.set('currentUser', {name: 'zhang'}) | $base.context.get('currentUser')

  • 如何混入自定义的行为类?

`javascript import { actionMixin, registerAction } from 'maka'

class CustomAction { alert = () => { alert() } }

registerAction('CustomAction', CustomAction)

@actionMixin('base', 'CustomAction') class action { constructor(option) { Object.assign(this, option.mixins) } }

const view = { component: 'div', onClick: '{{$CustomAction.alert}}' } `

5、app & hub

5.1 app

把一个大型网站拆分成许多开发模式相同的app,这些app又可以独立运行、调试、分享,通过弱耦合的方式又能组合在一起成为一个网站

  • app来源

    • maka add 命令增加依赖, 会从hub.makajs.org下载依赖,类似yarn add
    • package.json中subAppDir属性指向的目录,目录中如果存在应用代码会被扫描到
    • 手动拷贝app.js 和 app.css到发布目录

  • 组合使用

javascript const view = { component: 'div', className: 'hello', children: [{ component: 'AppLoader', appName: 'app-test', //app name content: 'hello' //app支持的属性 }] }

  • 手工创建 javascript import {createAppElement} from 'maka' ... var ele = createAppElement('appName', {content: 'hello'}) //第一个参数:app name,第二参数:app props ...

  • 预加载 修改index.html javascript maka.load(['appName1', 'appName2']).then(()=>{ ... }

  • navigate切换

`javascript import {navigate} from 'maka'

navigate.redirect('/appName/') `

5.2 hub

  • maka提供hub.makajs.org网站用于分享开发者开发的应用
  • 您可以通过maka publish分享您的应用,publish前请使用 maka build 、maka build --dev 、maka pkg 构建应用资源

6、maka Api

javascript import {registerComponent, registerAction} from 'maka' 如上registerComponent,reigsterAction是两个api,所有支持的api如下

api | 参数 | 描述 | --- | -- | -- | registerComponent | (key, component) | 注册组件 registerAction | (key, action) | 注册行为 registerTemplate | (key, template) | 注册模板 getComponent | (key) | 通过组件名获取组件 load | [应用名...] | 加载应用 createAppElement | (appName, appProps) | 创建app React Element setHoc | (hoc) | 设置最外层高阶React Element fetch | 对象类型,不需要参数 | 提供fetch对象,可以调用后台接口,或者mock navigate | 对象类型,不需要参数 | 提供navigate对象 render | (appName, targetHtmlElementName) | render

7、ajax & mock

7.1、ajax

可以使用maka引擎提供fetch对象实现ajax,示例如下

action.js `javascript import {fetch} from 'maka'

... fetch.post('/v1/login',{user: 'admin', password: '123'}) ... `

index.html, 配置fetch对象 javascript window.main = function (maka) { maka.utils.fetch.config({ mock: false, //默认是true token: '', after: function (response, url) { return response } }) }

package.json,配置本地调试的webpack dev server proxy javascript ... "server": { "proxy": { "/v1/*": { "target": "http://www.***.com:8080/" } }, "port": 8000 } ...

7.2、使用纯前端mock

可以使用maka引擎提供fetch对象实现mock,示例如下

action.js `javascript import {fetch} from 'maka'

... fetch.post('/v1/login',{user: 'admin', password: '123'}) ... `

mock.js `javascript import { fetch } from 'maka'

const mockData = fetch.mockData

function initMockData() { if (!mockData.users) { mockData.users = [{ id: 1, account: 13334445556, password: 'c4ca4238a0b923820dcc509a6f75849b', name: 'zlj' }] } }

fetch.mock('/v1/login', (option, headers) => { initMockData() const user = mockData.users.find(o => o.account == option.account && o.password == option.password) if (user) { return { result: true, token: ${user.id},${user.account},${user.password},${user.name ? user.name : ''}, value: option } } else { return { result: false, error: { message: '请输入正确的用户名密码(系统内置用户user:13334445556,pwd:1)' } } } }) `

index.js javascript import 'mock.js'

index.html javascript window.main = function (maka) { maka.utils.fetch.config({ mock: true }) }

8、类似router的能力

8.1、redirect

javascript import {navigate} from 'maka' navigate.redirect('/portal') //https://www.***.com/#/portal

8.2、goBack

javascript import {navigate} from 'maka' ... navigate.redirect('/sign-in') //https://www.***.com/#/sign-in ... navigate.redirect('/portal') //https://www.***.com/#/portal ... navigate.goBack() //https://www.***.com/#/sign-in

8.3、listen

javascript navigate.listen((location.action)=>{ debugger //自定义处理 })

9、maka cli 命令

maka cli 支持的所有命令如下

  • maka app

bash maka app test 创建一个名为test应用

  • maka start bash maka start maka start --dev //dev模式启动 启动app,可以通过浏览器访问应用的运行结果,http://127.0.0.1:8000

  • maka build bash maka build maka build --dev //dev模式编译 编译应用,会在当前目录build目录下生成编译结果

  • maka pkg bash maka pkg maka pkg --dev //dev模式打包 打包应用, 会在当前目录build目录下生成打包结果,打包结果可用于网站直接部署使用

  • maka add bash maka add appName 增加依赖,增加依赖会修改package.json文件,start或者pkg命令时会把依赖app的编译结果copy当前应用运行目录下

  • maka adduser bash maka adduser 类似npm adduser功能,成功会在hub.makajs.org创建用户,并登录

  • maka publish bash maka publish 使用publish命令分享您的app到hub.makajs.org,其他开发人员就可以通过maka add来引用您发布的应用,注意publish前请使用 maka build 、maka build --dev 、maka pkg 构建应用资源

10、结束

  • 感谢您对maka的关注!

MakaJs:基于 React, Redux 的轻量级前端框架的更多相关文章

  1. 实例讲解基于 React+Redux 的前端开发流程

    原文地址:https://segmentfault.com/a/1190000005356568 前言:在当下的前端界,react 和 redux 发展得如火如荼,react 在 github 的 s ...

  2. 基于React的PC网站前端架构分析

    代码地址如下:http://www.demodashi.com/demo/12252.html 本文适合对象 有过一定开发经验的初级前端工程师: 有过完整项目的开发经验,不论大小: 对node有所了解 ...

  3. UIkit – 轻量级前端框架

    原始地址:UIkit – 轻量级前端框架 高效轻量级前端框架: 来自:咕噜分享

  4. UIkit – 轻量级前端框架,帮助你快速构建 Web 界面

    UIKit 是一个轻量级,模块化的前端框架,用于构建快速和强大的 Web 界面.UIKit 为您提供了 HTML,CSS 和 JavaScirpt 组件,使用简单,容易定制和扩展.UIKit 基于 L ...

  5. 基于Vue.js的uni-app前端框架结合.net core开发跨平台project

    一.由来 最近由于业务需要要开发一套公益的APP项目,因此结合所给出的需求最终采用uni-app这种跨平台前端框架以及.netcore快速搭建我们的项目,并且能做到一套代码跨多个平台. 当然在前期技术 ...

  6. react-static 基于react 渐进式静态站点生成框架

    react-static 是一个不错的基于react 开发的静态站点生成框架,可以用来替代create-react-app 包含的特性 100% react 很快的构建以及性能 自动代码以及数据分离 ...

  7. 基于React,Redux以及wilddog的聊天室简单实现

    本文主要是使用ReactJs和Redux来实现一个聊天功能的页面,页面极其简单.使用React时间不长,还是个noob,有不对之处欢迎大家吐槽指正. 还要指出这里没有使用到websocket等技术来实 ...

  8. mk框架,一个基于react、nodejs全栈框架

    在这个前端技术爆炸的时代,不自己写套开源框架出门都不好意思跟别人打招呼,作为一个前端领域的小学生,去年年初接触了react,之后一发不可收拾爱上了它,近期重构了自己去年开源的一个项目,废话到此结束句号 ...

  9. 一款轻量级前端框架Avalon.Js

    avalon2是一款基于虚拟DOM与属性劫持的 迷你. 易用. 高性能 的 前端MVVM框架, 拥有超优秀的兼容性, 支持移动开发, 后端渲染, WEB Component式组件开发, 无需编译, 开 ...

随机推荐

  1. Taro框架下qq小程序开发体验

    qq小程序发布了,作为第一批体验者 .还是发现了和微信小程序很多不同的地方. 最新的小程序我这里都是用Taro开发的,体验较为不错.数据管理用的是redux.JS用的ES6加async等. 微信小程序 ...

  2. (六十二)c#Winform自定义控件-警灯(工业)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  3. jQuery - 03. each、prevaAll、nextAll、获取属性、修改属性attr/val/text()、jq.height/width、offset()./position()./scrol Left/Top 、事件绑定bind、delegate、on、事件解绑、事件对象、多库共存

    each 方法 $ ( selector).each(function( index,element) {  } );   参数一表示当前元素在所有匹配元素中的索引号 参数二表示当前元素(DOM对象) ...

  4. [译]Introduction to Concurrency in Spring Boot

    当我们使用springboot构建服务的时候需要处理并发.一种错误的观念认为由于使用了Servlets,它对于每个请求都分配一个线程来处理,所以就没有必要考虑并发.在这篇文章中,我将提供一些建议,用于 ...

  5. android 之图片异步加载

    一.概述 本文来自"慕课网" 的学习,只是对代码做一下分析 图片异步加载有2种方式:  (多线程/线程池) 或者 用其实AsyncTask , 其实AsyncTask底层也是用的多 ...

  6. Linux环境基于CentOS7 搭建部署Docker容器

    1.Docker容器概述 区分Docker容器技术和VM虚拟机技术: evernotecid://394EFE90-9CE0-4D65-A8CD-DFEC0DC8061E/appyinxiangcom ...

  7. Netty源码分析 (十)----- 拆包器之LineBasedFrameDecoder

    Netty 自带多个粘包拆包解码器.今天介绍 LineBasedFrameDecoder,换行符解码器. 行拆包器 下面,以一个具体的例子来看看业netty自带的拆包器是如何来拆包的 这个类叫做 Li ...

  8. CentOS部署Harbor镜像仓库

    关于Harbor Harbor是用于存储和分发Docker镜像的镜像仓库服务,相比Docker Registry,Harbor在安全.标识.管理等方面做了增强,更适合企业使用: 官方网站:https: ...

  9. 01 (H5*) Vue第一天

    目录 1:什么是Vue.js 2:MVC和MVVM. 3:为什么要学习前段框架 4:框架和库的区别 5:怎么使用Vue. 6:常见的Vue指令 7:  五大事件修饰符 8:在vue中使用class样式 ...

  10. 让我们一起学习如何使用AIDL,它其实并不难(Android)

    前言 该篇文件讲述的是AIDL最基本的使用(创建.调用),关于对于AIDL更深的认识,在后续的随笔中,会持续与大家分享并探讨. 正文 AIDL的定义(什么是AIDL?) AIDL的应用场景(AIDL可 ...