2020-01-15
コードを書かずにWebサイト制作ができるプラットフォームサービス
→でもそうなってない
→なにかしらできない理由がある
→障壁になっていることを取り除く
デザイナーとエンジニアのワークフローを一つにする
NoCodeでも動的な機能が実現できるようにする
CMS連携することでコンテンツドリブンの制作ができるようにする
state定義
render関数
結果
state定義
render関数
結果
見た目・挙動を確認してコード調整
state定義
render関数
結果
エディタにフィードバック
(STUDIOであらかじめ定義)
DOMの内容を編集(テキスト内容や画像パス、スタイルなど)
ドラッグしてリサイズ、ダブルクリックしてサイズautoに設定
要素の追加・削除・並び替え
などなど…
const textDom = {
content: {
type: 'text',
data: 'This is a Text.'
},
style: {
color: '#3239e6',
padding: '12px'
}
}
const imgDom = {
content: {
type: 'img',
src: 'https://example.com/img.jpg'
},
style: {
width: '126px',
height: 'auto',
margin: '12px 0px 0px 0px'
}
}
TextRenderer
ImgRenderer
Domの種類に応じたRender関数を用意して表示
const iconDom = {
content: {
type: 'icon',
data: 'face'
},
style: {
fontSize: '64px',
color: 'rgb(106, 176, 29)'
}
}
IconRenderer
編集中の内容をリアルタイムに複数環境で確認したり共同編集したり
編集プレビュー中:
Firebaseでリアルタイム同期
公開サイト:
静的化したsnapshotデータを使って表示
成功してるGUI環境は、単目的か、プログラミングの補助ツールであって、制御構造をテキストプログラミング以外で表現するのは、現状あまりコスパがよくない。
定義をいじる
コードを書く
ビルドする
実行する
再計算する
実行されてる
ふつう
GUI化
export default Vue.component('DomGenerator', {
functional: true,
props: {
studioDom: {
type: Object as PropType<StudioDom>,
required: true
},
vm: {
type: Object as PropType<VM>,
required: false,
default: null
}
},
render(h, { props }): VNode {
const defs = props.studioDom.defs
const childProps =
defs || !props.vm
? {
...props,
vm: createVm(defs || [])
}
: props
return h(getRenderer(props.studioDom), {
props: childProps
})
}
})
export const createVm = (defs: StudioDef[]): VM => {
const data = defs...
const computed = defs...
const methods = defs...
// 略
return new Vue({
data: () => data,
computed,
methods
})
}
const dom = {
type: 'component',
defs: [
{
type: 'state',
key: 'count',
value: 5
},
{
type: 'getter',
key: 'square',
value: 'return count * count'
},
]
}
GUIで定義をいじる
新しい定義からDOMを再生成
必要であればVMを作る
(stateやmethodが定義されているDOMでscopeを作る)
export const getVNodeData = (
studioDom: StudioDom,
vm: VM,
): VNodeData => {
const data = studioDom.data
return {
on: getEventHandlers(vm, data?.on),
style: getConditionalStyle(data?.style)
}
}
button要素のイベントにメソッドをアサインする(GUI)
DOM生成部分でvNodeDataのonにvmのメソッドを紐付ける
const dom = {
tag: 'button',
data: {
on: {
click: 'increment'
}
},
render(h, { props }): VNode {
const { studioDom, vm } = props
const text = studioDom.content?.value
return h(
studioDom.tag || 'div',
{
...getVNodeData(studioDom, vm, scopeRootId),
domProps: {
innerHTML: text ? compileTemplate(text, vm) : ''
}
}
)
}
<template>
<div>
<div>count: {{count}}</div>
<button @click="increment">increment</button>
</div>
</template>
<script lang="ts">
import Vue, { PropType } from 'vue'
export default Vue.extend({
data(){
return {
count: 5
}
},
methods:{
increment(){
this.count++;
},
こういう
右パネルでの変更:
要素定義自体(初期値)を変える
ボタンをクリック:
methodを呼んでvmのstateをミューテーション
元々のSTUDIOはエディタで初期値を書き換えることしかできなかった
CPO: keima
コンテント
モデル