先放项目地址:https://github.com/Iroha1024/...

了解svelte

Svelte 与诸如 React 和 Vue 等 JavaScript 框架类似,但是有一个关键的区别:Svelte 在构建/编译阶段将你的应用程序转换为理想的 JavaScript应用,而不是在运行阶段解释应用程序的代码。

https://www.sveltejs.cn/tutor...

简而言之,编译出的js代码无需引入框架,可嵌入在其他代码中,用来写一些小组件十分方便

svelte基础

最初的组件

一个简单的组件就实现了,不过除了展示还无用处,你需要添加更多代码来改进你的组件

<script>
    let name = 'world'
</script>

<h1>hello {name}!</h1>

组件实例化

实例化才能算的上一个应用,否则你的组件只能呆在展示页面里

prop可以接收外部数据(也许你并不需要)

App.svelte

<script>
    epxort let name     //可以设置初始值
</script>

<h1>hello {name}!</h1>

index.js

import App from './App.svelte'

const app = new App({
    target: document.body,
    props: {
        name: 'world'
    }
})

更丰富的组件

  • svelte提供一种变量声明方式$: variable,用于依赖表达式后面的值,如当name变化时,reactiveVal会一同变化,而用其他方式(let)则变量不会具有响应式。当然还有条件判断、语句同样可以使用$:声明 https://www.sveltejs.cn/tutor...
  • prop绑定:引入其他组件,如果子组件修改prop值,父组件需以bind:prop形式声明,父组件才能获取响应式数据

App.svelte

<script>
    import Child from './Child.svelte'
    
    let name = 'world'
    $: reactiveVal = 'reactive ' + name
    
    function logName() {
        console.log('name:', name)
        console.log('reactiveVal:', reactiveVal)
    }
</script>

<h1>{reactiveVal}</h1>
<Child bind:name on:click={logName}/>

<!--
    子组件改值,父组件内数据不响应
    <Child name={name} on:click={logName}/>
    简写
    <Child {name} on:click={logName}/>
-->

Child.svelte

  • 原生事件传递:子组件若要将事件(如click)通过组件传递,则需在外层声明
  • 自定义事件传递:https://www.sveltejs.cn/tutor...
<script>
export let name

function changeName() {
    name = name === 'world' ? 'hello hello' : 'world'
}
</script>

<!-- 需声明 -->
<div on:click>  
    <h1>hello {name}!</h1>
    <button on:click={changeName}>
        change name
    </button>
</div>

其他特性

//条件渲染
{#if x > 10}
    <p>...</p>
{:else if 5 > x}
    ...
{:else}
    ...
{/if}

//列表渲染
{#each things as thing (thing.id)}
    <p>...</p>
{/each}

<script>
    import { onMount, tick } from 'svelte'

    let  div
    
    onMount(() => {
        //获取dom
    })
</script>

<div bind:this={div}></div>

//动态组件
<svelte:component this={componentName}/>

async function fn() {
    //执行
    await tick()
    //dom更新后再执行
}

typescript

svelte虽然由typescript编写,但非常遗憾的是目前并没有完善的typescript支持......?

这里使用typescript编写组件的api和数据的接口

发布npm

首先需要一个npm账户,然后是惯例的npm adduser或者npm login,登录账号,准备npm publish,这时会有一些问题,难道所有文件都需要上传吗?npm怎么知道上传哪些文件?

package.json详情:https://www.npmjs.cn/files/pa...

  • files

    表示需要上传的文件

    package.json README LICENCE CHANGELOG 这些文件会默认上传

  • main

    表示commonJs模块的入口文件

  • module

    表示es6模块的入口文件

  • types

    表示d.ts文件

npm publish前需要设置version,确保版本号不同(npm规定无法更新相同版本号),name不能和已有包名重复

publish结束后,一个npm包就成功发布了

???


Iroha1024
53 声望0 粉丝