关于svelte:我的-UI-组件库发布了

前言花了一年多的业余时间做了个挪动 web 组件库 - STDF。在此特别感谢我的老婆大人,承当了家里的很多杂事,才让我有工夫做这个货色。 站点:https://stdf.design GitHub:https://github.com/dufu1991/stdf 欢送到 GitHub 上提 Issue 和 PR,使它弱小,使它更好!能够帮忙到更多的人。 我想说一句,应用 Svelte 和 Tailwind 写代码真的是太爽了! 为何写这个组件库首先最重要的是补充 Svelte 生态。 对于 UI 组件库,PC 端有很多优良的产品,然而挪动端并没有能与 PC 端比肩的产品,这是因为挪动端的特殊性导致的。挪动端产品大多数是 To C 业务,这就要求对组件库的灵活性有更高的要求。在设计组件 API 的时候,须要有更多的参数反对可供配置,但又不能设计得太过简单。而在 UI 设计方面,不能有太多的个性化设计,这样能力达到组件的复用性。 市面上也有很多挪动端的组件库,然而应用下来还是有很多痛点,比方一些组件库的设计格调太过个性化,导致组件的复用性不高;一些组件库的可配置 API 太少,无奈通过简略的 API 配置出合乎业务需要的组件;一些组件库的文档太过浅近或简陋,使初上手的人很难了解组件的应用办法;一些组件库的文档和 Demo 中英混淆,难以查阅;一些组件库的 Demo 太少或太简陋,高频应用时无奈间接复制应用,升高开发效率等。 在体验过 Svelte 和 Tailwind 之后,发现应用它们开发真的是十分难受,所以就想着能不能把它们联合起来,做一个挪动端的 UI 组件库。这样的话,就可能在挪动端也享受到 Svelte 和 Tailwind 带来的开发体验了。 实用场景在挪动端有一种业务场景,利用不算简单,应用 Vue 或者 React 开发其实会显得「大材小用」了,可能整个利用打包之后的 JS 体积也就几十 KB,然而应用 Vue 或者 React 开发,这两个库的根底大小就超过了几十 KB,这样就得失相当了,而且挪动端 To C 利用体积过大是十分不可取的。然而应用纯原生 JS 开发,又会显得开发效率低下,这个时候 Svelte 就是一个很好的抉择,它的简洁语法,使原生 JS 代码有了响应式能力。 ...

April 28, 2023 · 1 min · jiezi

关于svelte:Svelte3Admin基于svelteui中后台管理系统框架svelteadmin后台系统

一、介绍svelte.js前端新框架爆火,可是网上对于svelte.js开发的组件库及后盾零碎比拟少。于是就本人入手开发了一个svelte-ui组件库和svelte-admin后盾管理系统。 Svelte Ui Admin 一款基于svelte3.x+svelteKit+svelte-ui+sass+mockjs等技术构建的中后盾治理。 二、技术实现开发工具:Vscode技术框架:svelte3.x+svelteKit+vite3UI组件库:svelte-ui (基于svelte自定义pc端UI组件库)图表组件:echarts^5.3.3图文编辑器:wangeditor^4.7.15国际化计划:svelte-i18n^3.4.0数据模仿:mockjs^1.1.0 svelte-admin反对动态化换肤、中英文/繁体国际化语言。 目录构造 Svelte-Ui组件库我的项目中所有的组件均是遵循应用svelte-ui组件库。整体格调对立好看。 svelte-ui桌面pc端UI组件库 公共布局模板svelte-admin整体分为顶部导航条+左侧动静路由菜单+右侧主内容区域三个模块。 <div class="svadmin__container" style="--themeSkin: {$skin}"> <div class="svadmin__wrapper-layout flexbox flex-col"> <div class="sv__layout-header"> <Header /> </div> <div class="sv__layout-body flex1 flexbox"> <!-- //侧边栏 --> {#if rootRouteEnable} <div class="sv__bd-sidebar"> <SideMenu routes={mainRoutes} {activeRoute} /> </div> {/if} {#if (rootRouteEnable && route != '/') || !rootRouteEnable} <div class="sv__bd-menus" class:collapsed={collapsed&&!rootRouteEnable}> <RouteMenu routes={getAllRoutes} {activeRoute} {activeRootRoute} {rootRouteEnable} {collapsed} /> </div> {/if} <div class="sv__bd-main flex1 flexbox flex-col"> <!-- 面包屑导航 --> <BreadCrumb routes={getAllRoutes} {activeRoute} {activeRootRoute} /> <!-- 主内容区 --> <Scrollbar autohide gap={2}> <div class="sv__main-wrapper"> <slot /> </div> </Scrollbar> </div> </div> </div></div>+error.svelte错误处理 ...

September 17, 2022 · 2 min · jiezi

关于svelte:SvelteUI-20-基于sveltejs轻量级UI组件库

一、介绍svelte-ui 一款基于svelte3.x架构的桌面UI组件库。目前曾经降级至2.0版本了(30+ 组件)。在原有的根底上新增并优化了15+组件。 SvelteUI蕴含了罕用的按钮、文本框、下拉框、表格、表单及音讯提醒类等性能。 二、引入组件通过如下形式疾速引入组件。 import { Button, Input, Switch, Select, Form, ...} from 'svelte-ui' 三、疾速应用范例Form表单rule规定验证let ruleFormDomlet formRules = { name: '', region: '', delivery: false, type: [], resource: '', summary: '',}let rules = { name: [ { required: true, message: '请输出流动名称', trigger: 'blur' }, { min: 3, max: 5, message: '长度在 3 到 5 个字符', trigger: 'change' } ], region: [ { required: true, message: '请抉择流动区域', trigger: 'change' } ], type: [ { type: 'array', required: true, message: '请至多抉择一个流动性质', trigger: 'change' } ], resource: [ { required: true, message: '请抉择流动资源', trigger: 'change' } ], // summary: [ // { required: true, message: '请填写流动详情', trigger: 'blur' } // ]}function onSubmitRules() { ruleFormDom.validate((valid) => { if(valid) { console.log('submit!') }else { console.log('error submit!') return false } })}function onResetRules() { formRules = { name: '', region: '', delivery: false, type: [], resource: '', summary: '', } ruleFormDom.resetFields()}<Form bind:model={formRules} rules={rules} bind:this={ruleFormDom}> <FormItem label="流动名称" prop="name"> <Input bind:value={formRules.name} /> </FormItem> <FormItem label="流动区域" prop="region"> <Select bind:value={formRules.region} clearable> <Option label="区域1" value="beijing" /> <Option label="区域2" value="shanghai" /> </Select> </FormItem> <FormItem label="即时配送" prop="delivery" required message="请勾选即时配送" trigger="change"> <Switch bind:checked={formRules.delivery} /> </FormItem> <FormItem label="流动性质" prop="type"> <CheckboxGroup bind:checked={formRules.type}> <Checkbox label="美食/餐厅线上流动" /> <Checkbox label="亲子主题" /> <Checkbox label="品牌推广" /> </CheckboxGroup> </FormItem> <FormItem label="非凡资源" prop="resource"> <RadioGroup bind:checked={formRules.resource}> <Radio label="线上品牌商资助" /> <Radio label="线下场地收费" /> </RadioGroup> </FormItem> <FormItem label="流动详情" prop="summary" rules={[{ required: true, message: '请填写流动详情', trigger: 'blur' }]}> <Input bind:value={formRules.summary} type="textarea" rows={3} /> </FormItem> <FormItem> <Button type="primary" on:click={onSubmitRules}>立刻创立</Button> <Button on:click={onResetRules}>重置</Button> </FormItem></Form>Table综合表格反对固定表头/列、单选/多选及内容超出滚动条展现。 ...

August 18, 2022 · 3 min · jiezi

关于svelte:使用Svelte开发Chrome-Extension

一、背景起因 最近Chrome浏览器降级到96大版本后,二维码入口从地址栏挪动至二级菜单。这对H5前端开发来说不太敌对,每次须要页面二维码时都须要多点两下(* ̄︿ ̄)。 因而萌发了开发一个二维码Chrome Extension的想法(@ ̄ー ̄@)。通过多方技术选型(React、原生、Vue、Svelte等),最终抉择Svelte,起因是 语法简略,心智累赘小 运行时代码少,打包体积小 响应式 d=====( ̄▽ ̄*),接下来就开始Svelte × Chrome Extension之旅。二、创立&开发2.1 我的项目创立2.1.1 我的项目初始化应用Svelte Kit新建我的项目npm`` init svelte@next qrcode-extension ,目录构造如下: src:源文件目录 lib:组件库等routes:约定式路由文件app.html:入口模板文件 static:动态文件目录 svelte.config.js:svelte配置 初始化我的项目之后能够间接npm`` run dev 启动。2.1.2 反对插件开发 manifest文件 Extensions are built on web technologies such as HTML, JavaScript, and CSS. —— Chrome开发文档 Chrome插件实质上是以manifest.json为入口规定的一系列前端资源汇合,基于Chrome浏览器提供的API,实现各种性能。 因而在我的项目的动态资源文件目录中增加manifest.json文件:{ "name": "QrCode", "description": "A simple qrcode extension powered by Svelte", "version": "1.0", "manifest_version": 3, "permissions": ["tabs", "downloads"], "action": { "default_popup": "index.html"}, "icons": { "16": "/images/qrcode-16.png","32": "/images/qrcode-32.png","48": "/images/qrcode-48.png","128": "/images/qrcode-128.png"}}复制代码几个比拟重要的字段: ...

May 28, 2022 · 1 min · jiezi

关于svelte:sveltewebchat基于Svelte3SvelteKit仿微信Mac网页界面聊天实例

概述Svelte-Webchat 一款仿造微信网页版类Mac界面聊天我的项目。应用最新技术栈svelte3.x+svelteKit+sass+mescroll+svelte-layer等技术开发构建。别致的dock可拖拽/左右滚动菜单。 性能特效✅经典Dock可滚动菜单模式✅晦涩的操作体验✅可膨胀/开展侧边✅可全屏/复原窗口、退出弹窗提醒✅丰盛的视觉效果,自定义桌面虚化主题✅自定义可视化弹窗+滚动条,反对各种自定义定制开发。 技术栈编辑器:Vscode框架技术:Svelte^3.46.5+SvelteKit状态治理:svelte/store下拉刷新:mescroll.js滚动条组件:svelte-scrollbar对话框组件:svelte-layersass预处理:sass^1.50.1+svelte-preprocess svelte-webchat 还内置了朋友圈模块。 我的项目构造十分清晰的分层目录构造。 svelte自定义组件(弹窗+滚动条)我的项目中无处不在的弹窗及滚动条性能,均是基于svelte.js自定义组件实现性能。 svelte-layer 一款基于svelte3开发的网页对话框组件https://segmentfault.com/a/1190000041721778svelte-scrollbar 一款基于svelte.js虚构丑化滚动条组件https://segmentfault.com/a/1190000041814107因为之前有过相干分享文章,这里就不具体的介绍了。 svelte公共布局模板svelteKit提供了__layout.svelte布局模板及__error.svelte错误处理页面。 如上图:整体布局分为左侧+右侧内容区+底部dock菜单。 <div class="sv__container flexbox flex-alignc flex-justifyc" style="--themeSkin: {$skin}"> <div class="sv__wrapper" class:maximize={$isWinMaximize}> {#if $userinfo} <div class="sv__board flexbox flex-col"> <!-- <div class="sv__topbar">顶部模块</div> --> <div class="sv__mainwrap flex1 flexbox"> <!-- <div class="sv__sidebar">侧边栏</div> --> <Middle /> <div class="sv__mainbx flex1 flexbox flex-col"> <Winbar /> <slot /> </div> </div> <Dock /> </div> {:else} <div class="sv__board flexbox flex-col"> <div class="sv__mainwrap flex1 flexbox"> <slot /> </div> </div> {/if} </div></div> ...

May 15, 2022 · 2 min · jiezi

关于svelte:基于svelte3自定义虚拟滚动条组件svelte3scrollbar

前段时间有给大家分享两个svelte3.x系列组件。明天持续分享一个最新写的svelte3-scrollbar虚构丑化零碎滚动条组件。 svelte-layer:一款svelte3.x轻量级PC端弹窗组件svelte-popup:一款svelte3.x挪动端弹层组件 svelte-scrollbar 一款轻量级网页自定义丑化零碎滚动条组件。反对原生滚动条、自动隐藏、垂直+程度滚动、自定义滚动条大小/色彩/间隙等性能。 在lib目录下新建一个Scrollbar组件。 引入组件在须要用到滚动条性能的页面引入插件。 import Scrollbar from '$lib/Scrollbar'疾速调用通过如下形式调用,即可疾速生成一个虚拟化滚动条。 <!-- //原生滚动条 --><Scrollbar native> <div>自定义内容信息。</div></Scrollbar><!-- //自动隐藏 --><Scrollbar autohide={true}> <div>自定义内容信息。</div></Scrollbar><!-- //程度滚动(反对滚轮滑动) --><Scrollbar mousewheel> <div>自定义内容信息。</div></Scrollbar><!-- //自定义高度/最大高度 --><Scrollbar height="200" maxHeight="350"> <div>自定义内容信息。</div></Scrollbar><!-- //自定义大小/间隙/色彩 --><Scrollbar size="10px" gap="5" color="#09f"> <div>自定义内容信息。</div></Scrollbar> 参数配置svelte-scrollbar反对如下参数配置。 <script> // 是否开启原生滚动条 export let native = false // 是否自动隐藏滚动条 export let autohide = false // 滚动条尺寸 export let size = undefined // 滚动条色彩 export let color = '' // 滚动条层叠 export let zIndex = null // 滚动条区域高度 export let height = undefined // 滚动条区域最大高度 export let maxHeight = undefined // 滚动条间隙 export let gap = 0 // 是否开启程度滚轮滚动管制 export let mousewheel = false ...</script>模板及逻辑局部<div class="vui__scrollbar" bind:this={el} on:mouseenter={handleMouseEnter} on:mouseleave={handleMouseLeave}> <div class="vscroll__wrap" class:hidenative={!bool(native)} bind:this={wrap} on:scroll={handleScroll} on:mousewheel={handleMouseWheel} style="{wrapStyle}"> <slot /> </div> <div class="vscroll__bar vertical" class:ishide={!data.isShowBar} on:mousedown={e => handleClickTrack(e, 0)} > <div class="vscroll__thumb" bind:this={barY} style="background: {color}; height: {data.barHeight}px; width: {addUnit(size)}" on:mousedown={e => handleDragThumb(e, 0)}></div> </div> <div class="vscroll__bar horizontal" class:ishide={!data.isShowBar} on:mousedown={e => handleClickTrack(e, 1)}> <div class="vscroll__thumb" bind:this={barX} style="background: {color}; width: {data.barWidth}px; height: {addUnit(size)}" on:mousedown={e => handleDragThumb(e, 1)}></div> </div></div><script> /** * @Desc svelte3虚构滚动条组件svelte-scrollbar * @Time andy by 2022-05 * @About Q:282310962 wx:xy190310 */ // ... import { onMount, afterUpdate, createEventDispatcher, tick } from 'svelte' const dispatch = createEventDispatcher() import util from './util' $: data = { // 滚动条宽度 barWidth: 0, // 滚动条高度 barHeight: 0, // 滚动条程度偏移率 ratioX: 1, // 滚动条垂直偏移率 ratioY: 1, // 鼠标是否按住滚动条 isTaped: false, // 鼠标是否悬停于滚动区域 isHover: false, // 显示滚动条 isShowBar: !bool(autohide) } const bool = (boolean) => JSON.parse(boolean) ? true : false const addUnit = (val) => val ? parseInt(val) + 'px' : null let observeTimer = null let c = {} // 滚动条对象 let el let wrap let barX let barY $: wrapStyle = `height: ${addUnit(height)}; max-height: ${addUnit(maxHeight)}` $: GAP = addUnit(gap) onMount(() => { console.log('监听滚动条开启...') updated() let observer = new MutationObserver(mutation => { updated() }) observer.observe(wrap, { attributes: true, childList: true, subtree: true, attributeFilter: [ 'style', 'class' ] }) window.addEventListener('resize', util.throttle(updated)) return () => { observer.disconnect() window.removeEventListener('resize', updated) console.log('监听滚动条敞开...') } }) afterUpdate(() => { // console.log('监听dom更新...') }) // 鼠标滑入 function handleMouseEnter() { data.isHover = true data.isShowBar = true updated() } // 鼠标滑出 function handleMouseLeave() { data.isHover = false if(!data.isTaped && bool(autohide)) { data.isShowBar = false } } // 拖动滚动条 function handleDragThumb(e, index) { // ... } // 点击滚动条插槽 function handleClickTrack(e, index) { if(index == 0) { wrap.scrollTop = (Math.abs(e.target.getBoundingClientRect().top - e.clientY) - barY.offsetHeight / 2) * data.ratioY barY.style.transform = `translateY(${wrap.scrollTop / data.ratioY}px)` }else { wrap.scrollLeft = (Math.abs(e.target.getBoundingClientRect().left - e.clientX) - barX.offsetWidth / 2) * data.ratioX barX.style.transform = `translateX(${wrap.scrollLeft / data.ratioX}px)` } } // 更新滚动区 async function updated() { // ... } // 鼠标滚动事件 function handleScroll(e) { let target = e.target let status if(target.scrollTop == 0) { status = 'top' // 滚动至顶部 }else if(target.scrollTop + target.offsetHeight >= target.scrollHeight) { status = 'bottom' // 滚动至底部 } /** * 父组件调用 const { target, status, scrollTop, scrollLeft } = e.detail */ dispatch('scroll', { target, // 滚动对象 status, // 滚动状态(记录滚动地位) scrollTop: target.scrollTop, scrollLeft: target.scrollLeft }) updated() } // 管制滚轮程度滚动 function handleMouseWheel(e) { if(!bool(mousewheel)) return e.preventDefault() if(wrap.scrollWidth > wrap.offsetWidth) { wrap.scrollLeft += e.deltaY } } // 滚动到一组特定坐标 export async function scrollTo(arg1, arg2) { await tick() if(typeof arg1 == 'object') { wrap.scrollTo(arg1) }else if(!isNaN(arg1) && !isNaN(arg2)) { wrap.scrollTo(arg1, arg2) } } // 设置滚动条到顶部的间隔 export async function setScrollTop(value) { await tick() wrap.scrollTop = value == 'top' ? 0 : value == 'bottom' ? wrap.scrollHeight : parseInt(value) barY.style.transform = `translateY(${wrap.scrollTop / data.ratioY}px)` } // 设置滚动条到右边的间隔 export async function setScrollLeft(value) { await tick() wrap.scrollLeft = value == 'left' ? 0 : value == 'right' ? wrap.scrollWidth : parseInt(value) barX.style.transform = `translateX(${wrap.scrollLeft / data.ratioX}px)` }</script><style> @import 'Scrollbar.scss';</style> ...

May 9, 2022 · 4 min · jiezi

关于svelte:sveltelayer-基于sveltejs网页pc端弹窗组件

前几天有给大家分享一个 svelte+sass实战微信app界面聊天实例明天要给大家分享的是全新研发的svelte.js自定义桌面版对话框组件SvelteLayer。 如下图:在lib目录下新建一个Layer组件目录。 引入svelte-layer组件弹窗组件反对组件式(Layer)+函数式(svLayer)两种调用形式。 import Layer, {svLayer} from '$lib/Layer' 函数式写法function handleInfo(e) { let el = svLayer({ title: '题目', content: `<div style="padding:20px;"> <p>函数式调用:<em style="color:#999;">svLayer({...})</em></p> </div>`, resize: true, btns: [ { text: '勾销', click: () => { // 敞开弹窗 el.$set({open: false}) } }, { text: '确认', style: 'color:#09f;', click: () => { svLayer({ type: 'toast', icon: 'loading', content: '加载中...', opacity: .2, time: 2 }) } }, ] })}组件式写法<!-- 询问框 --><Layer bind:open={showConfirm} shadeClose="false" title="正告信息" xclose zIndex="2001" lockScroll={false} resize dragOut content="<div style='color:#00e0a1;padding:20px 40px;'>这里是确认框提示信息</div>" btns={[ {text: '勾销', click: () => showConfirm=false}, {text: '确定', style: 'color:#e63d23;', click: handleInfo}, ]}/>两种写法能够独自应用,如果是一些简单的弹窗场景,可思考两种写法混合调用。 ...

April 18, 2022 · 7 min · jiezi

关于svelte:Svelte3Chat基于sveltesvelteKitsass仿微信聊天实例svelte仿微信

一、介绍前端三大框架的无力竞争者 svelte.js 问世啦。号称比vue.js还好用,无虚构DOM、极速响应能力、编译及运行速度超快。github下面star曾经达到58K+。足以证实值得一学。 svelte3-chat 基于 svelte.js+svelteKit+sass+mescroll 开发的仿微信app界面聊天实战我的项目。 二、技术栈编码器:VScode框架技术:svelte^3.46.0+svelteKit下拉组件:mescroll.js^1.4.2款式解决:sass+svelte-preprocess弹窗组件:svelte-popup数据模仿:mockjs^1.1.0 反对发送图文音讯/gif动图、图片/视频预览、下拉刷新、红包及朋友圈等性能。 三、我的项目构造目录 svelte自定义导航栏Navbar/菜单栏Tabbar顶部导航条及底部菜单栏均是基于svelte定制开发的自定义组件。 之前有分享过一篇文章,大家能够去看下。https://segmentfault.com/a/1190000041539049 svelte实现弹窗性能我的项目中的所有弹窗成果,均是svelte自定义组件实现性能。 svelte-popup 一款基于Svelte3.x开发自定义多功能svPopup弹出框组件,反对超过20+参数自在配置、组件式+函数式混合调用形式。 https://segmentfault.com/a/1190000041566666 svelte配置文件在svelte我的项目中也能够应用sass编写款式。 npm i sass svelte-preprocess -D/** * svelte.config.js根底配置文件 */import adapter from '@sveltejs/adapter-auto'import path from 'path'import SvelteProcess from 'svelte-preprocess'/** @type {import('@sveltejs/kit').Config} */const config = { kit: { adapter: adapter(), vite: { resolve: { alias: { '@': path.resolve('./src'), '@assets': path.resolve('./src/assets'), '@utils': path.resolve('./src/utils') } } } }, // allow you to use Svelte with tools like TypeScript, PostCSS, SCSS, and Less. preprocess: SvelteProcess()};export default config公共模板<script> import { onMount } from 'svelte' import { page } from '$app/stores' import { goto } from '$app/navigation' import { userinfo } from '@/store/index.js' let whiteRoute = ['/auth/login', '/auth/register'] onMount(() => { if(!$userinfo) { goto('/auth/login') }else { if(whiteRoute.includes($page.url.pathname)) { goto('/') }else { goto($page.url.pathname) } } })</script><div class="sv__container flexbox flex-col"> <slot /></div><style> @import '@/app.scss'; @import '@assets/css/reset.scss'; @import '@assets/css/layout.scss'; @import '@assets/fonts/iconfont.css';</style>svelte实现朋友圈性能我的项目中新增了朋友圈性能,应用svelte+mescroll实现转圈圈成果。 ...

April 8, 2022 · 2 min · jiezi

关于svelte:sveltepopup-基于sveltejs移动端弹窗组件

前两天有给大家分享一个 svelte自定义Tabbar+Navbar组件。明天给大家带来的是最新开发的svelte自定义手机端模态框组件SveltePopup。 如下图:在lib目录下新建一个Popup组件目录。 引入svelte-popup组件弹窗组件反对组件式(Popup)+函数式(svPopup)两种调用形式。 import Popup, {svPopup} from '$lib/Popup'组件式调用<Popup bind:open={isShowDialog} xclose shadeClose="false" title="题目" content="显示内容信息" btns={[ {text: '确认', style: 'color:#f60;', click: () => isShowDialog=false}, ]} on:open={handleOpen} on:close={handleClose}> <svelte:fragment slot="content"><h3>自定义slot插槽显示内容</h3></svelte:fragment></Popup>函数式调用let el = svPopup({ title: '题目信息', content: '<p style='color:#09f;'>展现内容信息</p>', xclose: true, shadeClose: false, btns: [ {text: '勾销', click: () => { el.$set({open: false}) }}, {text: '确认', style: 'color:#f90;', click: () => handleOK}, ], onOpen: () => {}, onClose: () => {}})一些简略的弹窗成果通过函数调用更加不便,对于一些功能丰富的弹窗展现,能够应用组件式slot自定义插槽形式展现。 ...

March 18, 2022 · 4 min · jiezi

关于svelte:svelte自定义组件导航条Navbar及菜单栏Tabbar

最近始终在学习Svelte常识。目前版本曾经到svelte3.x了。明天给大家分享两个罕用的自定义组件Navbar+Tabbar。 svelte官网:https://svelte.dev/ 在公共lib目录下新建Headerbar及Tabbar组件。 引入组件 import HeaderBar from '$lib/HeaderBar.svelte';import TabBar from '$lib/TabBar.svelte';Svelte自定义导航条Navbar<!-- //自定义HeaderBar组件 --><script> // 是否显示回退按钮 export let back = true // 题目 export let title = '' // 色彩 export let color = '#fff' // 背景色 export let bgcolor = '#22d59c' // 是否居中题目 export let center = false // 是否固定 export let fixed = false // 是否镂空通明 export let transparent = false // 层级 export let zIndex = 2021 function goBack() { console.log('go back') history.go(-1) // history.back(-1) }</script><div class="header-bar" class:transparent class:fixed={transparent||fixed}> <div class="header-bar__wrap flexbox flex-alignc" style:color style:background={bgcolor} style:z-index={zIndex}> <!-- //返回 --> {#if back && back != 'false'} <div class="action hdbar-action__left" on:click={goBack}> <slot name="backIco" /><slot name="backText" /> </div> {/if} <!-- //题目 --> <div class="hdbar-title" class:center> {#if $$slots.title} <slot name="title" /> {:else} {@html title} {/if} </div> <!-- //搜寻框 --> <div class="action hdbar-action__search"> <slot name="search" /> </div> <!-- //右侧 --> <div class="action hdbar-action__right"> <slot name="right" /> </div> </div></div> ...

March 12, 2022 · 3 min · jiezi

关于svelte:对话Svelte未来Rust-编译器构建大型应用

最近看到了 Rich 发了一篇对于 《将来Svelte》的推文。 十分冲动的点开看了,这个视频我看了两遍,感觉品质还是十分高的,从如何构建开源库 到 如何经营开源库 再到 开源库的外围库布局 一系列话题。尽管视频是针对 Svelte 这个框架的,然而我认为同样实用于任何一个框架。 接下来我把集体感觉一些重要的点做了一个总结演绎,如果想看完整版内容请看原视频(https://www.youtube.com/watch...) 整个视频都是以问答的形式进行的,因而每个题目我都演绎了主持人对 Rich的发问,如果只想要看 Svelte 将来的布局,能够间接跳到第四块内容。每块内容最下方有笔者本人的集体了解(不认同能够跳过),非对话中的内容。 1.构建的第一个风行的开源库是什么?如何扭转在开源路线上的过程? Rich 提到,他做的第一个比拟风行的开源库是 Ractive. 这个库可能对大家来说有些生疏. 可过后它也是风行一时的,他能够说是 MVVM 的鼻祖 以下为 Ractive 的示例: 是不是 Vue 和它很像,因为在早年,Vue 也是借鉴了 Ractive 的相干用法,从Vue 的历史 Issues 中也能够发现这些。 然而 Ractive 推出的同时,React 也被推出了,Rich 心想:完蛋了,本人徒劳工夫了。(毕竟 React 可是有公司作为背书的),然而 Rich 最终还是推出 Ractive,并且社区反应还不错,让 Rich 感觉能够和 React 竞争。 因而Rich 为 Ractive投入了大量的心血,花光了他所有的周末和早晨的空余工夫去开发我的项目。这也是他第一次为开源投入了大量的经验,为今后的开源事业奠定了很好的根底。 然而随着我的项目的保护工作沉重,对于 Rich 来说以业余时间去开发我的项目令他十分精疲力尽,这也是他第一次介绍作为开源维护者的现实状况。然而这次经验教会了他如何获取用户,解决如何让用户参加奉献、对立发展我的项目、如何回绝 PR 等问题。 随后 Rich 在开源的路线上始终前行,还推出了另外两个比拟有名的库 Rollup、Svelte 。 Tip(笔者本人总结,非官方态度):在初期的时候认定指标应该朝着一个方向去致力,有助于咱们的常识积攒以及踏入开源的队列中。2.如何发明一个当初市面上不存在且有价值的工具?Rich 认为发明工具大部分源于“集体之痒”(粗心能够了解为集体的技术摸索,市面上某些工具不好用就本人造一个)。因为他自身处于新闻编辑部工作,经常有大量的沉重、迭代快的工作,因而利用好开源我的项目非常重要,正是在这种繁冗的工作中,促使Rich想让开发过程足够简略,因而造就了 Svelte. ...

December 24, 2021 · 2 min · jiezi

关于svelte:sveltejs-vs-sfcjs

Sveltejs is a js framework based on compiling, sfcjs is a js component runtime in browser with svelte style syntax. This article will compare their syntax. "hello world" Dynamic attributes styling Nested component Reactive assignments Reactive declarations Declaring props If blocks Loop blocks Await blocks DOM events Component events Two-way-binding Reactive styling

September 12, 2021 · 1 min · jiezi

关于svelte:Svelte-响应式原理剖析-重新思考-Reactivity

0.Intro这篇文章将为大家介绍前端圈“新”宠 Svelte ,以及其背地的响应式原理。对于 Svelte 你还没用过,但大概率会在一些技术周刊,社区,或者前端年度报告上听到这个名字。如果你应用掘金写文章的话,那其实曾经在应用 Svelte 了,因为掘金新版的编辑器 bytemd 就是应用 Svelte 写的 。 (:对于一些讯息源比拟广的同学来说,Svelte 可能不算新事物,因为其早在 2016 就开始动工,是我落后了。 这篇文章公布与掘金:https://juejin.cn/post/696574... 1.Svelte 是啥?一个前端框架,轮子哥 Rich Harris 搞的,你可能对这个人字不太熟悉,但 rollup 必定听过,同一个作者。 新的框(轮)架(子)意味着要学习新的语法,如同每隔几个月就要学习新的“语言”,不禁让我想晒出那个旧图。 吐槽归吐槽,该学的还是要学,不然就要被淘汰了 。Svelte 这个框架的次要特点是: 用最根本的 HTML,CSS,Javascript 来写代码间接编译成原生 JS,没有中间商(Virtual DOM) 赚差价没有简单的状态管理机制2.框架比照决定是否应用某个框架,须要有一些事实根据,上面咱们将从 Star 数,下载趋势,代码体积,性能,用户满意度,等几个维度来比照一下 React、Vue、Angular、Svelte 这几个框架。 ReactVue@angular/coreSvelteStar 数168,661183,54073,31547,111代码体积 ️♀️42k22k89.5k1.6kStar 数上看,Svelte 只有 Vue(yyds)的四分之一(Svelte(2016) 比 Vue(2013) 慢起步三年)。不过 4.7w Star 数也不低。 代码体积(minizipped)上,Svelte 只有 1.6k !!!可别忘了轮子哥另一个作品是 rollup,打包优化很在行。不过随着我的项目代码减少,用到的性能多了,Svelte 编译后的代码体积减少的速度会比其余框架快,前面也会提到。 NPM 下载趋势 Npm trendings 链接中转 下载量差距非常明显,Svelte(231,262) 只有 React(10,965,933) 的百分之二。光看这边外表数据还不够,跑个分 看看。 Benchmark 跑分 ...

May 26, 2021 · 7 min · jiezi

关于svelte:FESRCsvelte的tsscss生产环境实践指南

简介Svelte是最近新出的前端框架,和react的vdom不同,Svelte应用动态剖析在构建时创立DOM更新代码,搭配官网高深莫测的老手教程,给人直观的应用体验,上手会很快。在业务实际中我上手采坑并总结了一下内容,经实际能够间接上生产。 ts+scss+svlete模板通常在react我的项目里咱们会用ts进步业务逻辑开发效率,style module用来防止css命名重叠。在react中可能是这么写 // index.tsx...<ul className={styles.mylist} ref={this.myRef} onScroll={this.scrollHandler}>{this.props.data.length>0 ?this.props.data.map((v,i)=> <Item key={i}>{v}</Item> ) :<li>empty</li> }</ul>...在svelte间接单文件组件 // index.svelte<script lang="ts">...import type {IData} from "./types.ts"import Item from "./item.svelte"export let data:IData=[]export let myRef;scrollHandler=()=>{}</script><style>...</style><ul class="mylist" bind:this={myRef} on:scroll={scrollHandler}>{# if data.length>0} <li>empty</li>{:else} {#each data as v,i} <Item>{v}</Item> {/each}{/if}</ul>须要留神:1.但凡svelte组件import的名称必须首字母大写,不然编译不认它是个svelte组件。 2.import ts类型申明必须是 import type ... 也是为了更好的辨别. export let/const 变量 作为相似props的语法,目前语法查看还不欠缺,有时会呈现正告和React不同,循环的dom不强制查看key属性svelte单文件组件中的css会人造反对编译成类style module的className,不必放心css名称反复,但会疏忽和正告未应用的css,不会打包进去。(这个很奇怪,如果父组件和子组件想笼罩对方的css classname 就比拟麻烦了,这时候纯css思路断了只能换js思路也就是通过props来实现)状态治理组件内的状态没什么好说的,长期变量一把梭就好了。本文只探讨store的用法。为了让svelte状态治理有redux的滋味,我实际中用以下的写法,不喜勿喷: //store.tsimport { writable } from 'svelte/store';//申明初始statelet initState={ loading:false, readed:0,}const state = writable(initState);const { subscribe, set, update } = state;//可能用失去的resetconst reset = () => set(initState);//mounted办法会在组件的onMount时调用const mounted = async () => { updateLoadStart(); const {data,error}=await server.getPageData(); !error && await updateReaded(data); updateLoadEnd();}updateLoadStart=()=>update((prevState)=>{ return { ...prevState, loading:true }})...在组件里便能够这么引入应用: ...

September 30, 2020 · 2 min · jiezi