Size: a a a

2020 September 28

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Ruslan Shakirov
конечно
гыг) вообще не думаю что стоит юзать бабель через svelte-preprocess. у меня он всегда стоит дальше по пайплайну роллапа и только для ES5 билдов. похоже тут происходит следующее: код прогоняется через бабель до компилятора и тот туда "говнякает" без учета особенностей свелт. дальше компилятор свелт ругается )))
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Ruslan Shakirov
Исходный код

<script context="module">
 export const TABS = {}
</script>

<script>
 import { setContext, onMount, onDestroy, createEventDispatcher } from 'svelte'
 import { writable } from 'svelte/store'
 import { uid } from '@/utils'

 export let index = 0

 let tabs = []
 let panels = []
 let activeTab = writable(null)
 let activePanel = writable(null)
а TABS статические какие-то?
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
так то они не будут пропсами в этом случае
источник

RS

Ruslan Shakirov in Svelte [svelt]
Ну да, статические
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
покажи плиз конфиг бабеля
источник

RS

Ruslan Shakirov in Svelte [svelt]
module.exports = {
 presets: [
   [
     '@babel/preset-env',
     {
       modules: false,
       loose: true,
       useBuiltIns: 'usage',
       corejs: 3
     }
   ]
 ],
 plugins: [
   '@babel/plugin-transform-runtime',
   '@babel/plugin-syntax-dynamic-import',
   '@babel/plugin-proposal-class-properties'
 ],
 env: {
   test: {
     presets: [['@babel/preset-env', { targets: { node: 'current' } }]]
   }
 }
}
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Ruslan Shakirov
module.exports = {
 presets: [
   [
     '@babel/preset-env',
     {
       modules: false,
       loose: true,
       useBuiltIns: 'usage',
       corejs: 3
     }
   ]
 ],
 plugins: [
   '@babel/plugin-transform-runtime',
   '@babel/plugin-syntax-dynamic-import',
   '@babel/plugin-proposal-class-properties'
 ],
 env: {
   test: {
     presets: [['@babel/preset-env', { targets: { node: 'current' } }]]
   }
 }
}
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
написано же very important
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
вообще бабель через svelte-preprocess используется ТОЛЬКО когда надо внутри свелт компонентов затранспилить то, что сам свелт, а точнее акорн не поддерживают в данный момент.
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
а не для поддержки самим приложением легаси браузеров
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
поэтому думаю можно смело брать конфиг из svelte-preprocess, а добавлять бабель с твоим конфигом уже в сам роллап
источник

RS

Ruslan Shakirov in Svelte [svelt]
Ок, тогда уберу оттуда бабель
источник

RS

Ruslan Shakirov in Svelte [svelt]
c esmodules: true та же обшибка
источник

RS

Ruslan Shakirov in Svelte [svelt]
остается загадкой почему optional chaining не пашет
источник

RS

Ruslan Shakirov in Svelte [svelt]
acorn в node_modules версии 7.1.1
источник

КС

Кирилл Спасибович... in Svelte [svelt]
а я тут пытался хакнуть свелт на классовые директивы для компонентов..., а обнаружил, что наличие спреда меняет генерируемый код и получается что даже

<Component
 {...spread}
 class="elephant {toggle ? 'dog' : ''}"
/>

перестаёт работать с хэшами, потому что генерируется вот это: https://pastebin.com/09a7gYir

нашёл где генерируется код для спреда: https://github.com/sveltejs/svelte/blob/46a83a50e3ed8f90b188cb152901cc579b189cd2/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts#L226-L257

и выходит что надо туда вклиниться, проверить является ли аттрибут кодовым словом и докинуть в генерируемый апдейт немного хэша

а с классовыми директивами вообще прикол
для тегов используется classList.(add|remove)
а для компонентов придётся выдумывать свой добавляюще-убирающий велик
еле понял, что можно вот так исходный статичный класс на этапе конструкции компонента запихиваемый в props

но всё это как-то так по-ублюдски выглядит, эхх :)

const class_attr = this.node.attributes.find(a => a.name === 'class');
const initial_class = class_attr ?
   class_attr.chunks.map(c => c.data ? c.data.trim() : null).filter(d => d).join(' ') :
   '';

suckless подход с патчами на свелт компилер в действии))
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Кирилл Спасибович
а я тут пытался хакнуть свелт на классовые директивы для компонентов..., а обнаружил, что наличие спреда меняет генерируемый код и получается что даже

<Component
 {...spread}
 class="elephant {toggle ? 'dog' : ''}"
/>

перестаёт работать с хэшами, потому что генерируется вот это: https://pastebin.com/09a7gYir

нашёл где генерируется код для спреда: https://github.com/sveltejs/svelte/blob/46a83a50e3ed8f90b188cb152901cc579b189cd2/src/compiler/compile/render_dom/wrappers/InlineComponent/index.ts#L226-L257

и выходит что надо туда вклиниться, проверить является ли аттрибут кодовым словом и докинуть в генерируемый апдейт немного хэша

а с классовыми директивами вообще прикол
для тегов используется classList.(add|remove)
а для компонентов придётся выдумывать свой добавляюще-убирающий велик
еле понял, что можно вот так исходный статичный класс на этапе конструкции компонента запихиваемый в props

но всё это как-то так по-ублюдски выглядит, эхх :)

const class_attr = this.node.attributes.find(a => a.name === 'class');
const initial_class = class_attr ?
   class_attr.chunks.map(c => c.data ? c.data.trim() : null).filter(d => d).join(' ') :
   '';

suckless подход с патчами на свелт компилер в действии))
это же компилятор, он меняет код на любое изменение исходников)
источник

КС

Кирилл Спасибович... in Svelte [svelt]
Pavel 🦇 Malyshev
это же компилятор, он меняет код на любое изменение исходников)
не, ну понятно
но неожиданно что генератор кода для обработки спредов валяется совсем в другом месте
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Кирилл Спасибович
не, ну понятно
но неожиданно что генератор кода для обработки спредов валяется совсем в другом месте
видимо это был вариант заставить это работать вместе. спреды появились мягко говоря не сразу
источник

КС

Кирилл Спасибович... in Svelte [svelt]
Pavel 🦇 Malyshev
видимо это был вариант заставить это работать вместе. спреды появились мягко говоря не сразу
но зато методом измени компилер, скомпиль, дифни билды - было получено не мало информации о том что же может пойти не так :)
источник