使用Vite+ Lit 构建webcomponent 组件

Vite+Lit.js 构建Web Component

web component作为前一个时代的方案,在特定场景下确有不一样的妙用
,在维护前后端不分离的项目,web component 是为数不多的选择,整理一下使用Lit 构建自己的web component组件库为传统项目提提速的过程。

使用vite 创建项目

Vite 里带了Lit模板,我们这里选用Lit+ts模板
pnpm create vite

目录结构
  • src
    • hello
      • index.ts // 具体组件
    • index.ts // 组件收集
  • vite.config.ts 打包配置!
  • index.ts // 组件注入!

适用于构建基础组件库,不适用太复杂的逻辑,利用web-components 自带的样式隔离等,可以很好的避免被上下文干扰。

构建打包项目

编写入口文件,注入组件
import * as allComponents from './src/main.ts'

const components = allComponents
const toKebabCase = (str: string): string => {
  return str
    .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
    .replace(/([A-Z])([A-Z])(?=[a-z])/g, '$1-$2')
    .toLowerCase()
}
if (typeof window !== 'undefined') {
  (window as any).WebComponents = components
  
  Object.entries(components).forEach(([name, component]) => {
    const elementName = toKebabCase(name)
    const fullElementName = 'xk-' + elementName // 这里定义了全局组件名开头

    if (!customElements.get(fullElementName)) {
      customElements.define(fullElementName, component)
    } 
  })
}

除了组件,也可以在这里注入全局方法等

构建打包脚本

使用vite 来构建很简单。

/* by 01130.hk - online tools website : 01130.hk/zh/generateicpwallets.html */
import { defineConfig } from 'vite'
import { resolve } from 'path'
import { fileURLToPath, URL } from 'node:url'

export default defineConfig({
  build: {
    lib: {
      entry: resolve(fileURLToPath(new URL('.', import.meta.url)), 'index.ts'),
      name: 'WebComponents',
      fileName: (format) => `lit-web-components.${format === 'es' ? 'js' : 'umd.js'}`,
      formats: ['es', 'umd']
    },
    outDir:"../dist/js", // 打包输出目录
    rollupOptions: {
      output: {
        extend: true,
        assetFileNames: 'lit-web-components.[ext]',
        manualChunks: undefined,
        compact: true, // 紧凑输出
      },
      treeshake: {
        moduleSideEffects: false,
        propertyReadSideEffects: false,
        tryCatchDeoptimization: false
      },
    },
    sourcemap: false, // 移除 source map
    minify: 'terser',
    target: 'es2022',
    terserOptions: {
      compress: {
        drop_console: true, // 移除所有 console
        drop_debugger: true, // 移除 debugger
        pure_funcs: ['console.log', 'console.info', 'console.debug', 'console.warn'], // 移除指定的纯函数
        unused: true, // 移除未使用的代码
        dead_code: true, // 移除死代码
        conditionals: true, // 优化条件语句
        evaluate: true, // 计算常量表达式
        booleans: true, // 优化布尔值
        sequences: true, // 连接连续语句
        switches: true, // 移除重复的 switch 分支
        reduce_vars: true, // 减少变量引用
        collapse_vars: true, // 内联变量
        passes: 3 // 多次压缩以获得更好的效果
      },
      mangle: {
        toplevel: true, // 混淆顶级作用域
        reserved: ['lit', 'LitElement', 'html', 'css', 'customElements'] // 保留重要的库名称
      },
      format: {
        comments: false // 移除所有注释
      }
    }
  },
  resolve: {
    alias: {
      '@': resolve(fileURLToPath(new URL('.', import.meta.url)), 'src')
    }
  }
}) 

编写一个简单的组件

src/hello/index.ts

/* by 01130.hk - online tools website : 01130.hk/zh/generateicpwallets.html */
import { LitElement,html,css } from "lit";
import { property } from "lit/decorators.js";

export class Hello extends LitElement{
    @property({type:String})
    text='Hello,Web Component'

    @property({type:String})
    color='#222'
    static style=css`
    :host{

    }
    `
    render(){
        return html`
            <span style="color:${this.color};">${this.text}</span>
        `
    }
}
在main.ts 里导入
export {Hello} from "./hello/index"
打包输出结果

lit-web-components.umd.js 16.92 kB │ gzip: 6.44 kB
注意:这里包含了lit 本身这个库,

使用

打包构建带入lit本身的库(建议) ,使用就很简单了

 引入
<script src="./js/lit-web-components.umd.js"></script>    
使用
<xk-hello color="red"> </xk-hello> </br>
<xk-hello text="hello world"> </xk-hello>

输出效果和Dom

image

实际应用和思考

web component 可以为传统的老项目注入现代化开发能力,Lit 则大大减轻了这个过程,经过我在项目中的深入使用,明显带来的好处

  • 样式隔离: 自带的样式隔离和行为,不会被之前的公共css等影响。减少了心智负担
  • 复用:沉淀了一大批组件,快速构建页面,统一了整站的交互性和ui 一致性。
  • 跨框架: 后续升级框架时,之前的组件依然能用。减少了升级成本,还能保持原来的ui细节。

缺点

  • 额外的学习成本:可以使用ai 来开发维护
  • SEO影响 对于组件内部的一些隐藏属性,可能会影响SEO:建议增加描述,关键内容通过Slot可以消除

总结

如果无法对大型项目重构,大型项目开发起来又很痛苦,尝试webcomponent 方案吧。升级平滑,组件复用,还有样式隔离,插槽等现代化概念。

内容概要:本文详细介绍了一个基于C++的养老院管理系统的设计与实现,旨在应对人口老龄化带来的管理挑战。系统通过整合住户档案、健康监测、护理计划、任务调度等核心功能,构建了从数据采集、清洗、AI风险预测到服务调度与可视化的完整技术架构。采用C++高性能服务端结合消息队列、规则引擎和机器学习模型,实现了健康状态实时监控、智能任务分配、异常告警推送等功能,并解决了多源数据整合、权限安全、老旧硬件兼容等实际问题。系统支持模块化扩展与流程自定义,提升了养老服务效率、医护协同水平和住户安全保障,同时为运营决策提供数据支持。文中还提供了关键模块的代码示例,如健康指数算法、任务调度器和日志记录组件。; 适合人群:具备C++编程基础,从事软件开发或系统设计工作1-3年的研发人员,尤其是关注智慧养老、医疗信息系统开发的技术人员。; 使用场景及目标:①学习如何在真实项目中应用C++构建高性能、可扩展的管理系统;②掌握多源数据整合、实时健康监控、任务调度与权限控制等复杂业务的技术实现方案;③了解AI模型在养老场景中的落地方式及系统架构设计思路。; 阅读建议:此资源不仅包含系统架构与模型描述,还附有核心代码片段,建议结合整体设计逻辑深入理解各模块之间的协同机制,并可通过重构或扩展代码来加深对系统工程实践的掌握。
内容概要:本文详细介绍了一个基于C++的城市交通流量数据可视化分析系统的设计与实现。系统涵盖数据采集与预处理、存储与管理、分析建模、可视化展示、系统集成扩展以及数据安全与隐私保护六大核心模块。通过多源异构数据融合、高效存储检索、实时处理分析、高交互性可视化界面及模块化架构设计,实现了对城市交通流量的实时监控、历史趋势分析与智能决策支持。文中还提供了关键模块的C++代码示例,如数据采集、清洗、CSV读写、流量统计、异常检测及基于SFML的柱状图绘制,增强了系统的可实现性与实用性。; 适合人群:具备C++编程基础,熟悉数据结构与算法,有一定项目开发经验的高校学生、研究人员及从事智能交通系统开发的工程师;适合对大数据处理、可视化技术和智慧城市应用感兴趣的技术人员。; 使用场景及目标:①应用于城市交通管理部门,实现交通流量实时监测与拥堵预警;②为市民出行提供路径优化建议;③支持交通政策制定与信号灯配时优化;④作为智慧城市建设中的智能交通子系统,实现与其他城市系统的数据协同。; 阅读建议:建议结合文中代码示例搭建开发环境进行实践,重点关注多线程数据采集、异常检测算法与可视化实现细节;可进一步扩展机器学习模型用于流量预测,并集成真实交通数据源进行系统验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值