Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including ditto-core with all npm packages installed. Try it out:

var dittoCore = require("ditto-core")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

ditto-core v0.0.3

transform code on different mvvm framework

This project is currently in beta and APIs are subject to change.

Ditto

跨平台、框架编译转换框架。

介绍

简介

Ditto 本质上是一个基于框架的编译转换工具,使用它,你可以轻易的实现编写一套代码,输出不同框架原生代码,从而达到跨平台、跨框架的目的。

为什么编译为原生代码?ditto 的愿景是简单、快速、便捷的实现代码转换,从而可以充分的体验各式框架的优点,在不同场景下可以选择最为切合的技术框架。所以 ditto 选择编译为目标原生干净的代码,最大化的发挥目标框架本身的优势。

为了便于编译转换工作的进行,ditto 提供了一套编码规范,参考规范书写的代码才能够使用 ditto 进行编译转换。同时为了满足不同场景定制化的需求,编码规范以及编译转换规则都是可配置的,并以插件的形式存在。即通过定制化的插件实现对应的编译输出,如 ditto 内置的 wechatvue2 插件会分别编译为微信小程序原生代码和 vue.js 2.0 原生代码。

现如今前端开发需要考虑的平台越来越多,前端框架也如雨后春笋般出现,针对不同端去编写多套代码成本非常高,去尝试不同的前端框架也需要一定的成本,这时候只编写一套代码就能够运行到不同的平台,以及嵌入不同的框架的能力就显得极为需要,ditto 的初衷也是为了解决这个痛点问题。

使用 ditto, 只需要书写一套代码,再通过 ditto 编译为不同平台原生代码或是不同框架代码,就可以达到多端复用以及跨框架复用的目的。

特性

声明式语法

ditto 的语法规范与 Vue.js 类似,同时支持 jsx 语法,让模板具有更强的表现力。

组件式开发

ditto 的组件化开发方式与 vue 基本保持一致,需要注意的一点是,在 ditto 中触发数据的更新需要通过 this.setData API 来显示的更新。但当选择编译为 vue 原生代码时,编译工具会自动替换为 vue 的数据更新方式。

开放式框架

ditto 本身不具备编译成特定平台代码的功能,而是通过接口的形式将转译需要的数据提供给插件开发者,这样就可以通过不同的插件实现而得到不同的编译转换。

Ditto.createCompiler('vue2'); 就通过引入 vue2 插件而创建了一个 vue2 类型的编译器,通过创建的编译器就可以将代码编译为对应 vue 2 代码。

编码约束

  • 需编译转换组件

    /* @component */形式的注释代码将组件代码(模板、样式、逻辑部分)与其它代码分开

  • 若是一个路由文件则以 /* @router */ 标识

  • 子组件及组件样式模板引入代码需以 /* @import /开始并以空行结束

  • 组件名与组件文件名保持一致

  • 组件需包含 name 属性及组件名必须

代码示例

组件逻辑

./app.js

/* @import */
import Footer from '../components/footer/footer';
import template from './app.tpl.js';
import Style from './app.style.js';

/* @component */
export default {
    name: 'app',
    style: Style,
    template: template(Footer),
    props: {

    },
    data: {
        hi: 'hello world!',
        statusMsg: 'Not ready!',
        items: [1, 2, 3, 4]
    },
    methods: {
        onShowMessage () {
            console.log('wellcome to here!');
        }
    },
    ready () {
        this.setData({
            statusMsg: 'I am ready.'
        })
    }
}
组件样式

./app.style.js

const Style = {
  pageWrap: {
      display: 'flex',
      width: "100%",
      height: "100%",
      flexDirection: 'column'
  },
  header: {
      flex: 1,
      height: 200,
      backgroundColor: 'red'
  },
  container: {
      flex: 1,
      height: 500,
      backgroundColor: '#eee'
  }
};
export default  Style;

组件模板

./app.tpl.js

const template = (Footer) => (
    <View className='page-wrap'>
        <View className='header'>
            <Text text='hi'></Text>
        </View>
        <View v-for='(item, index) in items' key='index' className='container'>
            <Text on-click='onShowMessage'
                text='statusMsg'>
            </Text>
        </View>
        <View>
            <Component v-ref={Footer} />
        </View>
    </View>
)

export default template;

注:样式和模板既可以使用单文件的形式,也可以直接编写在同一个文件中,因为他们都遵循 javascript(jsx) 语法规范。但如果使用单文件,那么样式和模板的后缀必须为 .style.js.tpl.js

plugins

  • wechat
  • vue2
  • more...

各平台、各框架业务代码处理方案

平台限定代码文件约束

  • 存在在特定平台目录下
  • 以平台类型为后缀 (eg: .wechat.js)

代码引入约束

  • 特定平台处理函数内使用
  • if else 配合平台变量使用,且只能在代码块是使用

Metadata

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free