Транспайлер из Vue в Svelte
Запустить веб-морду:
yarn install
yarn workspace repl-vue serve
В репозитории три воркспейса:
Чтобы, насколько это возможно, автоматизировать переезд на исчезающий фреймоврк Svelte кодовой базы, написанной на Vue.
Результат преобразования требует ручного допила (см. ниже "что не умеет"), но все равно ощутимо экономит время.
v-for
=> {#each}
v-if
=> {#if}
(else-if
/ else
тоже умеет )<template>
обрабатывается<component is...>
=> <svelte:component this>
:prop="..."
/ v-bind:prop="..."
=> prop={...}
v-bind="props"
=> {...props}
@event
/ v-on:event
=> on:event
click.stop
=> click|stopPropagation
etc.unwrapEvent
, достающий payload из .detail
ref="someEl"
=> bind:this={refs$.someEl}
{$$restProps.style}
и {$$restProps.class}
bind:this={el$}
если в исходнике vue было обращение к this.$el
$style
=> style$
(потому что переменные, начинающиеся с доллара, в Svelte обозначают чтение из store)v-model
для <input type=radio|checkbox|text>
, <textarea>
и <select>
v-html
=> {@html ...}
makeClass
(схлопывает массивы/объекты), кроме случая, когда класс состоит из единственного обращение к $style.someClass
makeStyle
<template functional>
обрабатываются $$options
и props
let key = val
, при необходимости оборачивается в IIFEexport let prop = defValue;
prop: Types.def(val)
const myMethod = () => {...}
$: name = expression
либо в $: name = (() => { doSmth })()
если тело функции состоит из нескольких стейтментовmakeWatcher
, если задан immediate=true
либо если исплоьзуется второй аргумент oldValue
, иначе просто создается ф-ция watcherProp
+ ее реактивный вызов $: watcherProp(prop);
beforeMount
/mounted
схлопнуты в onMount
, аналогично с дестроемthis.smth
заменяются на просто smth
const { smth } = this
(можно и с алиасами)smth.vue
переименовываются в smth.svelte
vue-types
изничтожается$emit
, подключается createEventDispatcher
и создается dispatch
, на который замеяются все $emit
$emit -> dispatch
, $style -> style$
и т. д. можно настраиватьСтили выносятся в отдельный файл componentName.pcss
и импортируются в компонент.
props: { ...otherCom.props }
this[computedPropName]
v-on={...$listenrs}
provide
/ inject
Можно скопировать содержимое папки sourceDir
в targetDir
, применяя преобразование к файлам .vue
и копируя все остальное как есть.
cd ./vue2svelte
yarn transpile --config=path/to.config.js
Пример конфига - в файле v2s.config.js
- транспилирует веб-морду на Vue в работоспособное приложение на Svelte, записывая файлы в ./repl-svelte
Проверить, что получилось:
yarn workspace repl-svelte serve
Изготовлено в благословенных стенах Ozon Tech - кстати, мы нанимаем! =)