js-modern
Write modern JavaScript and TypeScript for Salesforce Commerce platforms.
Before Writing Code
Always fetch the latest official documentation BEFORE writing JavaScript:
- MDN JavaScript Reference: WebSearch "MDN JavaScript reference ES6 2026" and WebFetch official docs
- TypeScript Documentation: WebSearch "TypeScript handbook 2026" and WebFetch official docs
- Platform-Specific Docs: WebSearch for "Salesforce B2C Commerce server-side JavaScript API 2026" (SFCC), "PWA Kit JavaScript TypeScript 2026" (PWA Kit), or "Lightning Web Components JavaScript 2026" (LWC)
This ensures you're using the latest syntax, APIs, and best practices for each platform.
Conceptual Architecture
Platform Runtime Constraints
This is the most critical concept. Three Salesforce Commerce platforms have fundamentally different JavaScript runtimes:
| Constraint |
SFCC Server-Side |
PWA Kit |
LWC (B2B) |
| Engine |
Rhino (Java-based) |
Node.js + V8 |
Browser (V8/SpiderMonkey) |
| Module system |
CommonJS (require) |
ES Modules (import) |
ES Modules (import) |
| async/await |
Not supported |
Fully supported |
Fully supported |
| Promises |
Not supported |
Fully supported |
Fully supported |
| Template literals |
Limited contexts |
Fully supported |
Fully supported |
| Arrow functions |
Supported |
Supported |
Supported |
| Destructuring |
Supported |
Supported |
Supported |
| Optional chaining |
Not supported |
Supported |
Supported |
| Classes |
Not supported |
Supported |
Required (extends LightningElement) |
| Decorators |
Not applicable |
Not applicable |
Required (@api, @track, @wire) |
| DOM access |
Not applicable |
Standard DOM |
Shadow DOM only (Locker/LWS) |
SFCC Server-Side JavaScript
The Rhino engine imposes strict limitations. Every SFCC script must account for these:
- Use
var or let/const (recent versions) -- verify against your instance
- No
async/await, no Promise -- all I/O is synchronous
- No ES modules -- use
require('dw/...') and module.exports
- Access platform APIs via
dw.* namespace (e.g., dw/catalog/ProductMgr)
- Use
module.superModule for cartridge overlay inheritance
// Pattern: SFCC module import
var ProductMgr = require('dw/catalog/ProductMgr');
// Fetch live docs for dw.* API signatures
// Pattern: module.superModule extension
var base = module.superModule;
// Fetch live docs for superModule behavior
PWA Kit JavaScript/TypeScript
Full modern JavaScript and TypeScript are available:
| Feature |
Stack |
| React |
17+ with hooks |
| TypeScript |
Full support, recommended |
| Node.js SSR |
Server-side rendering |
| Commerce SDK |
commerce-sdk-isomorphic |
| Bundler |
Webpack with code splitting |
// Pattern: PWA Kit component with Commerce SDK
// Fetch live docs for useProducts hook API
import { useProducts } from '@salesforce/commerce-sdk-react';
LWC JavaScript Constraints
LWC uses modern ES modules but enforces security boundaries:
| Allowed |
Not Allowed |
ES modules (import/export) |
Direct window/document manipulation |
async/await, Promises |
eval(), Function() constructor |
| Template literals, destructuring |
Third-party DOM libraries (jQuery) |
@api, @track, @wire decorators |
setTimeout(string) |
this.template.querySelector() |
document.getElementById() |
NavigationMixin |
window.location = ... |
// Pattern: LWC component skeleton
// Fetch live docs for decorator behavior
import { LightningElement, api, wire } from 'lwc';
Module Systems Comparison
| System |
Syntax |
Platform |
| CommonJS |
require() / module.exports |
SFCC server-side |
| ES Modules |
import / export |
PWA Kit, LWC |
| SFCC Overlay |
module.superModule |
SFCC cartridge extension |
| SFCC Wildcard |
require('*/cartridge/...') |
Cross-cartridge resolution |
Best Practices
Platform Adaptation
- Always verify which JS features your target platform supports before coding
- SFCC: Use CommonJS, avoid async/await, leverage
dw.* API
- PWA Kit: Use full modern JS/TS, React hooks, Commerce SDK
- LWC: Use ES modules, decorators, respect Lightning Web Security
Code Quality
- Use
const by default, let when reassignment is needed, never var (except SFCC if required)
- Prefer modern array methods (
map, filter, reduce) over imperative loops
- Use optional chaining (
?.) and nullish coalescing (??) where supported
- Destructure to extract values for cleaner, more readable code
TypeScript (PWA Kit)
- Use TypeScript for type safety and better IDE support
- Leverage Commerce SDK types for API responses
- Use
Partial<T>, Pick<T>, Omit<T> for flexible type definitions
Fetch MDN, TypeScript handbook, and platform-specific Salesforce docs for exact syntax support and API signatures before implementing.
1---2name: js-modern-23description: Write modern JavaScript and TypeScript — ES6+ features, async/await, modules, destructuring, optional chaining, TypeScript types. Covers SFCC server-side JS (CommonJS, limited ES6), PWA Kit (full modern JS/TS), and LWC JavaScript (Lightning Locker constraints). Use when writing JavaScript for Salesforce Commerce.4---56# js-modern78Write modern JavaScript and TypeScript for Salesforce Commerce platforms.910## Before Writing Code1112Always fetch the latest official documentation BEFORE writing JavaScript:1314- **MDN JavaScript Reference**: WebSearch "MDN JavaScript reference ES6 2026" and WebFetch official docs15- **TypeScript Documentation**: WebSearch "TypeScript handbook 2026" and WebFetch official docs16- **Platform-Specific Docs**: WebSearch for "Salesforce B2C Commerce server-side JavaScript API 2026" (SFCC), "PWA Kit JavaScript TypeScript 2026" (PWA Kit), or "Lightning Web Components JavaScript 2026" (LWC)1718This ensures you're using the latest syntax, APIs, and best practices for each platform.1920## Conceptual Architecture2122### Platform Runtime Constraints2324This is the most critical concept. Three Salesforce Commerce platforms have fundamentally different JavaScript runtimes:2526| Constraint | SFCC Server-Side | PWA Kit | LWC (B2B) |27|-----------|-----------------|---------|------------|28| **Engine** | Rhino (Java-based) | Node.js + V8 | Browser (V8/SpiderMonkey) |29| **Module system** | CommonJS (`require`) | ES Modules (`import`) | ES Modules (`import`) |30| **async/await** | Not supported | Fully supported | Fully supported |31| **Promises** | Not supported | Fully supported | Fully supported |32| **Template literals** | Limited contexts | Fully supported | Fully supported |33| **Arrow functions** | Supported | Supported | Supported |34| **Destructuring** | Supported | Supported | Supported |35| **Optional chaining** | Not supported | Supported | Supported |36| **Classes** | Not supported | Supported | Required (extends LightningElement) |37| **Decorators** | Not applicable | Not applicable | Required (@api, @track, @wire) |38| **DOM access** | Not applicable | Standard DOM | Shadow DOM only (Locker/LWS) |3940### SFCC Server-Side JavaScript4142The Rhino engine imposes strict limitations. Every SFCC script must account for these:4344- Use `var` or `let`/`const` (recent versions) -- verify against your instance45- No `async`/`await`, no `Promise` -- all I/O is synchronous46- No ES modules -- use `require('dw/...')` and `module.exports`47- Access platform APIs via `dw.*` namespace (e.g., `dw/catalog/ProductMgr`)48- Use `module.superModule` for cartridge overlay inheritance4950```javascript51// Pattern: SFCC module import52var ProductMgr = require('dw/catalog/ProductMgr');53// Fetch live docs for dw.* API signatures54```5556```javascript57// Pattern: module.superModule extension58var base = module.superModule;59// Fetch live docs for superModule behavior60```6162### PWA Kit JavaScript/TypeScript6364Full modern JavaScript and TypeScript are available:6566| Feature | Stack |67|---------|-------|68| React | 17+ with hooks |69| TypeScript | Full support, recommended |70| Node.js SSR | Server-side rendering |71| Commerce SDK | `commerce-sdk-isomorphic` |72| Bundler | Webpack with code splitting |7374```typescript75// Pattern: PWA Kit component with Commerce SDK76// Fetch live docs for useProducts hook API77import { useProducts } from '@salesforce/commerce-sdk-react';78```7980### LWC JavaScript Constraints8182LWC uses modern ES modules but enforces security boundaries:8384| Allowed | Not Allowed |85|---------|-------------|86| ES modules (`import`/`export`) | Direct `window`/`document` manipulation |87| `async`/`await`, Promises | `eval()`, `Function()` constructor |88| Template literals, destructuring | Third-party DOM libraries (jQuery) |89| `@api`, `@track`, `@wire` decorators | `setTimeout(string)` |90| `this.template.querySelector()` | `document.getElementById()` |91| `NavigationMixin` | `window.location = ...` |9293```javascript94// Pattern: LWC component skeleton95// Fetch live docs for decorator behavior96import { LightningElement, api, wire } from 'lwc';97```9899### Module Systems Comparison100101| System | Syntax | Platform |102|--------|--------|----------|103| CommonJS | `require()` / `module.exports` | SFCC server-side |104| ES Modules | `import` / `export` | PWA Kit, LWC |105| SFCC Overlay | `module.superModule` | SFCC cartridge extension |106| SFCC Wildcard | `require('*/cartridge/...')` | Cross-cartridge resolution |107108## Best Practices109110### Platform Adaptation111- Always verify which JS features your target platform supports before coding112- SFCC: Use CommonJS, avoid async/await, leverage `dw.*` API113- PWA Kit: Use full modern JS/TS, React hooks, Commerce SDK114- LWC: Use ES modules, decorators, respect Lightning Web Security115116### Code Quality117- Use `const` by default, `let` when reassignment is needed, never `var` (except SFCC if required)118- Prefer modern array methods (`map`, `filter`, `reduce`) over imperative loops119- Use optional chaining (`?.`) and nullish coalescing (`??`) where supported120- Destructure to extract values for cleaner, more readable code121122### TypeScript (PWA Kit)123- Use TypeScript for type safety and better IDE support124- Leverage Commerce SDK types for API responses125- Use `Partial<T>`, `Pick<T>`, `Omit<T>` for flexible type definitions126127Fetch MDN, TypeScript handbook, and platform-specific Salesforce docs for exact syntax support and API signatures before implementing.