Web Components:原生组件化开发新趋势 —— 一个老广程序员的实战血泪史

出色_算法
2025-12-17 07:31
阅读 939

大家好,我是阿强,坐标广州西门口,老城区土生土长的老广。去年十月,我终于从一家外包公司跳槽进了甲方——一家做区块链供应链金融的金融科技公司,月薪从15k涨到22k,房租还是3500(感谢爸妈早年在荔湾买的房子)。这事儿听起来挺爽,但只有我自己知道,那三个月差点把我熬成“人干”。

今天不聊跳槽秘籍,也不吹区块链多牛X,就想和大家聊聊最近在项目里踩的一个坑:Web Components。对,就是那个被React/Vue圈子里很多人当“古董”的原生组件技术。结果你猜怎么着?它居然成了我们项目的救命稻草。


起因:甲方爸爸的“混搭”需求

事情得从去年底说起。我们公司要做一个给上下游企业用的区块链数据可视化平台。前端团队原本是纯React栈,UI库用的是Ant Design,后端是Java + Spring Boot(毕竟我是Java出身嘛,看到Spring就亲切)。

一切都很顺利,直到某天产品经理老李(人称“需求永动机”)拉着我和前端组长阿杰开会。

“强哥,有个新需求,”老李推了推眼镜,“客户那边要用我们的组件嵌入他们自己的老系统,而且他们的系统是Angular写的,还有几个页面甚至是jQuery时代的遗物。”

我一听就懵了:“嵌入?跨框架?他们自己不能调API自己画吗?”

老李苦笑:“人家说你们不是搞区块链的吗?高大上一点,能不能做个‘即插即用’的组件?就像微信小程序那样,丢个<blockchain-tx-viewer>进去就能跑。”

阿杰当场翻白眼:“React组件怎么可能直接塞进Angular里?除非……用iframe?”

但iframe性能差、通信麻烦,还容易出安全问题。老板一听要加iframe,直接摇头:“不行,体验太割裂。”

那几天我晚上回家吃饭都没胃口,老婆看我愁眉苦脸,还问我是不是又想跳槽了。我说:“不是跳槽,是快被需求逼疯了。”


转机:深夜刷GitHub时的一道光

上周五晚上,我加班到十点,泡了杯王老吉(老广的续命水),瘫在工位上刷GitHub Trending,想找点灵感。突然看到一个仓库叫 web-components-for-enterprise,点进去一看——原生Web Components实现的可复用UI组件,不依赖任何框架,直接通过HTML标签使用。

我脑子“嗡”一下:这不就是我们要的东西吗?

Web Components 是浏览器原生支持的组件化标准,由三个核心技术组成:

  • Custom Elements:自定义HTML标签
  • Shadow DOM:封装样式和DOM,避免污染全局
  • HTML Templates:声明式模板

最关键的是——它和框架无关!不管是React、Vue、Angular,还是纯HTML,只要浏览器支持(现代浏览器基本都行),就能直接用。

我立马拉阿杰过来:“你看这个,是不是能解决老李的问题?”

阿杰一开始嗤之以鼻:“Web Components?那不是十年前就有的东西吗?现在谁还用?React Hooks不好玩?”

我说:“别管新旧,能解决问题的就是好技术。而且,咱们不是要做‘区块链+’嘛,总不能连个组件都跨不出去吧?”

他沉默了三秒,然后说:“行,你写个demo试试,下周一晨会前给我看。”


实战:从零写一个区块链交易查看器

周末两天,我关掉手机,窝在家里捣鼓。目标很明确:做一个 <blockchain-tx-viewer tx-id="0xabc..."> 组件,传入交易ID,自动拉取链上数据并渲染。

第一步:定义Custom Element

class BlockchainTxViewer extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: 'open' });
  }

  static get observedAttributes() {
    return ['tx-id'];
  }

  attributeChangedCallback(name, oldValue, newValue) {
    if (name === 'tx-id' && newValue) {
      this.render(newValue);
    }
  }

  async render(txId) {
    const data = await fetchBlockchainData(txId); // 模拟API调用
    this.shadowRoot.innerHTML = `
      <style>
        .container { padding: 16px; border: 1px solid #ddd; }
        .tx-id { font-family: monospace; }
      </style>
      <div class="container">
        <p>交易ID: <span class="tx-id">${txId}</span></p>
        <p>状态: ${data.status}</p>
        <p>时间: ${new Date(data.timestamp).toLocaleString()}</p>
      </div>
    `;
  }
}

customElements.define('blockchain-tx-viewer', BlockchainTxViewer);

第二步:在React中使用

在React组件里,直接当普通HTML标签用:

function App() {
  return (
    <div>
      <h1>我们的React App</h1>
      {/* 直接使用Web Component */}
      <blockchain-tx-viewer tx-id="0x1234567890abcdef"></blockchain-tx-viewer>
    </div>
  );
}

第三步:交付给客户

我把打包后的JS文件发给客户,他们只需要在页面里加两行代码:

<script src="blockchain-tx-viewer.js"></script>
<blockchain-tx-viewer tx-id="0xabcdef..."></blockchain-tx-viewer>

搞定!无论他们用什么框架,甚至纯静态页,都能跑。


吐槽与反思:为什么我们之前忽略了它?

说实话,写完demo后我自己都震惊了——这么简单?但转念一想,也难怪我们以前不用。

原因一:生态惯性
React/Vue太香了,状态管理、路由、SSR一条龙,谁还回去写原生JS?我在外包那三年,项目清一色React,连jQuery都懒得碰,更别说Web Components这种“冷门货”。

原因二:开发体验不够友好
没有JSX,没有热更新,调试靠console.log,Shadow DOM还让DevTools看元素变得有点绕。写起来确实不如React舒服。

原因三:误解“过时”
很多人以为Web Components是“被淘汰的技术”,其实不然。Google的Material Web Components、GitHub的<details-dialog>都是基于它。甚至Stencil、Lit这些现代库都在优化它的开发体验。

但这次实战让我明白:技术没有新旧,只有合不合适


Web Components vs React:不是对立,是互补

有人可能会问:“既然React这么强,干嘛还要Web Components?”

我的答案是:场景不同

  • 如果你在构建一个完整的单页应用(SPA),React/Vue依然是首选,生态、工具链、团队熟悉度都碾压。
  • 但如果要做可复用的微前端模块、跨框架组件、或嵌入第三方系统的“小部件”,Web Components就是王者。

就像我们这个区块链项目——核心平台用React,但对外交付的组件用Web Components,两边各司其职,互不干扰。

甚至,你可以在React内部封装Web Components,做成公司的UI资产库,供所有产品线调用。我们已经开始这么干了。


给同行的建议:别把鸡蛋放一个篮子里

作为从外包杀进甲方的老广程序员,我最大的感悟就是:技术视野比框架熟练度更重要

外包那三年,我只会CRUD + 调API,以为会React就能横着走。结果面试甲方时,被问到“如何实现跨框架组件共享”,当场卡壳。那次失败让我意识到:光会用轮子不行,得懂轮子怎么造。

所以,如果你也在焦虑“React会不会被取代”“要不要学新框架”,我的建议是:

  1. 先精通一个主流框架(比如React),这是你的饭碗;
  2. 再了解底层原理(比如DOM、事件、模块化),这是你的护城河;
  3. 最后尝试跨界技术(比如Web Components、微前端),这是你的差异化优势。

顺便说一句,我现在工资涨了,但压力一点没少。不过至少,我不再怕产品经理说“能不能做个通用组件”了。


结语:老广程序员的务实哲学

在广州,我们老广讲究“识做”——懂得怎么做,更懂得什么时候该用什么方法。煲汤要老火,炒菜要镬气,写代码也一样:该用React时绝不手软,该上Web Components时也别扭捏。

Web Components或许不是下一个“风口”,但它绝对是一个被低估的实用工具。尤其在微前端、低代码平台、B端嵌入式场景中,它的价值正在被重新发现。

所以,别再说它“过时”了。技术圈的潮流像珠江的水,来来回回,但真正能解决问题的,永远有它的位置。

最后,如果你也在广州做开发,欢迎约茶(不是奶茶,是早茶)。我们可以边啃虾饺边聊Web Components怎么优化Shadow DOM性能——当然,账你付,我刚涨薪,得省着点花。


P.S. 我整理了一份超简明的《Web Components实战教程》,包含区块链交易组件完整代码 + React集成示例,放在GitHub上了。搜 guangzhou-web-components-demo 就能找到。觉得有用的话,给个star,让我老婆知道我没白加班 😅

P.P.S. 区块链项目还在招Java后端,要求不高,会Spring Boot + 对新技术有好奇心就行。有意私聊,内推成功请你喝凉茶(包治百病那种)。

评论 0

最热最新
暂无评论
出色_算法Lv.1
0
影响力
0
文章
0
粉丝