news 2026/4/18 7:38:11

使用Vite#x2B; Lit 构建webcomponent 组件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用Vite#x2B; 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

实际应用和思考

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

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

缺点

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

总结

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 20:56:58

好写作AI:从思绪到结构,一键生成清晰论文大纲

你是否曾面对空白文档&#xff0c;脑中想法万千却不知如何下笔组织&#xff1f;是否花费数小时反复调整论文结构&#xff0c;却总觉逻辑不顺&#xff1f;好写作AI全新功能——一键智能大纲生成&#xff0c;正是为破解这一核心难题而来。它帮你将飘散的思绪&#xff0c;瞬间转化…

作者头像 李华
网站建设 2026/4/11 10:05:30

从缺陷回溯到效能提升:如何构建高价值测试案例知识库

测试案例分析的常见困境与价值重估 在多数软件测试团队中&#xff0c;“测试案例分析”并非一个新名词&#xff0c;但其落地形态却常常流于形式。常见的场景是&#xff1a;在项目复盘会上&#xff0c;某个“经典的”或“严重的”Bug被匆匆回顾&#xff0c;讨论停留在“当时没想…

作者头像 李华
网站建设 2026/4/18 6:59:41

如何为多语言知识库配置翻译中间件?i18n支持扩展

如何为多语言知识库配置翻译中间件&#xff1f;i18n支持扩展 在一家跨国企业的技术支持团队中&#xff0c;一位巴西员工用葡萄牙语提问&#xff1a;“Como solicito acesso ao sistema interno?”——几乎同一时刻&#xff0c;另一位德国工程师也在系统中输入德语问题&#x…

作者头像 李华
网站建设 2026/4/2 5:47:30

如何一天内掌握Open-AutoGLM?高效学习路径图首次公开

第一章&#xff1a;Open-AutoGLM 使用教程Open-AutoGLM 是一个开源的自动化大语言模型调用框架&#xff0c;旨在简化与 GLM 系列模型的交互流程。通过该工具&#xff0c;开发者可以快速实现文本生成、指令解析、多轮对话管理等功能&#xff0c;适用于智能客服、自动化报告生成等…

作者头像 李华
网站建设 2026/4/17 13:25:21

PotPlayer播放器

Daum PotPlayer播放器是一款全能多媒体影音播放器,堪称Windows平台最强大的本地视频播放器.PotPlayer最新版拥有强劲播放引擎加速,支持DXVA,CUDA,QuickSync,多媒体播放器支持蓝光3D,其内置强大的编码器及滤镜/分离器,支持自定义添加解码器,对字幕的支持非常优秀,能兼容特效字幕…

作者头像 李华
网站建设 2026/4/18 2:04:40

华为云国际站代理商的ESW主要有什么作用呢?

华为云国际站代理商的 ESW&#xff08;企业交换机&#xff09;&#xff0c;核心是基于二层连接网关&#xff08;L2CG&#xff09;VXLAN 构建云 - 下大二层隧道&#xff0c;解决云上 / 云下子网重叠互通、业务无改 IP 无缝迁移、混合云组网与容灾等难题&#xff0c;是跨境 / 出海…

作者头像 李华