0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Svelte来构建Web Component(超简单方便)

OSC开源社区 来源:OSCHINA 社区 作者:红薯 2022-12-19 11:39 次阅读

每个开发人员都应该关注代码中的可重用性以及代码的业务隔离,这样可以让业务逻辑与应用架构分离,提升系统的扩展性。而 Web Component 就是这样一个技术,可以让我们创建一个独立的可重用组件。

本文将介绍使用 Svelte 创建通用的 Web Component 的完成过程。『通用』指的是该组件不局限于 Svelte 应用,还可以用于任何 JavaScript 应用程序(如 Vue、React 等),同时还将介绍使用 Svelte 创建 Web Component 的一些局限性。

什么是 Web Component?

Web Component 可以让我们创建可重用的、自定义的封装了样式以及功能的 HTML 元素。

例如,我们使用如下代码来创建一个导航条:



 

如果用 Web Component 技术,我们可以定义一个自定义元素(如 ),然后你可以在网页任一地方使用该元素显示导航条,同时这个导航条的样式和页面其他元素的样式是完全隔离的,不会相互影响。而这项技术被称之为 Shadow DOM (影子 DOM)。

什么是 Shadow DOM?

Shadow DOM 是一个较小的、独立的 DOM,它与主 DOM 分开渲染,允许我们将样式和标记行为隔离到单个组件中。Shadow DOM 本质上允许我们将组件功能进行封装和隔离,我们可以单独对其设置样式、编写功能脚本,而不会干扰应用程序的其余元素。
你大概对 Web Component 有一个基本的认识,下面我们开始用 Svelte 来编写一个简单的组件。

构建 Web Component

准备工作

为了完成本文剩余的内容学习,需要你对掌握以下知识:

对 HTML, CSS 和 JavaScript 有基本的认识

熟悉命令行操作环境

需要一个文本编辑器

最好对 Svelte 有一些基本的了解(可以看看我之前翻译的文章https://my.oschina.net/javayou/blog/5309554)

开始

本文我们将开发两个组件:

第一个组件是一个卡片组件,接收三个属性分别是:卡片标题、卡片描述以及图片,该组件名为

第二个组件是一个带样式的按钮,接收一个type的属性,通过该属性来确定按钮的显示样式,组件名称为

同时我们将使用两种组件的发布方式,一个是打包到单一文件,另外一个是每个组件发布到一个独立的文件中。

下图显示的是两个组件运行后的外观:
ad515cfe-7df7-11ed-8abf-dac502259ad0.png
我们从创建一个 Svelte 应用开始,并安装必须的包:

npx degit sveltejs/template web-component-tut
cd web-component-tut
npm install


上述命令执行完毕就可以使用如下命令启动一个测试环境:

npm run dev

然后我们打开浏览器访问http://localhost:8080就可以看到一个最基础的 Svelte 应用运行起来后的样子:
ad73f21e-7df7-11ed-8abf-dac502259ad0.png

开发一个组件

使用 Svelte 生成通用 Web Component 的过程类似于创建常规 Svelte 组件的过程,只是进行了一些修改。

为了创建第一个卡片组件,我们首先创建一个文件src/Card.svelte并定义组件的属性、样式以及 HTML 标签,代码如下:



{card_title}

{card_desc}

你可以在其他组件中使用这个卡片组件,如下所示(这一步可忽略):



接下来是按钮组件,文件名/src/Button.svelte代码如下:



  


该组件的使用方法如下(可忽略):

importButtonfrom"./Button.svelte";

Click me

将自定义组件转成通用组件

我们需要将自定义 Svelte 组件转成通用的 Web Component ,这样才可以在其他框架中直接使用。

要做这个转换操作,我们需要在 Svelte 配置文件中设置让编译器生成自定义元素。打开rollup.config.js在 plugins 增加一个compilerOptions配置项,在该配置项下增加customElement: true配置信息,如下所示:

...
 plugins:[
    svelte({
      compilerOptions:{
        dev:!production,
        customElement:true,
...
然后我们需要给两个组件分别定义一个元素名称,打开Card.svelte文件,在文件开头第一行插入如下内容:
上述tag属性值代表组件的标签名称。

同样的,打开 Button.svelte 给第二个组件指定一个标签名称:
最后一步是在main.js中引入这两个组件,打开/src/main.js将里面的内容替换成如下两行:
importButtonfrom"./Button.svelte";
importCardfrom"./Card.svelte";

这里我们已经完成了两个组件的开发步骤,下一步就是打包组件以便其他的应用可以使用这两个组件,打开命令行窗口进入项目所在目录执行如下命令:

npm run build

该命令将生成两个文件,分别是build.js和build.map.js, 文件位于项目下的/build目录。其中build.js是打包的两个组件,而build.map.js是build.js源代码映射文件。

如果上述步骤顺利完成,我们就可以将bundle.js拷贝到一个新目录,然后创建一个index.html文件,内容如下:


  
    My website
    
  

  
    
      
        
          
          
           
        
        
          
             Solid Cool Button 
             Outlined Cool Button 
          
        
      
    
  

这是一个再简单不过的 HTML 页面了,该页面使用了上述两个组件,在浏览器中显示为如下效果:

ad903c9e-7df7-11ed-8abf-dac502259ad0.png

组件分割

在某些情况下我们不需要将多个组件打包到同一个 js 文件中,我们希望每个组件有一个独立的 js 文件。要实现这个场景只需在rollup.config.js的input 和 output 中进行配置即可。

在 input 的配置中我们可以指定一个数组,数组的元素就是每个组件的文件路径,而 output 指定为输出的目录即可:

exportdefault{
  input:["src/Card.svelte","./src/Button.svelte"],
  output:{
    format:"iife",
    dir:"public/build/",
  },
...
修改完成后再次执行npm run build,我们就可以在 build 目录中看到两个文件Button.js和Card.js。
使用方法类似:

Click Me

 

主要缺点

到这里我们已经掌握了使用 Svelte 开发 Web Component 的方法,这个过程非常之简单,但是,使用 Svelte 开发 Web 组件会有一些缺点如下:

组件的属性名称不允许使用驼峰命名法,例如你会发现使用形如 cardTitle 这样的属性名就无法正常工作,而驼峰命名法又是 JavaScript 推荐的命名风格。这是一个 Bug,不过如果你使用的是 Vite ,那么有一个workaround plugin可以解决这个问题。

如果不标记 Web 组件,就无法在 Svelte 中重用它们 - 不幸的是,您还必须标记要在自定义 Web 组件中使用的每个 Svelte 组件

加入你有一个Header.svelte文件需要作为组件输出,但同时这个组件又依赖另外一个Nav.svelte文件,而 Nav.svelte 我们不希望作为 Web 组件输出,这个问题使得我们必须将 Nav.svelte 也作为组件输出,否则程序就会报错。好在这个问题现在也有解了(详情请看https://github.com/svelte-society/recipes-mvp/issues/41#issue-638005462),我们可以通过配置来解决这个问题,虽然看起来不是那么的爽,就这样吧,又不是不能用。

浏览器的支持问题 — JavaScriptcustomElementAPI 就是用来创建 Web Component 的底层 API,该 API 目前并没有被所有的浏览器支持,我们需要引入 Polyfill 来解决这个文件,详情请看https://github.com/webcomponents/polyfills/tree/master/packages/custom-elements。

总结

在本文中,我们学习了如何使用 Svelte 创建通用卡片和按钮组件,生成捆绑文件,拆分它们,甚至在单独的 HTML 页面中重用此组件。

动手试试吧?

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

原文标题:使用Svelte来构建Web Component (超简单方便)

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    简单方便的电话视免打扰电路设计

    简单方便的电话视免打扰电路设计笔者利用家中坏电热毯的调温开关改制了一电话机免打扰电路,其结构简单,改制容易,现将改制方法介绍如下。 [hide][/hide]
    发表于 12-17 10:48

    使用MAXI接口的最简单方法是什么?

    到当前SAXI的MAXI接口创建一个新的axi_lite组件,然后通过新组件处理外部请求。如果是这样,开始使用MAXI接口的最简单方法是什么?以上来自于谷歌翻译以下为原文I have an XADC
    发表于 11-02 11:32

    将新库添加到Petalinux rootfs的最简单方法是什么

    嗨,将新库添加到Petalinux rootfs的最简单方法是什么?1>如何将预编译的库添加到rootfs,这将在petalinux-config -c rootfs中检测到2>如何将源代码添加到petalinux并在rootfs配置中进行构建和编译。
    发表于 05-22 08:32

    通过Keil5实现简单移植的方法

    无意中发现的一个通过Keil5实现简单移植的方法,真的非常简单方便,再也不用手动拖文件了,甚至还有专门的rtos调试工具可以用。
    发表于 11-30 08:03

    ADC701简单方块图

    ADC701简单方块图
    发表于 06-27 15:49 567次阅读
    ADC701<b class='flag-5'>简单方</b>块图

    简单方便lockdir_文件加密软件

    电子发烧友网站提供《简单方便lockdir_文件加密软件.exe》资料免费下载
    发表于 08-26 20:21 1次下载

    FLIR手机热像仪体验:简单方便 小巧易用

    这款FLIR ONE PRO热像仪可以算得上是一款家中日常必备的小工具, 它简单方便、小巧易用,能够实现大多数热像仪的功能。它可以说是跟激光尺、螺丝刀一样,虽然不常用,但是在用的时候却是能够帮大忙
    发表于 12-24 09:42 2494次阅读
    FLIR手机热像仪体验:<b class='flag-5'>简单方便</b> 小巧易用

    测试IGBT的简单方

    一些测试IGBT的简单方
    的头像 发表于 06-19 10:19 1.5w次阅读

    多功能医疗台车给人带来舒适感,操作简单方便

    多功能医疗台车设计以功能为主体,通过人机分析研究充分考虑体积与功能的关系,采用可折叠式结构和易维护的结构,整体简单大气,颜色搭配造型都体现了专业度,给人带来舒适感,操作简单方便。 考虑到医疗产品的特殊性,医
    发表于 05-17 15:11 863次阅读

    一种简单的FreeRTOS移植方法——2021.03

    无意中发现的一个通过Keil5实现简单移植的方法,真的非常简单方便,再也不用手动拖文件了,甚至还有专门的rtos调试工具可以用。
    发表于 11-21 19:06 10次下载
    一种<b class='flag-5'>超</b><b class='flag-5'>简单</b>的FreeRTOS移植方法——2021.03

    svelte-intellij Svelte的IDEA插件

    ./oschina_soft/svelte-intellij.zip
    发表于 05-18 14:25 1次下载
    <b class='flag-5'>svelte</b>-intellij <b class='flag-5'>Svelte</b>的IDEA插件

    使用Bolt构建闹钟的最简单方

    电子发烧友网站提供《使用Bolt构建闹钟的最简单方法.zip》资料免费下载
    发表于 12-09 16:17 0次下载
    使用Bolt<b class='flag-5'>构建</b>闹钟的最<b class='flag-5'>简单方</b>法

    使用蜂鸣器创建警报的最简单方

    电子发烧友网站提供《使用蜂鸣器创建警报的最简单方法.zip》资料免费下载
    发表于 12-15 11:05 0次下载
    使用蜂鸣器创建警报的最<b class='flag-5'>简单方</b>法

    前端框架Svelte放弃TypeScript,JS赢!

    负责 Svelte 编译器的开发者则说道,改用 JSDoc 后,代码不需要编译构建即可进行调试 —— 简化了编译器的开发工作。毕竟目前的调试工作比较复杂,需要使用构建步骤进行调试。
    的头像 发表于 05-11 10:39 1261次阅读
    前端框架<b class='flag-5'>Svelte</b>放弃TypeScript,JS赢!

    前端UI框架Svelte 4正式发布

    的支持,这就需要发布一个 CJS 构建,一旦 eslint 重写完成,Svelte 的软件包大小可以再下降 50% 以上。
    的头像 发表于 06-25 15:44 592次阅读
    前端UI框架<b class='flag-5'>Svelte</b> 4正式发布