蓝戒博客

  • 首页
  • 研发说
  • 架构论
  • 效能录
  • AI谈
  • 随笔集
智构苍穹
融合 AI、架构与工程实践,沉淀方法论,构建可持续的技术价值。
  1. 首页
  2. 研发说
  3. 正文

基于 Lit 框架开发 Web Component 组件的完整实践

2025年10月6日 1116点热度 2人点赞 0条评论

一、背景与目标

在现代前端体系中,Web Components 已成为跨框架共享 UI 组件的核心标准。
它基于浏览器原生能力(Custom Elements、Shadow DOM、HTML Templates、ES Modules),不依赖于特定框架,如 React 或 Vue,可在任意框架项目中直接使用。

而 Lit 框架(前身为 lit-html / lit-element)是 Google 官方推出的轻量级开发工具库,帮助开发者以简洁的方式构建符合 Web Components 标准的组件,拥有以下特点:

  • 极小的运行时(≈ 5KB gzipped);
  • 支持响应式属性绑定与模板更新;
  • 与原生浏览器能力高度兼容;
  • 可直接编译输出为可复用组件库。

本篇文章将带你从 0 到 1 构建一套基于 Lit 框架的 Web Component 组件库工程,并实现以下目标:

  • ✅ 搭建标准化的组件开发工程;
  • ✅ 通过 11ty (Eleventy) 搭建组件文档网站;
  • ✅ 使用 @custom-elements-manifest/analyzer 自动生成组件 API 文档;
  • ✅ 引入 Plop.js + AI 大模型测试生成方案;
  • ✅ 输出可在任意前端框架中使用的组件包。

二、项目结构规划

我们采用 monorepo + 文档站 模式,将组件源代码与文档系统独立管理:

├── packages/
│   ├── yc-button/
│   │   ├── src/
│   │   │   ├── YcButton.ts
│   │   │   └── style.css
│   │   ├── index.ts
│   │   └── package.json
│   └── yc-card/
│       ├── src/
│       └── index.ts
├── docs-src/
│   ├── index.md
│   ├── components/
│   │   ├── button.md
│   │   └── card.md
│   ├── plugin/
│   │   └── eleventy-plugin-code-demo.cjs
│   ├── docs.css
│   └── .nojekyll
├── .eleventy.cjs
├── package.json
└── tsconfig.json

三、搭建基础工程

1. 初始化项目

Bash
mkdir lit-webcomponent-lib && cd lit-webcomponent-lib
npm init -y
npm install lit typescript @webcomponents/webcomponentsjs

2. 创建 tsconfig.json

JSON
{
  "compilerOptions": {
    "target": "ES2021",
    "module": "ESNext",
    "moduleResolution": "Node",
    "outDir": "dist",
    "declaration": true,
    "emitDecoratorMetadata": false,
    "experimentalDecorators": true,
    "esModuleInterop": true
  },
  "include": ["packages/**/*.ts"]
}

四、编写第一个组件

以 yc-button 为例:

TypeScript
// packages/yc-button/src/YcButton.ts
import { LitElement, html, css } from 'lit';
import { customElement, property } from 'lit/decorators.js';

@customElement('yc-button')
export class YcButton extends LitElement {
  static styles = css`
    button {
      padding: 8px 16px;
      background-color: var(--yc-btn-bg, #007bff);
      border: none;
      border-radius: 4px;
      color: #fff;
      cursor: pointer;
    }
    button:hover {
      background-color: var(--yc-btn-hover, #0056b3);
    }
  `;

  @property({ type: String }) label = '按钮';

  render() {
    return html`<button><slot>${this.label}</slot></button>`;
  }
}

declare global {
  interface HTMLElementTagNameMap {
    'yc-button': YcButton;
  }
}

导出组件入口:

TypeScript
// packages/yc-button/index.ts
export * from './src/YcButton.js';

五、自动化文档系统搭建

文档系统采用 11ty (Eleventy) 构建。
它是一款极轻量静态网站生成器,使用 Markdown + 模板语法快速生成静态页面,非常适合 Web Component 文档场景。

1. 安装依赖

Bash
npm install @11ty/eleventy @11ty/eleventy-plugin-syntaxhighlight

2. 创建 .eleventy.cjs 配置文件

JavaScript
// .eleventy.cjs
const syntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight');
const codeDemoPlugin = require("./docs-src/plugin/eleventy-plugin-code-demo.cjs");

module.exports = function (eleventyConfig) {
  eleventyConfig.addPlugin(syntaxHighlight);
  eleventyConfig.addPlugin(codeDemoPlugin);
  eleventyConfig.addPassthroughCopy('docs-src/docs.css');
  eleventyConfig.addPassthroughCopy('docs-src/.nojekyll');
  eleventyConfig.addPassthroughCopy(
    'node_modules/@webcomponents/webcomponentsjs'
  );
  eleventyConfig.addPassthroughCopy('node_modules/lit/polyfill-support.js');
  
  return {
    dir: {
      input: 'docs-src',
      output: 'docs',
    },
    templateExtensionAliases: {
      '11ty.cjs': '11ty.js',
      '11tydata.cjs': '11tydata.js',
    },
  };
};

3. 编写文档模板示例

在 docs-src/components/button.md 中添加组件文档内容:

Markdown
---
title: YcButton 按钮组件
layout: base.njk
---

# `<yc-button>` 按钮组件

用于触发用户操作的基础按钮组件。

## 示例

```html
<yc-button label="点击我"></yc-button>

属性 (Props)

属性名类型默认值说明
labelstring'按钮'按钮文字

样式变量

变量名说明
--yc-btn-bg按钮背景色
--yc-btn-hover悬停背景色
JavaScript

其中 `<code-demo>` 标签由 `eleventy-plugin-code-demo.cjs` 提供,用于在 Markdown 中嵌入组件预览。

示例插件(简化版):

```js
// docs-src/plugin/eleventy-plugin-code-demo.cjs
module.exports = (eleventyConfig) => {
  eleventyConfig.addPairedShortcode("code-demo", (content) => {
    return `<div class="demo">${content}</div>
<pre><code>${content.replace(/</g, "<").replace(/>/g, ">")}</code></pre>`;
  });
};

六、组件 API 自动化生成

通过 @custom-elements-manifest/analyzer 工具自动提取组件属性、事件、插槽信息,生成标准的 custom-elements.json。

安装与使用

Bash
npm install @custom-elements-manifest/analyzer --save-dev

在项目根目录添加 analyze.mjs:

JavaScript
import { analyze } from '@custom-elements-manifest/analyzer';
import fs from 'fs';

const result = await analyze({
  globs: ['packages/**/src/*.ts'],
});

fs.writeFileSync(
  'custom-elements.json',
  JSON.stringify(result, null, 2)
);

运行命令:

Bash
node analyze.mjs

生成后的 custom-elements.json 将被 Eleventy 文档系统读取并展示 API。


七、引入 Plop.js + AI 生成测试用例方案

在大型组件库中,重复编写单测文件成本高,因此引入 Plop.js 模板引擎 + AI 自动生成逻辑测试代码。

1. 安装依赖

Bash
npm install plop @types/node --save-dev

2. 新建 plopfile.cjs

JavaScript
module.exports = function (plop) {
  plop.setGenerator('test', {
    description: '生成组件测试文件',
    prompts: [
      {
        type: 'input',
        name: 'component',
        message: '请输入组件名称:',
      },
    ],
    actions: [
      {
        type: 'add',
        path: 'packages/{{component}}/test/{{component}}.spec.ts',
        templateFile: 'plop-templates/test.hbs',
      },
    ],
  });
};

3. 模板文件示例

TypeScript
// packages/{{component}}/test/{{component}}.spec.ts
import { fixture, html } from '@open-wc/testing';
import '../src/{{component}}.js';

describe('{{component}}', () => {
  it('should render properly', async () => {
    const el = await fixture(html`<{{component}}></{{component}}>`);  
    expect(el).to.exist;
  });
});

4. 结合 AI 生成逻辑性用例

通过内部大模型 API(如 OpenAI GPT)分析组件 @property 属性与 DOM 行为,生成更多逻辑测试用例:

Bash
npx plop test

执行后输入组件名,如 yc-button,即可自动生成并补全测试文件内容。


八、构建与发布

构建组件库

使用 tsc 直接编译:

Bash
npx tsc

输出结果将包含 dist/ 目录内的所有 Web Components。

发布至 npm

Bash
npm publish --access public

九、总结与展望

本文完整介绍了从 Lit + Web Components 工程搭建 → Eleventy 文档系统 → 自动化测试方案 → API 生成 的全链路实践。

通过这套体系,你可以:

  • 轻松构建高复用组件;
  • 输出清晰的自动化文档;
  • 快速生成测试样例;
  • 实现跨框架复用(Vue、React、Angular、纯 HTML)。

未来可进一步扩展:

  • 自动生成 Demo 预览组件;
  • 集成 Storybook 或 VitePress;
  • 使用 GitHub Actions 实现文档自动部署。

✅ 项目亮点回顾

模块技术功能
组件开发Lit构建标准化 Web Component
文档系统Eleventy + Markdown自动生成静态文档
代码高亮@11ty/eleventy-plugin-syntaxhighlight提升可读性
组件演示自定义 code-demo 插件可交互 Demo
API 自动化@custom-elements-manifest/analyzer自动提取组件属性
测试体系Plop.js + AI自动生成单测模板

🔗 参考资料

  • Lit 官方文档
  • 11ty 官方文档
  • Custom Elements Manifest
  • Plop.js 文档
标签: Eleventy Lit Plop.js Web Components
最后更新:2025年10月6日

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

最新 热点 随机
最新 热点 随机
狂揽 32 万 Star,让 AI 智能体帮你“逆向一切”:深度拆解 GitHub 现象级神器 morluto/rea 与 6 大最佳实践 OpenCode 曝 1.4% 用户密钥失窃,揭秘黑客“对抗性蒸馏”黑产! Claude 全面开放 OTel 追踪、Cohere 鲸吞 500 漏洞猎手:AI 智能体彻底告别“黑盒裸奔”! 不用显卡、普通 CPU 140 毫秒出结果!Mistral 突发开源 209M 时序模型 Timestral,横扫三大权威榜单 Meta Muse 被“开源复刻”?深度拆解 5000 星 OpenMuse:架构很香,但这 3 个暗坑必须看清 智谱 GLM-Legal 反超 Claude 与 Kimi:18B 激活参数凭什么啃下最严苛法律评测?
不讲废话的 AI 估值 2 亿美元!全面拆解“系统一”决策模型 Jev:70ms 极速响应与工业级实战白嫖 10 亿 Token 与云端虚拟机!Meta Muse 国内成功注册保姆级指南:手把手教你跳过排队请3天休13天!我用火山引擎 Seed-2.1-pro搓了个《国庆旅行模拟器》小游戏宿敌破天荒联手!OpenAI 与 Anthropic 互相“查水表”,Google 证实 Agent 越狱渗透:AI 正在失控边缘?波及 13.4 万智能体!首个零点击 RCE 漏洞 Plugin4Shell 爆发:你锁定的插件正在偷偷黑掉你的电脑阿里开源 OpenCodeReview:给大模型套上“工程缰绳”的代码审查神器
一条命令操控网站:OpenCLI 会是自动化的下一步吗? 吊打前代Plus!阿里Qwen3.8-27B开源:4G显存可跑 🔥 狂揽 51.5k Star!这款名为 GSD 的神器,专治 AI 写代码"越写幻觉越严重" 吃透大文件分片上传:原理、方案与最佳实践 Three.js 3D 可视化项目实战:从快速启动到性能优化全攻略 一个人活成一支军队!YC总裁开源的 gstack 到底是个什么神仙工具?
最近评论
cywcd 发布于 4 周前(09月22日) 《牛来跑酷》游戏链接地址已更新: 1. Gemini 3.7 Flash 版 牛来跑酷: htt...
渔夫 发布于 12 个月前(11月05日) 学到了,感谢博主分享
沙拉小王子 发布于 9 年前(11月30日) 适合vue入门者学习,赞一个
沙拉小王子 发布于 9 年前(11月30日) 适合vue入门者学习,赞一个
cywcd 发布于 10 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8

COPYRIGHT © 2025 蓝戒博客_智构苍穹-专注于大前端领域技术生态. ALL RIGHTS RESERVED.

京ICP备12026697号-2