Транспайлер из 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:eventclick.stop => click|stopPropagation etc.unwrapEvent, достающий payload из .detailref="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.someClassmakeStyle<template functional> обрабатываются $$options и propslet 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 заменяются на просто smthconst { smth } = this (можно и с алиасами)smth.vue переименовываются в smth.sveltevue-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 - кстати, мы нанимаем! =)