面向 Aura 开发者的 Lightning Web Components

Aura 开发者通向 LWC 的迁移指南。本文讲解 Aura 与 LWC 的共存策略(叶子优先、按需迁移、不强制重写),以及完整的迁移映射:Markup 语法转换(aura:attribute→@api、{!v.}→{}、aura:if→lwc:if、aura:iteration→for:each)、JavaScript 迁移(ltng:require→ES Modules、代码共享、第三方库、动态创建的声明式替代)、数据访问(force:recordData→record-form/@wire/LDS 函数)、组件组合(facets→slots)、以及事件通信(composed: true 的 DOM CustomEvent 穿透 Shadow DOM),实现平滑过渡。...

📅 2026/10/5 ✍️ ponybai 🏷️ salesforce, developer, lwc, aura, headless

一、理解 LWC 与 Aura 共存

slide_2

如果你投入时间精通 Aura,本模块是你通向未来的桥梁。学习 Aura 概念如何映射到 LWC——从 .cmp 迁移到 .html、Aura 表达式转标准 JavaScript、组件事件替换为 DOM CustomEvent、数据访问和组件组合的新模式。

为什么选择 LWC?它能和 Aura 组件共存吗?

slide_3

Aura 多年前构建,当时组件的 Web 标准还不存在;LWC 建立在现在存在的 W3C Web Components 标准上。LWC 优势:现代 JavaScript(ES6+)、更快渲染(浏览器原生执行)、更少代码(更简单模式、每组件更少文件)、技能可迁移(标准 JS/HTML/CSS)。

共存——它们协同工作:Aura 组件可以包含 Lightning web components(把新 LWC 包进现有 Aura 应用框架);LWC 不能包含 Aura 组件(但可通过事件通信);两者共享同一 org、数据、安全模型。

迁移策略——不要一次性重写:① 新功能用 LWC 构建 ② 需要大幅修改 Aura 组件时顺便迁移 ③ 稳定工作的 Aura 组件留着(无限期继续工作)④ 从叶子组件(无子组件,依赖最少)向内迁移。迁移是旅程而非「flag day」,两者无限期共存,在增加价值时才迁移。

二、迁移 Markup 与 CSS

slide_4

动手迁移的核心:把 Aura markup 转 LWC HTML、Aura 表达式和条件转标准 HTML 语法、aura:iteration 替换为 for:each、迁移 CSS。

Aura Markup → LWC HTML:语法转换

slide_5

文件结构:Aura(.cmp + Controller.js + Helper.js + Style.css)→ LWC(.html + .js + .css,仅 2-3 文件)。关键语法迁移:

  • 属性 → JS 属性:<aura:attribute> → @api property;。
  • 表达式:{!v.xxx} → {xxx}(去掉 !v.)。
  • 条件:aura:if → lwc:if 或 if:true|false。
  • 迭代:aura:iteration → for:each(必须加唯一 key)。
  • 初始化:aura:handler name="init" → connectedCallback()。
  • 复杂表达式:{!v.price > 500000 && v.bedrooms >= 3} → 移到 JavaScript getter(get isLuxury() {...}),用 {isLuxury}。

CSS 迁移:THIS.css → 同名 .css 文件,但由 Shadow DOM 作用域,无样式泄漏,SLDS class 两种模型同样适用。

三、迁移 JavaScript——模块、代码共享与重构

slide_6

Aura 用专有模块系统(ltng:require),LWC 用标准 ES Modules(import/export)。覆盖 Aura 与 LWC 间共享代码、第三方 JS 库、以及为什么迁移是重构的绝佳机会。

LWC 中的 JavaScript:模块、共享与简化

slide_7

ES Modules 替代 Aura 专有系统:import { helper } from 'c/myModule'(标准 JS import,IDE 能理解)。迁移期间共享代码:把共享逻辑抽到独立 ES module,Aura 和 LWC 都 import;用 Lightning Message Service(LMS)做过渡期跨模型通信。

第三方 JS 库:上传为 Static Resource → import d3 from '@salesforce/resourceUrl/d3';大库用 loadScript() 动态加载。动态组件创建:Aura $A.createComponent() → LWC 无直接等价物,改用 lwc:if/if:true|false 声明式条件渲染(声明式优于命令式)。

迁移即重构:Aura 分离的 Controller.js/Helper.js → LWC 单个 .js 文件,函数组织更清晰;删除累积的死代码;有意区分 @api(公共)vs 普通属性(私有),隐藏实现细节。迁移不只是语法翻译——是构建更好组件的机会。

四、处理数据、组合组件与通信

slide_8

三个剩余的关键迁移:数据访问模式(force:recordData → @wire 和 record forms)、组件组合(Aura facets → LWC slots)、事件通信(Aura 专有事件 → DOM CustomEvent + pub-sub)。

数据、组合与事件——最后的迁移步骤

slide_9

数据访问:简单 CRUD force:recordData → lightning-record-*-form(LWC 零 JavaScript);读数据 → @wire(getRecord);写数据 → LDS 函数(createRecord/updateRecord/deleteRecord);自定义 Apex → 同样的 @AuraEnabled 方法(@wire 响应式读或命令式 DML)。

组件组合:Aura facets(<aura:set attribute="header">)→ LWC slots(<slot name="header">,未命名默认 slot 捕获其余)。

数据绑定关键差异:Aura 默认双向绑定(子组件变化自动传播到父,方便但产生难调试的链条);LWC 单向绑定(父传属性向下、子发事件向上,更明确、更可调试、更可预测)。

事件:Aura 组件事件 → CustomEvent(this.dispatchEvent() + bubbles: true);Aura 应用事件 → LMS pub-sub 模式。从 LWC 向包裹的 Aura 发事件:CustomEvent 带 bubbles: true, composed: true——composed: true 让事件穿透 Shadow DOM 边界到达 Aura 父组件。两者通过标准 DOM 事件通信,无需专有桥接。


文章来源:Trailhead - Lightning Web Components for Aura Developers