{"id":14989375,"url":"https://github.com/makajs/maka","last_synced_at":"2025-04-05T13:01:49.792Z","repository":{"id":49789362,"uuid":"150849602","full_name":"makajs/maka","owner":"makajs","description":"Maka.js是基于react的一个前端微服务开发框架（makajs.com）","archived":false,"fork":false,"pushed_at":"2024-08-28T07:10:23.000Z","size":22295,"stargazers_count":199,"open_issues_count":2,"forks_count":36,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-03-29T12:09:55.717Z","etag":null,"topics":["hub","koa","maka","maka-application","maka-pkg","mock","nodejs","react","redux","spa"],"latest_commit_sha":null,"homepage":"https://makajs.org","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/makajs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-09-29T09:40:58.000Z","updated_at":"2024-07-18T07:10:58.000Z","dependencies_parsed_at":"2024-12-15T00:17:16.032Z","dependency_job_id":null,"html_url":"https://github.com/makajs/maka","commit_stats":{"total_commits":360,"total_committers":9,"mean_commits":40.0,"dds":0.3416666666666667,"last_synced_commit":"e5c11d688590e3b2e9c7d7b02907c1cdeff531ce"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makajs%2Fmaka","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makajs%2Fmaka/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makajs%2Fmaka/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/makajs%2Fmaka/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/makajs","download_url":"https://codeload.github.com/makajs/maka/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247339145,"owners_count":20923012,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hub","koa","maka","maka-application","maka-pkg","mock","nodejs","react","redux","spa"],"created_at":"2024-09-24T14:18:15.943Z","updated_at":"2025-04-05T13:01:49.767Z","avatar_url":"https://github.com/makajs.png","language":"JavaScript","funding_links":[],"categories":["Frameworks"],"sub_categories":["Rest of the Pack"],"readme":"# 基于makajs的云代码产品，makajs.com欢迎体验\n\n# maka\n\n## Introduction\n\n### What is maka?\n\n\u003e 'Maka' comes from the Chinese word '码咖'(mǎkā), which means code guru.\n\n\u003e A front-end framework that you can understand at a glance, simplicity does not mean simple.\n\n![image](https://makajs.org/img/framework.png)\n\n[maka-antd-pro](https://makajs.github.io/maka/maka-antd-pro)\n\n[maka-appstore-demo](https://makajs.github.io/maka/maka-app-store/)\n\n[maka-mobile-erp](https://makajs.github.io/maka/maka-mobile-erp)\n```\nusename:13334445556\npassword:1\n```\n\n### Why Maka.js\nUse maka.js to resolve these problems:\n#### 1、 React -- ugly syntax\nWhen using React, the UI is complicated.\nYou may end up with multiple render functions, or a js statement within a jsx statement.\nThis results in the fact that the code can not clearly express the UI structure.\n\n```javascript\nrender1(){\n    return \u003cdiv\u003e1\u003c/div\u003e\n}\nrender2(){\n    return \u003cdiv\u003e2\u003c/div\u003e\n}\nrender(){\n    return (\n        \u003cdiv\u003e\n            {this.state.data.status == '1' ? render1() : render2()}\n            {this.state.data.list.map((item)=\u003e{\n                return (\n                    \u003cdiv\u003e\n                        {item}\n                    \u003c/div\u003e\n                )\n            })}\n        \u003c/div\u003e\n    )\n}\n```\n\nMakaJs is based on React and can use all React controls. The only difference is to use json to express UI.\nFrom Json's tree structure, we can clearly know what the ui is.\n\n```javascript\n{\n    component: 'div',\n    children:[{\n        component:'div',\n        children: '1',\n        _visible: `{{data.status == '1'}}`\n    },{\n        component:'div',\n        children: '2',\n        _visible: `{{data.status != '1'}}`\n    },{\n        _for: 'item in data.list',\n        component: 'div',\n        children: '{{item}}'\n    }]\n}\n```\n\n#### 2、Redux -- difficult to learn\nRedux is a best implementation of Flux, but it is difficult for beginners to get started.\nIt proposes concepts such as connect, action, reducer, dispatch, store, middleware, etc.\n\n\nMakaJs is based on Redux, you can only understand View, Action, State\n\n#### 3、Single page web application(SPA) -- very confusing file structure \nWe normally use a technical perspective to classify files, components, actions, reducers, middleware.\nWhereas the business developer is usually responsible for developing a module. If the files are scattered everywhere, the maintenance complexity is increased, and developers need to debug to determine if all the code on the website is correct.\n\n```javascript\n|---website\n    |---package.json\n    |---index.js\n    |---actions\n            |---loginAction.js\n            |---portalAction.js\n    |---reducers\n            |---loginReducer.js\n            |---portalReducer.js\n    |---components\n            |---login.js\n            |---portal.js\n    |---containers\n            |---loginContainer.js\n            |---portalContainer.js\n```\n\nMakaJs proposes the concept of App, which divides a website into multiple apps with the same development model. Each app can be run independently and debugged, and can be combined with low coupling.\n\n```javascript\n|---website\n    |---package.json (can use yarn start)\n    |---index.js\n    |---apps\n          |---login\n                |---view.js\n                |---state.js\n                |---action.js\n                |---index.js\n                |---package.json (can use yarn start)\n          |---portal\n                |---view.js\n                |---state.js\n                |---action.js\n                |---index.js\n                |---package.json (can use yarn start)\n```    \n\n#### 4、Effectively accumulate your work results\nThe past framework has kept us tired and pursuing new technologies, and it is difficult to precipitate achievements at work.\n\nMakaJs provides hub.makajs.org, which allows developers to share every runnable app. This accumulation will enable you to quickly develop a similar UI in the future.\n\n\n### Installation\n\n``` bash\nsudo npm i -g @makajs/cli\n```\n\nDependencies：\n- npm \n- yarn\n``` bash\nsudo npm i -g yarn\n```\n\n### Getting Started\n\n\u003e The following example is to create a new maka app 'hello-world', and start the development server(\u003ca href='http://localhost:8000' target='maka dev'\u003ehttp://localhost:8000\u003c/a\u003e)\n\n``` bash\nmaka app hello-world\ncd hello-world\nyarn start\n```\n\n### Command Line Tool\n\n#### Commands\n\n- maka app\n\u003e Create a maka app called 'test'\n```bash\nmaka app test \n```\n\n\n- maka start\n\u003e Start the app webpack dev server, browse \u003ca href='http://localhost:8000' target='maka dev'\u003ehttp://localhost:8000\u003c/a\u003e to view the running results of the maka app.\n```bash\nmaka start \nmaka start --dev //Start in dev mode\n```\n\n\n- maka build\n\u003e Compile the maka app and generate the compilation result in the 'build' directory.\n```bash\nmaka build \nmaka build --dev //Start in dev mode\n```\n\n\n- maka pkg\n\u003e Package the maka app, generate the package result in the 'build' directory\n```bash\nmaka pkg\nmaka pkg --dev //Start in dev mode\n```\n\n\n- maka add\n\u003e Add a sub-application will modify the package.json file. When the start or pkg command is executed, the compilation result of the sub-application will be copied under the running directory.\n```bash\nmaka add appName\n```\n\n\n- maka adduser\n\u003e Create a user at hub.makajs.org and log in, similar to the npm adduser function\n```bash\nmaka adduser\n```\n\n\n- maka publish\n\u003e Publish current maka app to hub.makajs.org, other developers can refer to your published app via 'maka add'. Please use 'maka build', 'maka pkg' to build application resources before publishing.\n\n```bash\nmaka publish\n```\n\n\n## Main Concepts\n\n### State\n\n\n``` js\nconst state = {\n    data: {\n        content: 'hello ',\n        input: ''\n    }\n}\n```\n\n- The state object provides data for the maka app\n- The storage structure of the internal state of the maka engine is immutable type\n- Every change of the state object will notify view and rerender\n\n\n### Action\n``` js\n@actionMixin('base')\nclass action {\n    constructor(option) {\n        Object.assign(this, option.mixins)\n    }\n\n    onChange = (e) =\u003e {\n        this.base.setState({ 'data.input': e.target.value })\n        console.log(this.base.getState('data.input'))\n    }\n}\n```\n\n- The Action object contains functions that are provided to the view.\n- The 'actionMixin' means the Action object mix up with external Action. The 'base' is required.\n- Please refer Advanced Concepts for more information.\n\n\n### View\nView supports three ways\n\n#### JSON\n\n``` js\nconst view = {\n    component: 'div',\n    className: 'hello',\n    children: [{\n        component: 'div',\n        children: '{{data.content + data.input}}'\n    }, {\n        component: 'input',\n        placeholder: 'world',\n        value: '{{data.input}}',\n        onChange: '{{$onChange}}'\n    }]\n}\n```\n\n#### Html template\n\nview.html\n``` html\n\u003cdiv class=\"testview\"\u003e\n    \u003cdiv\u003e{{data.content + data.input}}\u003c/div\u003e\n    \u003cinput placeholder=\"world\" value=\"{{data.input}}\" onChange=\"{{$onChange}}\" /\u003e\n\u003c/div\u003e \n```\n\nindex.js\n``` js\nimport view from './view.html'\n\n```\n- View.html as above can be imported and auto transformed to JavaScript object\n\n### React element\n\n```js\nconst view = (props) =\u003e {\n    const { base, onChange } = props\n    const data = base.getState('data')\n    return (\n        \u003cdiv className='maka-react-view'\u003e\n            \u003cdiv\u003e\n                {data.content + data.input}\n            \u003c/div\u003e\n            \u003cinput placeholder='world' value={data.input} onChange={onChange} /\u003e\n        \u003c/div\u003e\n    )\n}\n```\n\n\u003e Please refer Advanced Concepts for more information.\n\n\n## Advanced Concepts\n\n### Expression\n\n\n- Bind the data that path is 'data.content' in state.\n```js\n{\n    ...\n    value: `{{data.content}}`  //value = state.data.content\n    ...\n}\n```\n\n- Bind the function 'onChange' in the Action.\n```js\n{\n    ...\n    onChange:`{{$onChange}}` // onChange = action.$onChange\n    ...\n}\n\n```\n\n- Bind the anonymous function\n```js\n{\n    onChange: `{{{\n        debugger;\n        return $onChange\n    }}}`\n\n    /* \n    onChange = new Function(`\n        debugger;\n        return action.onChange\n    `)() \n    */\n}\n```\n\n### View reserved keywords\n\n\n```javascript\n{\n    component: 'div',\n    children: 'hello',\n    _visible: 'true',\n    _for: 'item in data.list',\n    _function: '(a,b)'\n}\n```\n\n - The reserved keywords: component, children, _visible, _for, _function\n\n - In addition to the reserved keywords, you can set any properties supported by the component.\n\n #### Props\n\n- component\n\nComponent name, all html elements are available by default\n\n```javascript\n{ component: 'div' } //\u003cdiv\u003e\u003c/div\u003e\n```\n- children\n\nChild component\n\n```javascript\n{\n    component: 'div'\n    children: {\n        component: 'div',\n        children: 'children'\n    }\n}\n\n/*\n\u003cdiv\u003e\n    \u003cdiv\u003echidlren\u003c/div\u003e\n\u003c/div\u003e\n*/\n```\n\n- _visible\n\nvisible: the value can use expression, default value is true\n\n```javascript\n{\n    component: 'div',\n    _visible: false\n}\n\n```\n*If _visible is set to false, the component will not be created.*\n\n- _for\n\nFor loop, support multi-level for loop\n\n```javascript\nconst state = {\n    data: {\n        list: [{a:1}, {a:2}, {a:3}]\n    }\n}\n\nconst view = {\n    component: 'div',\n    children: {\n        _for: 'item in data.list', // or (item,index) in data.list\n        component: 'div',\n        children: '{{item.a}}'\n    }\n}\n```\n\n- _function\n\nFunction that is used when a component's property requires a function and returns a react element\n\n```javascript\n\nimport {registerComponent} from 'maka'\n\nclass CustomComponent extends React.PureComponent {\n    render(){\n        var {getSub}  = this.props\n        return (\n            \u003cdiv\u003e\n                {getSub('aaa','bbb')}\n            \u003c/div\u003e\n        )\n    }\n}\n\nregisterComponent('CustomComponent', CustomComponent)\n\nconst view = {\n    component: 'div',\n    children: {\n        component: 'CustomComponet'\n        getSub: {\n            _function: '(a,b)',\n            component: 'div',\n            children: '{{a+b}}'\n        }\n    }\n}\n\n```\n\n### Custom components\n\n\n*The View object can use custom components or external react components, see the example below.*\n\n```javascript\nimport React from 'react'\nimport { registerComponent } from 'maka'\nimport { Button } from 'antd'\n\nclass CustomComponent extends React.PureComponent {\n    render() {\n        return (\u003cdiv\u003ecustom component\u003c/div\u003e)\n    }\n}\n\nregisterComponent('CustomComponent', CustomComponent)\nregisterComponent('antd.Button', Button)\n\nconst view = {\n    component: 'div',\n    children: [{\n        component: 'CustomComponent'\n    },{\n        component: 'antd.Button',\n        children: 'Button'\n    }]\n}\n```\n\n### Custom template components\n\n*Define some of the json fragments in the view object that are highly similar and frequently used as template components. When using this, the amount of code in the view object can be effectively reduced. See the example below.*\n\n```javascript\nimport { registerTemplate } from 'maka'\n\nconst CustomTemplate = function(props) {\n    return {\n        component: 'div',\n        children: [{\n                component: 'div',\n                children: props.content\n            },{\n                component: 'div',\n                children: props.content\n            }\n        ]\n    }\n}\n\nregisterTemplate( 'CustomTemplate', customTemplate)\n\nconst view = {\n    component: 'CustomTemplate'，\n    content: 'hello'\n}\n\n```\n\n\n### ActionMixin\n\n*The 'actionMixin' means the Action object mix up with external Action. The 'base' is required.*\n\n- What functions are available from the base of the maka engine?\n\nFunction Name | Description | Example in Action | Example in View\n--- | -- | --- | ---\ngetState  | get value in the state by path | this.base.getState('data.input') | $base.getState('data.input')\nsetState  | set value in the state by path | this.base.setState({'data.input', 'hello'}) | $base.setState({'data.input', 'hello'})\ngs | =getState |  this.base.gs('data.input') | $base.gs('data.input')\nss | =setState | this.base.ss({'data.input', 'hello'}) |$base.ss({'data.input', 'hello'})\n\n- To mix in custom action classes\n\n```javascript\nimport { actionMixin, registerAction } from 'maka'\n\nclass CustomAction {\n    alert = () =\u003e {\n        alert()\n    }\n}\n\nregisterAction('CustomAction', CustomAction)\n\n@actionMixin('base', 'CustomAction')\nclass action {\n    constructor(option) {\n        Object.assign(this, option.mixins)\n    }\n}\n\nconst view = {\n    component: 'div',\n    onClick: '{{$CustomAction.alert}}'\n}\n```\n\n\n\n## App \u0026\u0026 Hub\n\n### App\n\n\n*The maka app can be run, debugged, shared, or combined into a website by weak coupling.*\n\n\n- Create a app\n  - The 'maka app test' command will create a maka app called 'test'\n\n- Add a sub-application\n  - The 'maka add' command downloads the app from hub.makajs.org, similar to 'yarn add'.\n  - The 'subAppDir' attribute in package.json points to the storage directory of the maka application.\n  - Copy app.js and app.css to the distribution directory.\n  \n- Load a sub-application through the 'AppLoader' component\n\n```javascript\nconst view = {\n    component: 'div',\n    className: 'hello',\n    children: [{\n        component: 'AppLoader',//AppLoader component provided by maka engine\n        appName: 'app-test', //app name\n        content: 'hello' //app supported properties\n    }]\n}\n```\n\n- Load a sub-application through the 'createAppElement' function\n```javascript\nimport {createAppElement} from 'maka'\n...\n@actionMixin('base')\nclass action {\n...\nvar subApp = createAppElement('appName', {content: 'hello'}) //The first parameter: app name, the second parameter: app props\n...\n}\n```\n\n- Preloading a sub-application\nchange index.html\n```javascript\n maka.load(['appName1', 'appName2']).then(()=\u003e{\n     ...\n }\n```\n\n- Navigate to a sub-application\n\n```javascript\nimport {navigate} from 'maka'\n\nnavigate.redirect('/appName/')\n```\n\n### Hub\n\n- Developers can upload the maka application to the hub.makajs.org website\n- You can share your app via 'maka publish'. Before using publish, please use 'maka build', 'maka build --dev', 'maka pkg' to build application resources.\n\n\n## Maka API\n```javascript \nimport {registerComponent, registerAction} from 'maka'\n```\n*As the example above, registerComponent and reigsterAction are two apis. All of the supported apis are as the followings:*\n\napi | arguments |  description | \n--- | -- | -- | \nregisterComponent | (key, component)  | register customer component\nregisterAction | (key, action) | register customer action\nregisterTemplate | (key, template) | register template component\ngetComponent | (key) | get component by name\nload | [appName...] | load app\ncreateAppElement | (appName, appProps) | create app React Element\nsetHoc | （hoc） | Set the outermost high-level React Element\nfetch | Object type, no arguments required  | Provide a fetch object, you can call the background interface, or mock\nnavigate | Object type, no arguments required | Provide navigate object\nrender | (appName, targetHtmlElementName) | render\n\n\n## Ajax \u0026\u0026 Mock\n\n### Ajax\n\n*You can use the 'fetch' object that provided by the maka engine to implement the ajax call. The followings is an example:*\n\n*action.js*\n```javascript\nimport {fetch} from 'maka'\n\n...\nfetch.post('/v1/login',{user: 'admin', password: '123'})\n...\n```\n\n*index.html, config the fetch object*\n```javascript\n    window.main = function (maka) {\n        maka.utils.fetch.config({\n            mock: false, //default value is 'true'\n            token: '', \n            after: function (response, url) {\n                return response\n            }\n        })\n    }\n```\n\n*package.json, configuring local debug webpack dev server proxy*\n```javascript\n...\n\"server\": {\n    \"proxy\": {\n        \"/api\": \"http://www.***.com\"\n    },\n    \"port\": 8000\n  }\n...\n```\n\n### Mock\n\n*The maka engine provides a 'fetch' object for implementing the mock mechanism. The followings is an example:*\n\n*action.js*\n```javascript\nimport {fetch} from 'maka'\n\n...\nfetch.post('/v1/login',{user: 'admin', password: '123'})\n...\n```\n\n\n*mock.js*\n```javascript\nimport { fetch } from 'maka'\n\nconst mockData = fetch.mockData\n\nfunction initMockData() {\n    if (!mockData.users) {\n         mockData.users = [{\n            id: 1,\n            account: 13334445556,\n            password: 'c4ca4238a0b923820dcc509a6f75849b',\n            name: 'zlj'\n        }]\n    }\n}\n\nfetch.mock('/v1/login', (option, headers) =\u003e {\n    initMockData()\n    const user = mockData.users.find(o =\u003e o.account == option.account \u0026\u0026 o.password == option.password)\n    if (user) {\n        return {\n            result: true,\n            token: `${user.id},${user.account},${user.password},${user.name ? user.name : ''}`,\n            value: option\n        }\n    }\n    else {\n        return { result: false, error: { message: 'Please enter the correct username and password.(default user:13334445556,password:1)' } }\n    }\n})\n```\n\n*index.js*\n```javascript\nimport 'mock.js'\n```\n\n*index.html*\n```javascript\nwindow.main = function (maka) {\n    maka.utils.fetch.config({\n        mock: true\n    })\n}\n```\n## Navigate\n\n\n- redirect\n\n```javascript\nimport {navigate} from 'maka'\n...\nnavigate.redirect('/portal') //https://www.***.com/#/portal\n...\n```\n\n- goBack\n\n```javascript\nimport {navigate} from 'maka'\n...\nnavigate.redirect('/sign-in') //https://www.***.com/#/sign-in\n...\nnavigate.redirect('/portal') //https://www.***.com/#/portal\n...\nnavigate.goBack() //https://www.***.com/#/sign-in\n```\n\n- listen event\n```javascript\nnavigate.listen((location.action)=\u003e{\n    debugger\n    //code\n})\n```\n\n\n\n## Example screenshot\n\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/9/97f2d6455e31e246787f6f9d8d16293764d53f32.png\" width=\"690\" height=\"365\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/8/873440300ef056a9e52f60f900d8355b9912a2b2.png\" width=\"690\" height=\"363\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/3/368d75dcb70b4a2fa5e97cc41a4739cc039bc27e.png\" width=\"690\" height=\"365\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/2/2987563102fca7da07ff1a0b83c22eae479a15e3.png\" width=\"690\" height=\"364\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/d/d7ed0fc1fba016e72902f855d3ec5f197bf342d2.png\" width=\"690\" height=\"363\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/0/00fabbc168a571d8ed9d8960379fae0deabbd692.png\" width=\"690\" height=\"363\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/b/b04f227544327badf7655dca793e62efd87a05e9.png\" width=\"690\" height=\"365\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/6/6b58645539b085b466e5c8e9db912b45a15c4669.png\" width=\"690\" height=\"364\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/2/2810bd7de395b35ee466cba6c5dbbf15c958938c.png\" width=\"690\" height=\"365\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/6/608bd91670ca4054f06a1b9e541d246125a68c93.png\" width=\"285\" height=\"500\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/a/ada059d67a0e6ea48e8e495972a6ba0fc0dbeb35.png\" width=\"284\" height=\"500\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/5/5b09b37307f55128baee68076761fa9b1ed16ea6.png\" width=\"284\" height=\"500\"\u003e\n\n\u003cimg src=\"https://reactchina.sxlcdn.com/uploads/default/original/2X/0/0473310bc0f85a4d64e5b393a75fdc44ddb5dc87.png\" width=\"284\" height=\"500\"\u003e\n\n## Team\n\n- ziaochina   \u003cziaochina@gmail.com\u003e\n- LI Shengguo  \u003clishengguo@qq.com\u003e\n- Jeffy Cai   \u003ccaixiaobing@live.cn\u003e\n\n## Done\n\nThank you for your interest in maka!\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakajs%2Fmaka","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmakajs%2Fmaka","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmakajs%2Fmaka/lists"}